Blender V4.3
BKE_bake_items_serialize.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include "BLI_fileops.hh"
8#include "BLI_function_ref.hh"
9#include "BLI_serialize.hh"
10
11#include "BKE_bake_items.hh"
12
13namespace blender::bke::bake {
14
19struct BlobSlice {
20 std::string name;
22
23 std::shared_ptr<io::serialize::DictionaryValue> serialize() const;
24 static std::optional<BlobSlice> deserialize(const io::serialize::DictionaryValue &io_slice);
25};
26
31 public:
32 virtual ~BlobReader() = default;
33
38 [[nodiscard]] virtual bool read(const BlobSlice &slice, void *r_data) const = 0;
39
44 [[nodiscard]] virtual bool read_as_stream(const BlobSlice &slice,
45 FunctionRef<bool(std::istream &)> fn) const;
46};
47
52 protected:
54
55 public:
56 virtual ~BlobWriter() = default;
57
62 virtual BlobSlice write(const void *data, int64_t size) = 0;
63
70 virtual BlobSlice write_as_stream(StringRef file_extension,
71 FunctionRef<void(std::ostream &)> fn);
72
74 {
76 }
77};
78
83 private:
84 struct StoredByRuntimeValue {
89 int64_t sharing_info_version;
94 std::shared_ptr<io::serialize::DictionaryValue> io_data;
95 };
96
103
108 Map<uint64_t, BlobSlice> slice_by_content_hash_;
109
110 public:
112
119 [[nodiscard]] std::shared_ptr<io::serialize::DictionaryValue> write_implicitly_shared(
120 const ImplicitSharingInfo *sharing_info,
121 FunctionRef<std::shared_ptr<io::serialize::DictionaryValue>()> write_fn);
122
128 [[nodiscard]] std::shared_ptr<io::serialize::DictionaryValue> write_deduplicated(
129 BlobWriter &writer, const void *data, int64_t size_in_bytes);
130};
131
136 private:
140 mutable std::mutex mutex_;
145 mutable Map<std::string, ImplicitSharingInfoAndData> runtime_by_stored_;
146
147 public:
149
154 [[nodiscard]] std::optional<ImplicitSharingInfoAndData> read_shared(
155 const io::serialize::DictionaryValue &io_data,
156 FunctionRef<std::optional<ImplicitSharingInfoAndData>()> read_fn) const;
157};
158
163 private:
164 const std::string blobs_dir_;
165 mutable std::mutex mutex_;
166 mutable Map<std::string, std::unique_ptr<fstream>> open_input_streams_;
167
168 public:
169 DiskBlobReader(std::string blobs_dir);
170 [[nodiscard]] bool read(const BlobSlice &slice, void *r_data) const override;
171};
172
177 private:
179 std::string blob_dir_;
181 std::string base_name_;
182 std::string blob_name_;
184 std::fstream blob_stream_;
186 int64_t current_offset_ = 0;
188 int independent_file_count_ = 0;
189
190 public:
191 DiskBlobWriter(std::string blob_dir, std::string base_name);
192
193 BlobSlice write(const void *data, int64_t size) override;
194
195 BlobSlice write_as_stream(StringRef file_extension,
196 FunctionRef<void(std::ostream &)> fn) override;
197};
198
203 public:
205 std::unique_ptr<std::ostringstream> stream;
206 int64_t offset = 0;
207 };
208
209 private:
210 std::string base_name_;
211 std::string blob_name_;
212 Map<std::string, OutputStream> stream_by_name_;
213 int independent_file_count_ = 0;
214
215 public:
216 MemoryBlobWriter(std::string base_name);
217
218 BlobSlice write(const void *data, int64_t size) override;
219
220 BlobSlice write_as_stream(StringRef file_extension,
221 FunctionRef<void(std::ostream &)> fn) override;
222
224 {
225 return stream_by_name_;
226 }
227};
228
233 private:
234 Map<StringRef, Span<std::byte>> blob_by_name_;
235
236 public:
237 void add(StringRef name, Span<std::byte> blob);
238
239 [[nodiscard]] bool read(const BlobSlice &slice, void *r_data) const override;
240};
241
242void serialize_bake(const BakeState &bake_state,
243 BlobWriter &blob_writer,
244 BlobWriteSharing &blob_sharing,
245 std::ostream &r_stream);
246
247std::optional<BakeState> deserialize_bake(std::istream &stream,
248 const BlobReader &blob_reader,
249 const BlobReadSharing &blob_sharing);
250
251} // namespace blender::bke::bake
File and directory operations.
std::optional< ImplicitSharingInfoAndData > read_shared(const io::serialize::DictionaryValue &io_data, FunctionRef< std::optional< ImplicitSharingInfoAndData >()> read_fn) const
virtual bool read_as_stream(const BlobSlice &slice, FunctionRef< bool(std::istream &)> fn) const
virtual ~BlobReader()=default
virtual bool read(const BlobSlice &slice, void *r_data) const =0
std::shared_ptr< io::serialize::DictionaryValue > write_implicitly_shared(const ImplicitSharingInfo *sharing_info, FunctionRef< std::shared_ptr< io::serialize::DictionaryValue >()> write_fn)
std::shared_ptr< io::serialize::DictionaryValue > write_deduplicated(BlobWriter &writer, const void *data, int64_t size_in_bytes)
virtual BlobSlice write(const void *data, int64_t size)=0
virtual BlobSlice write_as_stream(StringRef file_extension, FunctionRef< void(std::ostream &)> fn)
virtual ~BlobWriter()=default
bool read(const BlobSlice &slice, void *r_data) const override
DiskBlobWriter(std::string blob_dir, std::string base_name)
BlobSlice write_as_stream(StringRef file_extension, FunctionRef< void(std::ostream &)> fn) override
BlobSlice write(const void *data, int64_t size) override
void add(StringRef name, Span< std::byte > blob)
bool read(const BlobSlice &slice, void *r_data) const override
const Map< std::string, OutputStream > & get_stream_by_name() const
BlobSlice write(const void *data, int64_t size) override
BlobSlice write_as_stream(StringRef file_extension, FunctionRef< void(std::ostream &)> fn) override
void serialize_bake(const BakeState &bake_state, BlobWriter &blob_writer, BlobWriteSharing &blob_sharing, std::ostream &r_stream)
std::optional< BakeState > deserialize_bake(std::istream &stream, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
__int64 int64_t
Definition stdint.h:89
std::shared_ptr< io::serialize::DictionaryValue > serialize() const
static std::optional< BlobSlice > deserialize(const io::serialize::DictionaryValue &io_slice)