13constexpr uint32_t
fourCC(
const char a,
const char b,
const char c,
const char d)
15 return (a << 0) | (b << 8) | (c << 16) | (d << 24);
17constexpr uint32_t
fourCC(
char const str[5])
19 return fourCC(str[0], str[1], str[2], str[3]);
39 virtual size_t write(
const void* data,
size_t size) = 0;
40 virtual bool seek(uint64_t offset) {
return false; }
41 virtual uint64_t
tell()
const {
return 0; }
42 virtual size_t operator()(
const void* data,
size_t size) {
return write(data, size); }
47 virtual size_t read(
void* dest,
size_t size) = 0;
48 virtual bool seek(uint64_t offset) {
return false; }
49 virtual uint64_t
tell()
const {
return 0; }
50 virtual size_t operator()(
void* dest,
size_t size) {
return read(dest, size); }
60 size_t write(
const void* src,
size_t size)
override;
73 size_t read(
void* dest,
size_t size)
override;
85 size_t write(
const void* src,
size_t size)
override;
90uint64_t
AlignUpU64(uint64_t value, uint64_t alignment);
108 template <
typename T>
111 static_assert(std::is_trivially_copyable_v<T>);
112 CHECK_MSG(values.size() <= UINT32_MAX,
"FScene blob count exceeds uint32_t");
113 return AppendBytes(values.data(), values.size() *
sizeof(T),
114 static_cast<uint32_t
>(values.size()),
sizeof(T), codec);
127 template <
typename T>
130 static_assert(std::is_trivially_copyable_v<T>);
132 CHECK_MSG(blob.
count <= SIZE_MAX /
sizeof(T),
"FScene blob count exceeds size_t");
133 values.resize(
static_cast<size_t>(blob.
count));
134 return ReadBytes(blob, values.data(), values.size() *
sizeof(T), scratchAlloc);
137 template <
typename T>
161 FBlobRef AppendBytes(
const void* data,
size_t size, uint32_t count, uint32_t stride, uint64_t alignment = 16);
163 template <
typename T>
166 static_assert(std::is_trivially_copyable_v<T>);
167 CHECK_MSG(values.size() <= UINT32_MAX,
"Blob count exceeds uint32_t");
168 return AppendBytes(values.data(), values.size() *
sizeof(T),
169 static_cast<uint32_t
>(values.size()),
sizeof(T), alignment);
186 requires std::is_trivially_copyable_v<T>
188 writer(&obj,
sizeof(T));
192 requires std::is_trivially_copyable_v<T>
194 reader(&obj,
sizeof(T));
199 uint64_t count = str.size();
200 writer(&count,
sizeof(uint64_t));
202 writer(str.data(),
static_cast<size_t>(count));
207 reader(&count,
sizeof(uint64_t));
209 str.resize(
static_cast<size_t>(count));
211 CHECK(reader.
read(str.data(),
static_cast<size_t>(count)) ==
static_cast<size_t>(count));
217 uint64_t count = vec.size();
218 writer(&count,
sizeof(uint64_t));
219 if constexpr (std::is_trivially_copyable_v<T>)
220 writer(vec.data(), count *
sizeof(T));
223 for (
const auto& item : vec)
227template <
typename T,
typename... Args>
231 reader(&count,
sizeof(uint64_t));
232 CHECK_MSG(count <= SIZE_MAX,
"Vector is too large for this platform");
234 vec.reserve(
static_cast<size_t>(count));
235 if constexpr (std::is_trivially_copyable_v<T> &&
sizeof...(Args) == 0)
237 vec.resize(
static_cast<size_t>(count));
238 reader(vec.data(),
static_cast<size_t>(count) *
sizeof(T));
242 for (
size_t i = 0; i < static_cast<size_t>(count); i++)
244 T& item = vec.emplace_back(args...);
253 uint8_t hasValue = opt.has_value() ? 1 : 0;
258template <
typename T,
typename... Args>
261 uint8_t hasValue = 0;
265 opt.emplace(args...);
#define CHECK_MSG(expr, format_str,...)
#define GLOBAL_ALLOC
Definition Allocator.hpp:240
#define CHECK(expr)
Definition Logging.hpp:92
void EnsureMappedFileSize(MemoryMappedFile &file, uint64_t requiredSize)
Definition Serialization.cpp:77
FBlobCodec
Definition Serialization.hpp:22
uint64_t AlignUpU64(uint64_t value, uint64_t alignment)
Definition Serialization.cpp:7
void FDeserialize(FReader &r, T &obj)
Definition Serialization.hpp:191
constexpr uint32_t fourCC(const char a, const char b, const char c, const char d)
Definition Serialization.hpp:13
void FSerialize(FWriter &w, const T &obj)
Definition Serialization.hpp:185
Allocator interface (noexcept)
Definition Allocator.hpp:29
Definition MemoryMapped.hpp:15
Lock-free atomic primitives and implementations of data structures.
Definition Allocator.hpp:6
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:149
std::basic_string< char, std::char_traits< char >, StlDefaultAllocator< char > > String
Alias for std::basic_string<char>, without an explicit allocator constructor.
Definition Container.hpp:120
std::span< T > Span
Alias for std::span
Definition Container.hpp:62
Definition Serialization.hpp:119
Span< const unsigned char > payload
Definition Serialization.hpp:120
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:138
bool ReadArray(FBlobRef const &blob, Vector< T > &values, Allocator *scratchAlloc) const
Definition Serialization.hpp:128
Definition Serialization.hpp:27
uint32_t stride
Definition Serialization.hpp:32
uint64_t decodedSize
Definition Serialization.hpp:30
uint64_t offset
Definition Serialization.hpp:28
uint32_t count
Definition Serialization.hpp:31
uint64_t storedSize
Definition Serialization.hpp:29
FBlobCodec codec
Definition Serialization.hpp:33
Definition Serialization.hpp:94
Allocator * scratchAlloc
Definition Serialization.hpp:98
FBlobRef AppendArray(Vector< T > const &values, FBlobCodec codec=FBlobCodec::None)
Definition Serialization.hpp:109
uint64_t baseOffset
Definition Serialization.hpp:97
Span< unsigned char > Allocate(uint64_t size, uint64_t alignment, uint64_t &outPayloadOffset)
Definition Serialization.cpp:129
MemoryMappedFile & file
Definition Serialization.hpp:95
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:96
Definition Serialization.hpp:45
virtual ~FReader()=default
virtual uint64_t tell() const
Definition Serialization.hpp:49
virtual bool seek(uint64_t offset)
Definition Serialization.hpp:48
virtual size_t operator()(void *dest, size_t size)
Definition Serialization.hpp:50
virtual size_t read(void *dest, size_t size)=0
Definition Serialization.hpp:37
virtual size_t write(const void *data, size_t size)=0
virtual uint64_t tell() const
Definition Serialization.hpp:41
virtual bool seek(uint64_t offset)
Definition Serialization.hpp:40
virtual ~FWriter()=default
virtual size_t operator()(const void *data, size_t size)
Definition Serialization.hpp:42
std::optional with convenience Get()/GetIf() methods.
Definition Container.hpp:256
Definition Serialization.hpp:153
MemoryBlobSerializer(Vector< unsigned char > &payload)
Definition Serialization.hpp:156
FBlobDeserializer Deserializer() const
Definition Serialization.hpp:172
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:154
FBlobRef AppendArray(Vector< T > const &values, uint64_t alignment=16)
Definition Serialization.hpp:164
Definition Serialization.hpp:66
Span< const unsigned char > data
Definition Serialization.hpp:67
size_t read(void *dest, size_t size) override
Definition Serialization.cpp:54
uint64_t tell() const override
Definition Serialization.hpp:75
uint64_t offset
Definition Serialization.hpp:68
bool seek(uint64_t offset) override
Definition Serialization.cpp:69
Definition Serialization.hpp:54
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:55
uint64_t tell() const override
Definition Serialization.hpp:62
uint64_t offset
Definition Serialization.hpp:56
Definition Serialization.hpp:79
Span< unsigned char > data
Definition Serialization.hpp:80
size_t write(const void *src, size_t size) override
Definition Serialization.cpp:98
uint64_t offset
Definition Serialization.hpp:81
bool seek(uint64_t offset) override
Definition Serialization.cpp:112
uint64_t tell() const override
Definition Serialization.hpp:87