2#include "gaia/config/config.h"
7#include "gaia/core/utility.h"
8#include "gaia/meta/reflection.h"
9#include "gaia/ser/ser_common.h"
14 template <
typename Writer,
typename T>
15 void save_one(Writer& s,
const T& arg) {
16 using U = core::raw_t<T>;
19 if constexpr (has_func_save<U, Writer&>::value) {
21 }
else if constexpr (has_tag_save<Writer, U>::value) {
22 tag_invoke(save_v, s,
static_cast<const U&
>(arg));
25 else if constexpr (is_trivially_serializable<U>::value) {
29 else if constexpr (core::has_size_begin_end<U>::value) {
30 const auto size = arg.size();
33 for (
const auto& e: std::as_const(arg))
37 else if constexpr (std::is_class_v<U>) {
38 meta::each_member(GAIA_FWD(arg), [&s](
auto&&... items) {
40 (save_one(s, items), ...);
43 static_assert(!
sizeof(U),
"Type is not supported for serialization, yet");
46 template <
typename Reader,
typename T>
47 void load_one(Reader& s, T& arg) {
48 using U = core::raw_t<T>;
51 if constexpr (has_func_load<U, Reader&>::value) {
53 }
else if constexpr (has_tag_load<Reader, U>::value) {
54 tag_invoke(load_v, s,
static_cast<U&
>(arg));
57 else if constexpr (is_trivially_serializable<U>::value) {
61 else if constexpr (core::has_size_begin_end<U>::value) {
62 auto size = arg.size();
65 if constexpr (has_func_resize<U, size_t>::value) {
78 arg[i] = std::move(e);
84 using arg_type =
typename std::remove_pointer<
decltype(arg.data())>::type;
92 else if constexpr (std::is_class_v<U>) {
93 meta::each_member(GAIA_FWD(arg), [&s](
auto&&... items) {
95 (load_one(s, items), ...);
98 static_assert(!
sizeof(U),
"Type is not supported for serialization, yet");
101#if GAIA_ASSERT_ENABLED
102 template <
typename Writer,
typename T>
103 void check_one(Writer& s,
const T& arg) {
108 const auto pos0 = s.tell();
110 const auto pos1 = s.tell();
113 GAIA_ASSERT(s.tell() == pos1);
127 template <
typename Writer,
typename T>
128 void save(Writer& writer,
const T& data) {
129 detail::save_one(writer, data);
138 template <
typename Reader,
typename T>
139 void load(Reader& reader, T& data) {
140 detail::load_one(reader, data);
143#if GAIA_ASSERT_ENABLED
151 template <
typename Writer,
typename T>
152 void check(Writer& writer,
const T& data) {
153 detail::check_one(writer, data);
Checks if endianess was detected correctly at compile-time.
Definition bitset.h:9