2#include "gaia/config/config.h"
7#include "gaia/core/utility.h"
8#include "gaia/ser/impl/ser_dispatch.h"
9#include "gaia/ser/ser_common.h"
14 using save_raw_fn = void (*)(
void*,
const void*, uint32_t, serialization_type_id);
16 using load_raw_fn = void (*)(
void*,
void*, uint32_t, serialization_type_id);
18 using data_fn =
const char* (*)(
const void*);
20 using reset_fn = void (*)(
void*);
22 using tell_fn = uint32_t (*)(
const void*);
24 using bytes_fn = uint32_t (*)(
const void*);
26 using seek_fn = void (*)(
void*, uint32_t);
49 template <
typename T,
typename =
void>
53 T, std::void_t<decltype(std::declval<T&>().save_raw(
54 (const void*)nullptr, uint32_t{}, ser::serialization_type_id{}))>>: std::true_type {};
56 template <
typename T,
typename =
void>
61 std::void_t<decltype(std::declval<T&>().load_raw((void*)nullptr, uint32_t{}, ser::serialization_type_id{}))>>:
64 template <
typename T,
typename =
void>
67 struct has_data_ptr<T, std::void_t<decltype(std::declval<const T&>().data())>>: std::true_type {};
69 template <
typename T,
typename =
void>
72 struct has_reset_fn<T, std::void_t<decltype(std::declval<T&>().reset())>>: std::true_type {};
74 template <
typename T,
typename =
void>
77 struct has_tell_fn<T, std::void_t<decltype(std::declval<const T&>().tell())>>: std::true_type {};
79 template <
typename T,
typename =
void>
82 struct has_bytes_fn<T, std::void_t<decltype(std::declval<const T&>().bytes())>>: std::true_type {};
84 template <
typename T,
typename =
void>
87 struct has_seek_fn<T, std::void_t<decltype(std::declval<T&>().seek(uint32_t{}))>>: std::true_type {};
114 template <
typename T>
116 auto saveTrivial = [](
auto&
serializer,
const auto& value) {
119 detail::save_dispatch(*
this, arg, saveTrivial);
125 template <
typename T>
127 auto loadTrivial = [](
auto&
serializer,
auto& value) {
130 detail::load_dispatch(*
this, arg, loadTrivial);
133#if GAIA_ASSERT_ENABLED
134 template <
typename T>
135 void check(
const T& arg) {
140 const auto pos0 =
tell();
142 const auto pos1 =
tell();
145 const auto pos2 =
tell();
146 GAIA_ASSERT(pos2 == pos1);
156 template <
typename T>
158 save_raw(&value,
sizeof(value), ser::type_id<T>());
164 template <
typename T>
166 load_raw(&value,
sizeof(value), ser::type_id<T>());
173 void save_raw(
const void* src, uint32_t size, serialization_type_id
id) {
182 void load_raw(
void* src, uint32_t size, serialization_type_id
id) {
189 GAIA_NODISCARD
const char*
data()
const {
204 GAIA_NODISCARD uint32_t
tell()
const {
211 GAIA_NODISCARD uint32_t
bytes()
const {
228 template <
typename TSerializer>
237 ctx.
save_raw = [](
void* ctx,
const void* src, uint32_t size, serialization_type_id id) {
238 auto& s = *
reinterpret_cast<TSerializer*
>(ctx);
239 s.save_raw(src, size,
id);
241 ctx.
load_raw = [](
void* ctx,
void* src, uint32_t size, serialization_type_id id) {
242 auto& s = *
reinterpret_cast<TSerializer*
>(ctx);
243 s.load_raw(src, size,
id);
247 ctx.
data = [](
const void* ctx) {
248 const auto& s = *
reinterpret_cast<const TSerializer*
>(ctx);
249 return (
const char*)s.data();
254 ctx.
reset = [](
void* ctx) {
255 auto& s = *
reinterpret_cast<TSerializer*
>(ctx);
260 ctx.
tell = [](
const void* ctx) {
261 const auto& s = *
reinterpret_cast<const TSerializer*
>(ctx);
262 return (uint32_t)s.tell();
266 ctx.
bytes = [](
const void* ctx) {
267 const auto& s = *
reinterpret_cast<const TSerializer*
>(ctx);
268 return (uint32_t)s.bytes();
272 ctx.
seek = [](
void* ctx, uint32_t pos) {
273 auto& s = *
reinterpret_cast<TSerializer*
>(ctx);
284 template <
typename TSerializer>
293 inline serializer make_serializer(serializer s) {
301 template <
typename TSerializer>
302 inline serializer make_serializer(TSerializer& s) {
Opaque runtime serializer context passed around as a single object.
Definition ser_rt.h:29
tell_fn tell
Cursor-query callback.
Definition ser_rt.h:41
bytes_fn bytes
Optional byte-count callback.
Definition ser_rt.h:43
load_raw_fn load_raw
Raw-read callback.
Definition ser_rt.h:35
data_fn data
Optional backing-data callback.
Definition ser_rt.h:37
void * user
Opaque backend instance.
Definition ser_rt.h:31
seek_fn seek
Cursor-movement callback.
Definition ser_rt.h:45
save_raw_fn save_raw
Raw-write callback.
Definition ser_rt.h:33
reset_fn reset
Optional reset callback.
Definition ser_rt.h:39
Runtime serializer type-erased handle. Traversal logic is shared with compile-time serialization,...
Definition ser_rt.h:94
GAIA_NODISCARD uint32_t bytes() const
Returns the backend byte count when exposed.
Definition ser_rt.h:211
serializer_ctx m_ctx
Bound backend context and callback table.
Definition ser_rt.h:96
void save_raw(const void *src, uint32_t size, serialization_type_id id)
Writes raw bytes through the bound backend.
Definition ser_rt.h:173
void load_raw(void *src, uint32_t size, serialization_type_id id)
Reads raw bytes through the bound backend.
Definition ser_rt.h:182
static serializer_ctx bind_ctx(TSerializer &obj)
Creates a callback context bound to a concrete backend.
Definition ser_rt.h:229
void save_raw(const T &value)
Writes the object representation of a typed value.
Definition ser_rt.h:157
void load(T &arg)
Deserializes a value through generic traversal.
Definition ser_rt.h:126
GAIA_NODISCARD uint32_t tell() const
Returns the current backend cursor.
Definition ser_rt.h:204
void reset()
Resets the backend when supported.
Definition ser_rt.h:196
void save(const T &arg)
Serializes a value through generic traversal.
Definition ser_rt.h:115
void seek(uint32_t pos)
Moves the backend cursor.
Definition ser_rt.h:219
GAIA_NODISCARD bool valid() const
Checks whether mandatory backend callbacks are bound.
Definition ser_rt.h:106
GAIA_NODISCARD const char * data() const
Returns the backend data pointer when exposed.
Definition ser_rt.h:189
void load_raw(T &value)
Reads an object representation into a typed value.
Definition ser_rt.h:165
serializer(const serializer_ctx &ctx)
Creates a serializer from an existing callback context.
Definition ser_rt.h:102
static serializer bind(TSerializer &obj)
Creates a runtime serializer bound to a concrete backend.
Definition ser_rt.h:285