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"
15 template <
typename Serializer,
typename T,
typename SaveTrivial>
16 void save_dispatch(Serializer& s,
const T& arg, SaveTrivial&& saveTrivial) {
17 using U = core::raw_t<T>;
20 if constexpr (has_func_save<U, Serializer&>::value) {
22 }
else if constexpr (has_tag_save<Serializer, U>::value) {
23 tag_invoke(save_v, s,
static_cast<const U&
>(arg));
30 else if constexpr (core::has_size_begin_end<U>::value) {
31 const auto size = arg.size();
34 for (
const auto& e: std::as_const(arg))
35 save_dispatch(s, e, saveTrivial);
38 else if constexpr (std::is_class_v<U>) {
39 meta::each_member(GAIA_FWD(arg), [&s, &saveTrivial](
auto&&... items) {
41 (save_dispatch(s, items, saveTrivial), ...);
44 static_assert(!
sizeof(U),
"Type is not supported for serialization, yet");
47 template <
typename Serializer,
typename T,
typename LoadTrivial>
48 void load_dispatch(Serializer& s, T& arg, LoadTrivial&& loadTrivial) {
49 using U = core::raw_t<T>;
52 if constexpr (has_func_load<U, Serializer&>::value) {
54 }
else if constexpr (has_tag_load<Serializer, U>::value) {
55 tag_invoke(load_v, s,
static_cast<U&
>(arg));
62 else if constexpr (core::has_size_begin_end<U>::value) {
63 auto size = arg.size();
66 if constexpr (has_func_resize<U, size_t>::value) {
78 load_dispatch(s, e, loadTrivial);
85 using arg_type =
typename std::remove_pointer<
decltype(arg.data())>::type;
87 load_dispatch(s, val, loadTrivial);
93 else if constexpr (std::is_class_v<U>) {
94 meta::each_member(GAIA_FWD(arg), [&s, &loadTrivial](
auto&&... items) {
96 (load_dispatch(s, items, loadTrivial), ...);
99 static_assert(!
sizeof(U),
"Type is not supported for serialization, yet");
static constexpr bool value
True when the type can be serialized trivially.
Definition ser_common.h:117