2#include "gaia/config/config.h"
6#include "gaia/cnt/darray.h"
7#include "gaia/cnt/darray_ext.h"
11 enum class serialization_type_id : uint8_t;
15 static constexpr uint32_t SerializationBufferCapacityIncreaseSize = 128U;
17 template <
typename DataContainer>
19 class ser_buffer_binary_impl {
22 static constexpr uint32_t CapacityIncreaseSize = SerializationBufferCapacityIncreaseSize;
27 uint32_t m_dataPos = 0;
36 GAIA_NODISCARD uint32_t
bytes()
const {
37 return (uint32_t)m_data.size();
41 GAIA_NODISCARD
bool empty()
const {
42 return m_data.empty();
46 GAIA_NODISCARD
const auto* data()
const {
52 void reserve(uint32_t size) {
53 const auto nextSize = m_dataPos + size;
54 if (nextSize <=
bytes())
58 const auto newSize =
bytes() + size;
59 const auto newCapacity = ((newSize / CapacityIncreaseSize) * CapacityIncreaseSize) + CapacityIncreaseSize;
60 m_data.reserve(newCapacity);
65 void resize(uint32_t size) {
71 void seek(uint32_t pos) {
77 void skip(uint32_t size) {
82 GAIA_NODISCARD uint32_t tell()
const {
89 void save(T&& value) {
90 reserve((uint32_t)
sizeof(T));
92 const auto cnt = m_dataPos + (uint32_t)
sizeof(T);
93 if (cnt > m_data.size())
95 mem::unaligned_ref<T> mem((
void*)&m_data[m_dataPos]);
96 mem = GAIA_FWD(value);
98 m_dataPos += (uint32_t)
sizeof(T);
105 void save_raw(
const void* pSrc, uint32_t size, [[maybe_unused]] ser::serialization_type_id
id) {
112 const auto cnt = m_dataPos + size;
113 if (cnt > m_data.size())
115 memcpy((
void*)&m_data[m_dataPos], pSrc, size);
122 template <
typename T>
123 void load(T& value) {
124 GAIA_ASSERT(m_dataPos + (uint32_t)
sizeof(T) <=
bytes());
126 const auto& cdata = std::as_const(m_data);
127 value = mem::unaligned_ref<T>((
void*)&cdata[m_dataPos]);
129 m_dataPos += (uint32_t)
sizeof(T);
136 void load_raw(
void* pDst, uint32_t size, [[maybe_unused]] ser::serialization_type_id
id) {
140 GAIA_ASSERT(m_dataPos + size <=
bytes());
142 const auto& cdata = std::as_const(m_data);
143 memmove(pDst, (
const void*)&cdata[m_dataPos], size);
Array with variable size of elements of type.
Definition darray_impl.h:27
Same API as ser_buffer_binary, but backed by fully dynamic storage.
Definition ser_buffer_binary.h:161
Minimal in-memory binary serializer. It stores raw bytes only (no schema, versioning,...
Definition ser_buffer_binary.h:159
GAIA_NODISCARD uint32_t bytes(const T &data)
Calculates how many bytes data would need when serialized via ser::save. Useful when a destination st...
Definition ser_ct.h:88
void load(Reader &reader, T &data)
Read data using Reader at compile-time.
Definition ser_ct.h:112
void save(Writer &writer, const T &data)
Write data using Writer at compile-time.
Definition ser_ct.h:101