14 template <
typename Serializer,
typename T,
typename SaveTrivial>
15 void save_dispatch(Serializer& s,
const T& arg, SaveTrivial&& saveTrivial) {
16 using U = core::raw_t<T>;
19 if constexpr (has_func_save<U, Serializer&>::value) {
21 }
else if constexpr (has_tag_save<Serializer, U>::value) {
22 tag_invoke(save_v, s,
static_cast<const U&
>(arg));
30 const auto size = arg.size();
33 for (
const auto& e: std::as_const(arg))
34 save_dispatch(s, e, saveTrivial);
37 else if constexpr (std::is_class_v<U>) {
38 meta::each_member(GAIA_FWD(arg), [&s, &saveTrivial](
auto&&... items) {
40 (save_dispatch(s, items, saveTrivial), ...);
43 static_assert(!
sizeof(U),
"Type is not supported for serialization, yet");
46 template <
typename Serializer,
typename T,
typename LoadTrivial>
47 void load_dispatch(Serializer& s, T& arg, LoadTrivial&& loadTrivial) {
48 using U = core::raw_t<T>;
51 if constexpr (has_func_load<U, Serializer&>::value) {
53 }
else if constexpr (has_tag_load<Serializer, U>::value) {
54 tag_invoke(load_v, s,
static_cast<U&
>(arg));
62 auto size = arg.size();
65 if constexpr (has_func_resize<U, size_t>::value) {
77 load_dispatch(s, e, loadTrivial);
84 using arg_type =
typename std::remove_pointer<
decltype(arg.data())>::type;
86 load_dispatch(s, val, loadTrivial);
92 else if constexpr (std::is_class_v<U>) {
93 meta::each_member(GAIA_FWD(arg), [&s, &loadTrivial](
auto&&... items) {
95 (load_dispatch(s, items, loadTrivial), ...);
98 static_assert(!
sizeof(U),
"Type is not supported for serialization, yet");