2#include "gaia/config/config.h"
7#include "gaia/core/utility.h"
11 enum class serialization_type_id : uint8_t {
43 trivial_wrapper = special_begin,
49 inline uint32_t serialization_type_size(serialization_type_id
id, uint32_t size) {
50 static const uint32_t sizes[] = {
85 const auto s = sizes[(uint32_t)
id];
87 GAIA_ASSERT(s != (uint32_t)-1);
94 static constexpr bool update() {
95 return std::is_enum_v<T> || std::is_fundamental_v<T> || std::is_trivially_copyable_v<T>;
99 static constexpr bool value = update();
102 template <
typename T>
105 std::is_same<T, char>, std::is_same<T, unsigned char>,
106 std::is_same<T, int8_t>, std::is_same<T, uint8_t>,
107 std::is_same<T, int16_t>, std::is_same<T, uint16_t>,
108 std::is_same<T, int32_t>, std::is_same<T, uint32_t>,
109 std::is_same<T, int64_t>, std::is_same<T, uint64_t>,
110 std::is_same<T, size_t>, std::is_same<T, bool>> {};
112 template <
typename T>
117 std::is_same<T, float>,
118 std::is_same<T, double>,
119 std::is_same<T, long double>> {};
121 template <
typename T>
122 GAIA_NODISCARD
constexpr serialization_type_id int_kind_id() {
125 if constexpr (std::is_same_v<char, T>) {
126 return serialization_type_id::s8;
127 }
else if constexpr (std::is_same_v<unsigned char, T>) {
128 return serialization_type_id::u8;
129 }
else if constexpr (std::is_same_v<int8_t, T>) {
130 return serialization_type_id::s8;
131 }
else if constexpr (std::is_same_v<uint8_t, T>) {
132 return serialization_type_id::u8;
133 }
else if constexpr (std::is_same_v<int16_t, T>) {
134 return serialization_type_id::s16;
135 }
else if constexpr (std::is_same_v<uint16_t, T>) {
136 return serialization_type_id::u16;
137 }
else if constexpr (std::is_same_v<int32_t, T>) {
138 return serialization_type_id::s32;
139 }
else if constexpr (std::is_same_v<uint32_t, T>) {
140 return serialization_type_id::u32;
141 }
else if constexpr (std::is_same_v<int64_t, T>) {
142 return serialization_type_id::s64;
143 }
else if constexpr (std::is_same_v<uint64_t, T>) {
144 return serialization_type_id::u64;
145 }
else if constexpr (std::is_same_v<size_t, T>) {
146 return serialization_type_id::u64;
148 return serialization_type_id::b;
152 template <
typename T>
153 GAIA_NODISCARD
constexpr serialization_type_id flt_type_id() {
154 static_assert(is_flt_kind_id<T>::value,
"Unsupported floating type");
161 if constexpr (std::is_same_v<float, T>) {
162 return serialization_type_id::f32;
163 }
else if constexpr (std::is_same_v<double, T>) {
164 return serialization_type_id::f64;
166 return serialization_type_id::f128;
170 template <
typename T>
171 GAIA_NODISCARD
constexpr serialization_type_id type_id() {
172 if constexpr (std::is_enum_v<T>)
173 return int_kind_id<std::underlying_type_t<T>>();
174 else if constexpr (std::is_integral_v<T>)
175 return int_kind_id<T>();
176 else if constexpr (std::is_floating_point_v<T>)
177 return flt_type_id<T>();
178 else if constexpr (std::is_pointer_v<T>)
179 return serialization_type_id::data_and_size;
180 else if constexpr (core::has_size_begin_end<T>::value)
181 return serialization_type_id::data_and_size;
182 else if constexpr (std::is_class_v<T>)
183 return serialization_type_id::trivial_wrapper;
185 return serialization_type_id::ignore;
192 GAIA_DEFINE_HAS_MEMBER_FUNC(save);
193 GAIA_DEFINE_HAS_MEMBER_FUNC(load);
194 GAIA_DEFINE_HAS_MEMBER_FUNC(resize);
203 inline constexpr load_tag load_v{};
209 template <
typename S,
typename T>
210 auto has_tag_save_impl(
int)
211 ->
decltype(tag_invoke(save_v, std::declval<S&>(), std::declval<const T&>()), std::true_type{});
212 template <
typename,
typename>
213 std::false_type has_tag_save_impl(...);
214 template <
typename S,
typename T>
215 using has_tag_save =
decltype(has_tag_save_impl<S, T>(0));
217 template <
typename S,
typename T>
218 auto has_tag_load_impl(
int)
219 ->
decltype(tag_invoke(load_v, std::declval<S&>(), std::declval<T&>()), std::true_type{});
220 template <
typename,
typename>
221 std::false_type has_tag_load_impl(...);
222 template <
typename S,
typename T>
223 using has_tag_load =
decltype(has_tag_load_impl<S, T>(0));
Checks if endianess was detected correctly at compile-time.
Definition bitset.h:9
Definition ser_common.h:119
Definition ser_common.h:110
Definition ser_common.h:92
Definition ser_common.h:201
Definition ser_common.h:200