86 GAIA_NODISCARD
bool valid()
const {
87 return m_ctx.user !=
nullptr && m_ctx.save_raw !=
nullptr && m_ctx.load_raw !=
nullptr &&
88 m_ctx.tell !=
nullptr && m_ctx.seek !=
nullptr;
92 void save(
const T& arg) {
93 auto saveTrivial = [](
auto&
serializer,
const auto& value) {
96 detail::save_dispatch(*
this, arg, saveTrivial);
101 auto loadTrivial = [](
auto&
serializer,
auto& value) {
104 detail::load_dispatch(*
this, arg, loadTrivial);
107#if GAIA_ASSERT_ENABLED
108 template <
typename T>
109 void check(
const T& arg) {
114 const auto pos0 = tell();
116 const auto pos1 = tell();
119 const auto pos2 = tell();
120 GAIA_ASSERT(pos2 == pos1);
127 template <
typename T>
128 void save_raw(
const T& value) {
129 save_raw(&value,
sizeof(value), ser::type_id<T>());
132 template <
typename T>
133 void load_raw(T& value) {
134 load_raw(&value,
sizeof(value), ser::type_id<T>());
137 void save_raw(
const void* src, uint32_t size, serialization_type_id
id) {
138 GAIA_ASSERT(m_ctx.save_raw !=
nullptr);
139 m_ctx.save_raw(m_ctx.user, src, size,
id);
142 void load_raw(
void* src, uint32_t size, serialization_type_id
id) {
143 GAIA_ASSERT(m_ctx.load_raw !=
nullptr);
144 m_ctx.load_raw(m_ctx.user, src, size,
id);
147 GAIA_NODISCARD
const char* data()
const {
148 if (m_ctx.data ==
nullptr)
150 return m_ctx.data(m_ctx.user);
154 if (m_ctx.reset ==
nullptr)
156 m_ctx.reset(m_ctx.user);
159 GAIA_NODISCARD uint32_t tell()
const {
160 GAIA_ASSERT(m_ctx.tell !=
nullptr);
161 return m_ctx.tell(m_ctx.user);
164 GAIA_NODISCARD uint32_t bytes()
const {
165 if (m_ctx.bytes ==
nullptr)
167 return m_ctx.bytes(m_ctx.user);
170 void seek(uint32_t pos) {
171 GAIA_ASSERT(m_ctx.seek !=
nullptr);
172 m_ctx.seek(m_ctx.user, pos);
175 template <
typename TSerializer>
184 ctx.save_raw = [](
void* ctx,
const void* src, uint32_t size, serialization_type_id id) {
185 auto& s = *
reinterpret_cast<TSerializer*
>(ctx);
186 s.save_raw(src, size,
id);
188 ctx.load_raw = [](
void* ctx,
void* src, uint32_t size, serialization_type_id id) {
189 auto& s = *
reinterpret_cast<TSerializer*
>(ctx);
190 s.load_raw(src, size,
id);
194 ctx.data = [](
const void* ctx) {
195 const auto& s = *
reinterpret_cast<const TSerializer*
>(ctx);
196 return (
const char*)s.data();
201 ctx.reset = [](
void* ctx) {
202 auto& s = *
reinterpret_cast<TSerializer*
>(ctx);
207 ctx.tell = [](
const void* ctx) {
208 const auto& s = *
reinterpret_cast<const TSerializer*
>(ctx);
209 return (uint32_t)s.tell();
213 ctx.bytes = [](
const void* ctx) {
214 const auto& s = *
reinterpret_cast<const TSerializer*
>(ctx);
215 return (uint32_t)s.bytes();
219 ctx.seek = [](
void* ctx, uint32_t pos) {
220 auto& s = *
reinterpret_cast<TSerializer*
>(ctx);
227 template <
typename TSerializer>