2#include "gaia/config/config.h"
6#include "gaia/cnt/darray.h"
7#include "gaia/cnt/darray_ext.h"
8#include "gaia/cnt/impl/array_utils.h"
12 enum class serialization_type_id : uint8_t;
16 static constexpr uint32_t SerializationBufferCapacityIncreaseSize = 128U;
18 template <
typename DataContainer>
20 class ser_buffer_binary_impl {
23 static constexpr uint32_t CapacityIncreaseSize = SerializationBufferCapacityIncreaseSize;
28 uint32_t m_dataPos = 0;
37 GAIA_NODISCARD uint32_t
bytes()
const {
38 return (uint32_t)m_data.size();
42 GAIA_NODISCARD
bool empty()
const {
43 return m_data.empty();
47 GAIA_NODISCARD
const auto* data()
const {
56 void reserve(uint32_t size) {
57 const auto nextSize = m_dataPos + size;
58 const auto cap = (uint32_t)m_data.capacity();
62 const auto minCap = ((nextSize / CapacityIncreaseSize) * CapacityIncreaseSize) + CapacityIncreaseSize;
63 m_data.reserve(cnt::detail::resize_capacity(cnt::ResizePolicy::Scale, cap, minCap));
68 void resize(uint32_t size) {
74 void seek(uint32_t pos) {
80 void skip(uint32_t size) {
85 GAIA_NODISCARD uint32_t tell()
const {
92 void save(T&& value) {
93 reserve((uint32_t)
sizeof(T));
95 const auto cnt = m_dataPos + (uint32_t)
sizeof(T);
96 if (cnt > m_data.size())
98 mem::unaligned_ref<T> mem((
void*)&m_data[m_dataPos]);
99 mem = GAIA_FWD(value);
101 m_dataPos += (uint32_t)
sizeof(T);
108 void save_raw(
const void* pSrc, uint32_t size, [[maybe_unused]] ser::serialization_type_id
id) {
115 const auto cnt = m_dataPos + size;
116 if (cnt > m_data.size())
118 memcpy((
void*)&m_data[m_dataPos], pSrc, size);
125 template <
typename T>
126 void load(T& value) {
127 GAIA_ASSERT(m_dataPos + (uint32_t)
sizeof(T) <=
bytes());
129 const auto& cdata = std::as_const(m_data);
130 value = mem::unaligned_ref<T>((
void*)&cdata[m_dataPos]);
132 m_dataPos += (uint32_t)
sizeof(T);
139 void load_raw(
void* pDst, uint32_t size, [[maybe_unused]] ser::serialization_type_id
id) {
143 GAIA_ASSERT(m_dataPos + size <=
bytes());
145 const auto& cdata = std::as_const(m_data);
146 memmove(pDst, (
const void*)&cdata[m_dataPos], size);
Array of elements of type.
Definition darray_ext_impl.h:31
Same API as ser_buffer_binary, but backed by fully dynamic storage.
Definition ser_buffer_binary.h:164
Minimal in-memory binary serializer. It stores raw bytes only (no schema, versioning,...
Definition ser_buffer_binary.h:162
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