Gaia-ECS v1.0.0
A simple and powerful entity component system
Loading...
Searching...
No Matches
ser_buffer_binary.h
1#pragma once
2#include "gaia/config/config.h"
3
4#include <type_traits>
5
6#include "gaia/cnt/darray.h"
7#include "gaia/cnt/darray_ext.h"
8#include "gaia/cnt/impl/array_utils.h"
9
10namespace gaia {
11 namespace ser {
12 enum class serialization_type_id : uint8_t;
13
14 namespace detail {
16 static constexpr uint32_t SerializationBufferCapacityIncreaseSize = 128U;
17
18 template <typename DataContainer>
20 class ser_buffer_binary_impl {
21 protected:
23 static constexpr uint32_t CapacityIncreaseSize = SerializationBufferCapacityIncreaseSize;
24
26 DataContainer m_data;
28 uint32_t m_dataPos = 0;
29
30 public:
31 void reset() {
32 m_dataPos = 0;
33 m_data.clear();
34 }
35
37 GAIA_NODISCARD uint32_t bytes() const {
38 return (uint32_t)m_data.size();
39 }
40
42 GAIA_NODISCARD bool empty() const {
43 return m_data.empty();
44 }
45
47 GAIA_NODISCARD const auto* data() const {
48 return m_data.data();
49 }
50
56 void reserve(uint32_t size) {
57 const auto nextSize = m_dataPos + size;
58 const auto cap = (uint32_t)m_data.capacity();
59 if (nextSize <= cap)
60 return;
61
62 const auto minCap = ((nextSize / CapacityIncreaseSize) * CapacityIncreaseSize) + CapacityIncreaseSize;
63 m_data.reserve(cnt::detail::resize_capacity(cnt::ResizePolicy::Scale, cap, minCap));
64 }
65
68 void resize(uint32_t size) {
69 m_data.resize(size);
70 }
71
74 void seek(uint32_t pos) {
75 m_dataPos = pos;
76 }
77
80 void skip(uint32_t size) {
81 m_dataPos += size;
82 }
83
85 GAIA_NODISCARD uint32_t tell() const {
86 return m_dataPos;
87 }
88
91 template <typename T>
92 void save(T&& value) {
93 reserve((uint32_t)sizeof(T));
94
95 const auto cnt = m_dataPos + (uint32_t)sizeof(T);
96 if (cnt > m_data.size())
97 m_data.resize(cnt);
98 mem::unaligned_ref<T> mem((void*)&m_data[m_dataPos]);
99 mem = GAIA_FWD(value);
100
101 m_dataPos += (uint32_t)sizeof(T);
102 }
103
108 void save_raw(const void* pSrc, uint32_t size, [[maybe_unused]] ser::serialization_type_id id) {
109 if (size == 0)
110 return;
111
112 reserve(size);
113
114 // Copy "size" bytes of raw data starting at pSrc
115 const auto cnt = m_dataPos + size;
116 if (cnt > m_data.size())
117 m_data.resize(cnt);
118 memcpy((void*)&m_data[m_dataPos], pSrc, size);
119
120 m_dataPos += size;
121 }
122
125 template <typename T>
126 void load(T& value) {
127 GAIA_ASSERT(m_dataPos + (uint32_t)sizeof(T) <= bytes());
128
129 const auto& cdata = std::as_const(m_data);
130 value = mem::unaligned_ref<T>((void*)&cdata[m_dataPos]);
131
132 m_dataPos += (uint32_t)sizeof(T);
133 }
134
139 void load_raw(void* pDst, uint32_t size, [[maybe_unused]] ser::serialization_type_id id) {
140 if (size == 0)
141 return;
142
143 GAIA_ASSERT(m_dataPos + size <= bytes());
144
145 const auto& cdata = std::as_const(m_data);
146 memmove(pDst, (const void*)&cdata[m_dataPos], size);
147
148 m_dataPos += size;
149 }
150 };
152 } // namespace detail
153
157 using ser_buffer_binary_storage_dyn = gaia::cnt::darray<uint8_t>;
158
162 class ser_buffer_binary: public detail::ser_buffer_binary_impl<ser_buffer_binary_storage> {};
164 class ser_buffer_binary_dyn: public detail::ser_buffer_binary_impl<ser_buffer_binary_storage_dyn> {};
165 } // namespace ser
166} // namespace gaia
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