9 #ifndef EAGINE_SERIALIZE_DATA_BUFFER_HPP
10 #define EAGINE_SERIALIZE_DATA_BUFFER_HPP
12 #include "../identifier.hpp"
13 #include "../int_constant.hpp"
14 #include "../reflect/data_members.hpp"
15 #include "../reflect/enumerators.hpp"
16 #include "../types.hpp"
24 template <std::
size_t S,
bool C = true>
27 static constexpr
bool is_constant = C;
30 static constexpr
auto get(
const X&) noexcept {
35 template <
identifier_t SerializerId,
typename T,
typename Selector>
36 struct get_serialize_buffer_size;
38 template <
identifier_t SerializerId,
typename T,
typename Selector>
39 constexpr
const auto serialize_buffer_size_v =
40 get_serialize_buffer_size<SerializerId, T, Selector>::value;
42 template <
identifier_t SerializerId,
typename T,
typename Selector>
43 constexpr
const auto serialize_buffer_is_constant_v =
44 get_serialize_buffer_size<SerializerId, T, Selector>::value;
46 template <
identifier_t S
id,
typename T,
typename Selector>
47 struct get_serialize_buffer_size<Sid, T&, Selector>
48 : get_serialize_buffer_size<Sid, T, Selector> {};
50 template <
identifier_t S
id,
typename T,
typename Selector>
51 struct get_serialize_buffer_size<Sid, const T, Selector>
52 : get_serialize_buffer_size<Sid, T, Selector> {};
54 template <
identifier_t S
id,
typename T,
typename Selector>
55 struct get_serialize_buffer_size<Sid, const T&, Selector>
56 : get_serialize_buffer_size<Sid, T, Selector> {};
58 template <
identifier_t S
id,
typename Selector>
59 struct get_serialize_buffer_size<Sid, bool, Selector>
60 : serialize_size_constant<8> {};
62 template <
identifier_t S
id,
typename Selector>
63 struct get_serialize_buffer_size<Sid,
byte, Selector>
64 : serialize_size_constant<4> {};
66 template <
identifier_t S
id,
typename Selector>
67 struct get_serialize_buffer_size<Sid, char, Selector>
68 : serialize_size_constant<4> {};
70 template <
identifier_t S
id,
typename Selector>
71 struct get_serialize_buffer_size<Sid, std::int16_t, Selector>
72 : serialize_size_constant<6> {};
74 template <
identifier_t S
id,
typename Selector>
75 struct get_serialize_buffer_size<Sid, std::uint16_t, Selector>
76 : serialize_size_constant<6> {};
78 template <
identifier_t S
id,
typename Selector>
79 struct get_serialize_buffer_size<Sid, std::int32_t, Selector>
80 : serialize_size_constant<12> {};
82 template <
identifier_t S
id,
typename Selector>
83 struct get_serialize_buffer_size<Sid, std::uint32_t, Selector>
84 : serialize_size_constant<12> {};
86 template <
identifier_t S
id,
typename Selector>
87 struct get_serialize_buffer_size<Sid, std::int64_t, Selector>
88 : serialize_size_constant<24> {};
90 template <
identifier_t S
id,
typename Selector>
91 struct get_serialize_buffer_size<Sid, std::uint64_t, Selector>
92 : serialize_size_constant<24> {};
94 template <
identifier_t S
id,
typename Selector>
95 struct get_serialize_buffer_size<Sid, float, Selector>
96 : serialize_size_constant<24> {};
98 template <
identifier_t S
id,
typename Selector>
99 struct get_serialize_buffer_size<Sid, double, Selector>
100 : serialize_size_constant<48> {};
102 template <
identifier_t S
id,
typename Selector>
103 struct get_serialize_buffer_size<Sid,
identifier, Selector>
104 : serialize_size_constant<12> {};
106 template <
identifier_t S
id,
typename Selector>
107 struct get_serialize_buffer_size<Sid, std::string, Selector>
108 : serialize_size_constant<0, false> {
110 static constexpr
auto
111 get(std::pair<string_view, const std::string&> mapped) noexcept {
113 12 + mapped.first.size() + 2 +
span_size(mapped.second.size()));
117 template <
identifier_t S
id,
typename T, std::
size_t N,
typename Selector>
118 struct get_serialize_buffer_size<Sid, std::array<T, N>, Selector>
119 : serialize_size_constant<
120 (4 + (2 + serialize_buffer_size_v<Sid, T, Selector>)*N),
121 (get_serialize_buffer_size<Sid, T, Selector>::is_constant)> {
123 static constexpr
auto
124 get(std::pair<
string_view,
const std::array<T, N>&> mapped) noexcept {
125 auto result =
std_size(12 + mapped.first.size());
126 for(
auto& e : mapped.second) {
128 2 + get_serialize_buffer_size<Sid, T, Selector>::get({{}, e});
134 template <
identifier_t Sid,
typename... T,
typename Selector>
135 struct get_serialize_buffer_size<Sid, std::tuple<T...>, Selector>
136 : serialize_size_constant<
137 (4 + ... + (2 + serialize_buffer_size_v<Sid, T, Selector>)),
138 (true && ... && (serialize_buffer_is_constant_v<Sid, T, Selector>))> {
140 template <
typename Tup>
141 static constexpr
auto
142 get(std::pair<string_view, const Tup&> mapped) noexcept {
144 12 + mapped.first.size() + 2 +
145 _do_get(mapped.second, std::make_index_sequence<
sizeof...(T)>()));
149 template <
typename Tup, std::size_t... I>
150 static constexpr
auto
151 _do_get(
const Tup& t, std::index_sequence<I...>) noexcept {
154 (2 + get_serialize_buffer_size<Sid, T, Selector>::get(
159 template <
identifier_t S
id,
typename T,
typename Selector>
160 struct get_struct_serialize_buffer_size : serialize_size_constant<0, false> {
162 static constexpr
auto get(std::pair<string_view, const T&> mapped) noexcept {
164 12 + mapped.first.size() + 2 + _get(map_data_members(mapped.second)));
168 template <
typename Mapped>
169 static constexpr
auto _get(
const Mapped& mapped) noexcept {
171 mapped, std::make_index_sequence<std::tuple_size_v<Mapped>>());
174 template <
typename... M, std::size_t... I>
175 static constexpr
auto _do_get(
176 const std::tuple<std::pair<string_view, const M&>...>& mapped,
177 std::index_sequence<I...>) noexcept {
180 (2 + get_serialize_buffer_size<Sid, M, Selector>::get(
181 std::pair<string_view, const M&>{
182 std::get<I>(mapped).first, std::get<I>(mapped).second}))));
186 template <
identifier_t S
id,
typename T,
typename Selector>
187 struct get_serialize_buffer_size
188 : std::conditional_t<
189 has_data_member_mapping_v<T>,
190 get_struct_serialize_buffer_size<Sid, T, Selector>,
192 has_enumerator_mapping_v<T>,
193 serialize_size_constant<96>,
196 template <
identifier_t SerializerId,
typename T,
typename Selector>
197 constexpr
auto get_serialize_array_for(
const T&, Selector) noexcept
198 -> std::array<byte, serialize_buffer_size_v<SerializerId, T, Selector>> {
202 template <
identifier_t SerializerId,
typename T,
typename Selector>
203 inline auto get_serialize_vector_for(
const T& inst, Selector) noexcept
204 -> std::vector<byte> {
205 std::vector<byte> result;
206 result.resize(get_serialize_buffer_size<SerializerId, T, Selector>::get(
207 std::pair<string_view, const T&>({}, inst)));
218 if constexpr(get_serialize_buffer_size<SerializerId, T, Selector>::
220 return get_serialize_array_for<SerializerId>(inst, sel);
222 return get_serialize_vector_for<SerializerId>(inst, sel);