2#include "gaia/config/config.h"
7#include "gaia/core/utility.h"
12 enum class serialization_type_id : uint8_t {
55 trivial_wrapper = special_begin,
67 inline uint32_t serialization_type_size(serialization_type_id
id, uint32_t size) {
68 static constexpr uint32_t sizes[] = {
101 const auto s =
id == serialization_type_id::trivial_wrapper ? size : sizes[(uint32_t)
id];
102 GAIA_ASSERT(s != (uint32_t)-1);
108 template <
typename T>
111 static constexpr bool update() {
112 return std::is_enum_v<T> || std::is_fundamental_v<T> || std::is_trivially_copyable_v<T>;
117 static constexpr bool value = update();
120 template <
typename T>
123 std::is_same<T, char>, std::is_same<T, unsigned char>,
124 std::is_same<T, int8_t>, std::is_same<T, uint8_t>,
125 std::is_same<T, int16_t>, std::is_same<T, uint16_t>,
126 std::is_same<T, int32_t>, std::is_same<T, uint32_t>,
127 std::is_same<T, int64_t>, std::is_same<T, uint64_t>,
128 std::is_same<T, size_t>, std::is_same<T, bool>> {};
130 template <
typename T>
135 std::is_same<T, float>,
136 std::is_same<T, double>,
137 std::is_same<T, long double>> {};
142 template <
typename T>
143 GAIA_NODISCARD
constexpr serialization_type_id int_kind_id() {
146 if constexpr (std::is_same_v<char, T>) {
147 return serialization_type_id::s8;
148 }
else if constexpr (std::is_same_v<unsigned char, T>) {
149 return serialization_type_id::u8;
150 }
else if constexpr (std::is_same_v<int8_t, T>) {
151 return serialization_type_id::s8;
152 }
else if constexpr (std::is_same_v<uint8_t, T>) {
153 return serialization_type_id::u8;
154 }
else if constexpr (std::is_same_v<int16_t, T>) {
155 return serialization_type_id::s16;
156 }
else if constexpr (std::is_same_v<uint16_t, T>) {
157 return serialization_type_id::u16;
158 }
else if constexpr (std::is_same_v<int32_t, T>) {
159 return serialization_type_id::s32;
160 }
else if constexpr (std::is_same_v<uint32_t, T>) {
161 return serialization_type_id::u32;
162 }
else if constexpr (std::is_same_v<int64_t, T>) {
163 return serialization_type_id::s64;
164 }
else if constexpr (std::is_same_v<uint64_t, T>) {
165 return serialization_type_id::u64;
166 }
else if constexpr (std::is_same_v<size_t, T>) {
167 return serialization_type_id::u64;
169 return serialization_type_id::b;
176 template <
typename T>
177 GAIA_NODISCARD
constexpr serialization_type_id flt_type_id() {
178 static_assert(is_flt_kind_id<T>::value,
"Unsupported floating type");
185 if constexpr (std::is_same_v<float, T>) {
186 return serialization_type_id::f32;
188 return serialization_type_id::f64;
195 template <
typename T>
196 GAIA_NODISCARD
constexpr serialization_type_id type_id() {
197 if constexpr (std::is_enum_v<T>)
198 return int_kind_id<std::underlying_type_t<T>>();
199 else if constexpr (std::is_integral_v<T>)
200 return int_kind_id<T>();
201 else if constexpr (std::is_floating_point_v<T>)
202 return flt_type_id<T>();
203 else if constexpr (std::is_pointer_v<T>)
204 return serialization_type_id::data_and_size;
205 else if constexpr (core::has_size_begin_end<T>::value)
206 return serialization_type_id::data_and_size;
207 else if constexpr (std::is_class_v<T>)
208 return serialization_type_id::trivial_wrapper;
210 return serialization_type_id::ignore;
215 GAIA_DEFINE_HAS_MEMBER_FUNC(save);
216 GAIA_DEFINE_HAS_MEMBER_FUNC(load);
217 GAIA_DEFINE_HAS_MEMBER_FUNC(resize);
225 inline constexpr save_tag save_v{};
226 inline constexpr load_tag load_v{};
232 template <
typename S,
typename T>
233 auto has_tag_save_impl(
int)
234 ->
decltype(tag_invoke(save_v, std::declval<S&>(), std::declval<const T&>()), std::true_type{});
235 template <
typename,
typename>
236 std::false_type has_tag_save_impl(...);
237 template <
typename S,
typename T>
238 using has_tag_save =
decltype(has_tag_save_impl<S, T>(0));
240 template <
typename S,
typename T>
241 auto has_tag_load_impl(
int)
242 ->
decltype(tag_invoke(load_v, std::declval<S&>(), std::declval<T&>()), std::true_type{});
243 template <
typename,
typename>
244 std::false_type has_tag_load_impl(...);
245 template <
typename S,
typename T>
246 using has_tag_load =
decltype(has_tag_load_impl<S, T>(0));
Definition ser_common.h:137
Definition ser_common.h:128
Reports whether a type may be serialized by copying its representation.
Definition ser_common.h:109
static constexpr bool value
True when the type can be serialized trivially.
Definition ser_common.h:117