12constexpr uint32_t
fourCC(
const char a,
const char b,
const char c,
const char d)
14 return (a << 0) | (b << 8) | (c << 16) | (d << 24);
16constexpr uint32_t
fourCC(
char const str[5])
18 return fourCC(str[0], str[1], str[2], str[3]);
38 virtual size_t write(
const void* data,
size_t size) = 0;
39 virtual bool seek(uint64_t offset) {
return false; }
40 virtual uint64_t
tell()
const {
return 0; }
41 virtual size_t operator()(
const void* data,
size_t size) {
return write(data, size); }
46 virtual size_t read(
void* dest,
size_t size) = 0;
47 virtual bool seek(uint64_t offset) {
return false; }
48 virtual uint64_t
tell()
const {
return 0; }
49 virtual size_t operator()(
void* dest,
size_t size) {
return read(dest, size); }
59 size_t write(
const void* src,
size_t size)
override;
72 size_t read(
void* dest,
size_t size)
override;
84 size_t write(
const void* src,
size_t size)
override;
89uint64_t
AlignUpU64(uint64_t value, uint64_t alignment);
107 template <
typename T>
110 static_assert(std::is_trivially_copyable_v<T>);
111 CHECK_MSG(values.size() <= UINT32_MAX,
"FScene blob count exceeds uint32_t");
112 return AppendBytes(values.data(), values.size() *
sizeof(T),
113 static_cast<uint32_t
>(values.size()),
sizeof(T), codec);
126 template <
typename T>
129 static_assert(std::is_trivially_copyable_v<T>);
131 CHECK_MSG(blob.
count <= SIZE_MAX /
sizeof(T),
"FScene blob count exceeds size_t");
132 values.resize(
static_cast<size_t>(blob.
count));
133 return ReadBytes(blob, values.data(), values.size() *
sizeof(T), scratchAlloc);
136 template <
typename T>
160 FBlobRef AppendBytes(
const void* data,
size_t size, uint32_t count, uint32_t stride, uint64_t alignment = 16);
162 template <
typename T>
165 static_assert(std::is_trivially_copyable_v<T>);
166 CHECK_MSG(values.size() <= UINT32_MAX,
"Blob count exceeds uint32_t");
167 return AppendBytes(values.data(), values.size() *
sizeof(T),
168 static_cast<uint32_t
>(values.size()),
sizeof(T), alignment);
185 requires std::is_trivially_copyable_v<T>
187 writer(&obj,
sizeof(T));
191 requires std::is_trivially_copyable_v<T>
193 reader(&obj,
sizeof(T));
199 uint64_t count = vec.size();
200 writer(&count,
sizeof(uint64_t));
201 if constexpr (std::is_trivially_copyable_v<T>)
202 writer(vec.data(), count *
sizeof(T));
205 for (
const auto& item : vec)
209template <
typename T,
typename... Args>
213 reader(&count,
sizeof(uint64_t));
214 CHECK_MSG(count <= SIZE_MAX,
"Vector is too large for this platform");
216 vec.reserve(
static_cast<size_t>(count));
217 if constexpr (std::is_trivially_copyable_v<T> &&
sizeof...(Args) == 0)
219 vec.resize(
static_cast<size_t>(count));
220 reader(vec.data(),
static_cast<size_t>(count) *
sizeof(T));
224 for (
size_t i = 0; i < static_cast<size_t>(count); i++)
226 T& item = vec.emplace_back(args...);
235 uint8_t hasValue = opt.has_value() ? 1 : 0;
240template <
typename T,
typename... Args>
243 uint8_t hasValue = 0;
247 opt.emplace(args...);
#define GLOBAL_ALLOC
Definition Allocator.hpp:225
#define CHECK(expr)
Definition Logging.hpp:57
#define CHECK_MSG(expr, format_str,...)
Definition Logging.hpp:62
void EnsureMappedFileSize(MemoryMappedFile &file, uint64_t requiredSize)
Definition Serialization.cpp:77
FBlobCodec
Definition Serialization.hpp:21
uint64_t AlignUpU64(uint64_t value, uint64_t alignment)
Definition Serialization.cpp:7
void FDeserialize(FReader &r, T &obj)
Definition Serialization.hpp:190
constexpr uint32_t fourCC(const char a, const char b, const char c, const char d)
Definition Serialization.hpp:12
void FSerialize(FWriter &w, const T &obj)
Definition Serialization.hpp:184
General Purpose Allocator (GPA) interface.
Definition Allocator.hpp:24
Definition MemoryMapped.hpp:15
Lock-free atomic primitives and implementations of data structures.
Definition Allocator.hpp:5
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:130
std::span< T > Span
Alias for std::span
Definition Container.hpp:60
std::optional< T > Optional
Alias for std::optional
Definition Container.hpp:26
Definition Serialization.hpp:118
Span< const unsigned char > payload
Definition Serialization.hpp:119
bool ReadBytes(FBlobRef const &blob, void *dst, size_t size, Allocator *scratchAlloc) const
Definition Serialization.cpp:230
Span< const unsigned char > StoredBytes(FBlobRef const &blob) const
Definition Serialization.cpp:223
Vector< T > ReadArray(FBlobRef const &blob, Allocator *alloc=GLOBAL_ALLOC) const
Definition Serialization.hpp:137
bool ReadArray(FBlobRef const &blob, Vector< T > &values, Allocator *scratchAlloc) const
Definition Serialization.hpp:127
Definition Serialization.hpp:26
uint32_t stride
Definition Serialization.hpp:31
uint64_t decodedSize
Definition Serialization.hpp:29
uint64_t offset
Definition Serialization.hpp:27
uint32_t count
Definition Serialization.hpp:30
uint64_t storedSize
Definition Serialization.hpp:28
FBlobCodec codec
Definition Serialization.hpp:32
Definition Serialization.hpp:93
Allocator * scratchAlloc
Definition Serialization.hpp:97
FBlobRef AppendArray(Vector< T > const &values, FBlobCodec codec=FBlobCodec::None)
Definition Serialization.hpp:108
uint64_t baseOffset
Definition Serialization.hpp:96
Span< unsigned char > Allocate(uint64_t size, uint64_t alignment, uint64_t &outPayloadOffset)
Definition Serialization.cpp:129
MemoryMappedFile & file
Definition Serialization.hpp:94
FBlobRef AppendBytes(const void *data, size_t size, uint32_t count, uint32_t stride, FBlobCodec codec=FBlobCodec::None, uint64_t alignment=16)
Definition Serialization.cpp:149
uint64_t & writeOffset
Definition Serialization.hpp:95
Definition Serialization.hpp:44
virtual ~FReader()=default
virtual uint64_t tell() const
Definition Serialization.hpp:48
virtual bool seek(uint64_t offset)
Definition Serialization.hpp:47
virtual size_t operator()(void *dest, size_t size)
Definition Serialization.hpp:49
virtual size_t read(void *dest, size_t size)=0
Definition Serialization.hpp:36
virtual size_t write(const void *data, size_t size)=0
virtual uint64_t tell() const
Definition Serialization.hpp:40
virtual bool seek(uint64_t offset)
Definition Serialization.hpp:39
virtual ~FWriter()=default
virtual size_t operator()(const void *data, size_t size)
Definition Serialization.hpp:41
Definition Serialization.hpp:152
MemoryBlobSerializer(Vector< unsigned char > &payload)
Definition Serialization.hpp:155
FBlobDeserializer Deserializer() const
Definition Serialization.hpp:171
FBlobRef AppendBytes(const void *data, size_t size, uint32_t count, uint32_t stride, uint64_t alignment=16)
Definition Serialization.cpp:192
Vector< unsigned char > & payload
Definition Serialization.hpp:153
FBlobRef AppendArray(Vector< T > const &values, uint64_t alignment=16)
Definition Serialization.hpp:163
Definition Serialization.hpp:65
Span< const unsigned char > data
Definition Serialization.hpp:66
size_t read(void *dest, size_t size) override
Definition Serialization.cpp:54
uint64_t tell() const override
Definition Serialization.hpp:74
uint64_t offset
Definition Serialization.hpp:67
bool seek(uint64_t offset) override
Definition Serialization.cpp:69
Definition Serialization.hpp:53
bool seek(uint64_t offset) override
Definition Serialization.cpp:36
size_t write(const void *src, size_t size) override
Definition Serialization.cpp:19
Vector< unsigned char > & data
Definition Serialization.hpp:54
uint64_t tell() const override
Definition Serialization.hpp:61
uint64_t offset
Definition Serialization.hpp:55
Definition Serialization.hpp:78
Span< unsigned char > data
Definition Serialization.hpp:79
size_t write(const void *src, size_t size) override
Definition Serialization.cpp:98
uint64_t offset
Definition Serialization.hpp:80
bool seek(uint64_t offset) override
Definition Serialization.cpp:112
uint64_t tell() const override
Definition Serialization.hpp:86