36 template <
size_t I = 0,
typename F,
typename... Ts>
37 static auto tuple_apply(
const std::tuple<Ts...>& t,
const F& f)
39 if constexpr (
sizeof...(Ts) == 1)
41 return std::make_tuple();
43 else if constexpr (I ==
sizeof...(Ts) - 1)
45 return f(std::get<I>(t));
49 return std::tuple_cat(f(std::get<I>(t)), tuple_apply<I + 1>(t, f));
53 template <
typename Tup>
56 static constexpr size_t TupSize = std::tuple_size_v<Tup>;
58 template <
typename... Ts>
64 template <
typename... Ts>
67 template <
size_t I,
typename T>
71 std::remove_cvref_t<typename std::tuple_element_t<I, Tup>>;
91 std::is_same_v<CanonTarget, CanonArgument> ||
92 (std::is_same_v<CanonTarget, std::vector<uint8_t>> &&
93 std::is_same_v<CanonArgument, ByteRange>) ||
94 (std::is_same_v<CanonTarget, ByteRange> &&
96 (std::is_same_v<CanonTarget, ByteRange> &&
97 (std::is_array_v<CanonArgument> &&
98 std::is_same_v<std::remove_extent_t<CanonArgument>,
ByteRange>));
102 template <
size_t I,
typename... Ts>
108 template <
size_t I,
typename T,
typename... Ts>
115 template <
typename... Ts>
121 template <
typename... Ts>
125 template <
typename... Ts>
133 virtual const uint8_t*
data()
const = 0;
134 virtual size_t size()
const = 0;
139 template <
typename T>
146 virtual const uint8_t*
data()
const override
148 return reinterpret_cast<const uint8_t*
>(&
t);
151 virtual size_t size()
const override
157 template <
typename T>
164 virtual const uint8_t*
data()
const override
166 return reinterpret_cast<const uint8_t*
>(&
t);
169 virtual size_t size()
const override
177 const uint8_t*
const d;
183 virtual const uint8_t*
data()
const override
188 virtual size_t size()
const override
198 template <
typename... Ts>
203 "EmptySerializer was given message payload to serialize - can only "
206 return std::make_tuple();
209 template <
typename... Ts>
212 if constexpr (
sizeof...(Ts) == 0)
215 throw std::logic_error(
216 "EmptySerializer asked to deserialize buffer of size " +
217 std::to_string(size) +
", should be empty");
219 return std::make_tuple();
225 template <
size_t N,
size_t... Is>
226 static auto serialize_byte_range_with_index_sequence(
227 const ByteRange (&brs)[N], std::index_sequence<Is...>)
229 return std::make_tuple(
230 std::make_shared<MemoryRegionSection>(brs[Is].data, brs[Is].size)...);
236 static auto serialize_value(
const ByteRange& br)
238 auto cs = std::make_shared<CopiedSection<size_t>>(br.
size);
239 auto bfs = std::make_shared<MemoryRegionSection>(br.
data, br.
size);
240 return std::tuple_cat(std::make_tuple(cs), std::make_tuple(bfs));
246 static auto serialize_value(
const ByteRange (&brs)[N])
248 return serialize_byte_range_with_index_sequence(
249 brs, std::make_index_sequence<N>{});
253 static auto serialize_value(
const std::vector<uint8_t>& vec)
255 auto cs = std::make_shared<CopiedSection<size_t>>(vec.size());
256 auto bfs = std::make_shared<MemoryRegionSection>(vec.data(), vec.size());
257 return std::tuple_cat(std::make_tuple(cs), std::make_tuple(bfs));
263 static auto serialize_value(std::span<uint8_t> s)
265 auto csd = std::make_shared<CopiedSection<uintptr_t>>(
266 reinterpret_cast<std::uintptr_t
>(s.data()));
267 auto css = std::make_shared<CopiedSection<size_t>>(s.size());
268 return std::tuple_cat(std::make_tuple(csd), std::make_tuple(css));
272 static auto serialize_value(
const std::string& s)
274 auto cs = std::make_shared<CopiedSection<size_t>>(s.size());
275 auto bfs = std::make_shared<MemoryRegionSection>(
276 reinterpret_cast<const uint8_t*
>(s.data()), s.size());
277 return std::tuple_cat(std::make_tuple(cs), std::make_tuple(bfs));
284 std::is_integral<T>::value || std::is_enum<T>::value,
286 static auto serialize_value(
const T& t)
288 auto rs = std::make_shared<RawSection<T>>(t);
289 return std::make_tuple(rs);
297 static auto serialize_value_final(
const ByteRange& br)
299 auto bfs = std::make_shared<MemoryRegionSection>(br.
data, br.
size);
300 return std::make_tuple(bfs);
305 static auto serialize_value_final(
const std::vector<uint8_t>& vec)
307 auto bfs = std::make_shared<MemoryRegionSection>(vec.data(), vec.size());
308 return std::make_tuple(bfs);
312 template <
typename T>
313 static auto serialize_value_final(
const T& t)
315 return serialize_value(t);
320 template <
typename T>
330 const uint8_t*& data,
size_t& size,
const Tag<ByteRange>&)
332 const auto prefixed_size = serialized::read<size_t>(data, size);
339 static std::vector<uint8_t> deserialize_value(
340 const uint8_t*& data,
size_t& size,
const Tag<std::vector<uint8_t>>&)
342 const auto prefixed_size = serialized::read<size_t>(data, size);
347 static std::span<uint8_t> deserialize_value(
348 const uint8_t*& data,
size_t& size,
const Tag<std::span<uint8_t>>&)
350 const auto ptr = serialized::read<uintptr_t>(data, size);
351 const auto s = serialized::read<size_t>(data, size);
352 return {
reinterpret_cast<uint8_t*
>(ptr), s};
356 static std::string deserialize_value(
357 const uint8_t*& data,
size_t& size,
const Tag<std::string>&)
359 return serialized::read<std::string>(data, size);
366 std::is_integral<T>::value || std::is_enum<T>::value,
368 static T deserialize_value(
369 const uint8_t*& data,
size_t& size,
const Tag<T>&)
371 return serialized::read<T>(data, size);
378 static auto deserialize_value_final(
379 const uint8_t*& data,
size_t& size,
const Tag<ByteRange>&)
387 static auto deserialize_value_final(
388 const uint8_t*& data,
size_t& size,
const Tag<std::vector<uint8_t>>&)
394 template <
typename T>
395 static T deserialize_value_final(
396 const uint8_t*& data,
size_t& size,
const Tag<T>& tag)
398 return deserialize_value(data, size, tag);
402 template <
typename T,
typename... Ts>
403 static auto deserialize_impl(
const uint8_t* data,
size_t size)
405 using StrippedT = std::remove_cvref_t<T>;
407 if constexpr (
sizeof...(Ts) == 0)
409 return std::make_tuple(
410 deserialize_value_final(data, size, Tag<StrippedT>{}));
415 std::make_tuple(deserialize_value(data, size, Tag<StrippedT>{}));
416 return std::tuple_cat(next, deserialize_impl<Ts...>(data, size));
426 template <
typename T,
typename... Ts>
429 if constexpr (
sizeof...(Ts) == 0)
431 return serialize_value_final(std::forward<T>(t));
435 const auto next = serialize_value(std::forward<T>(t));
436 return std::tuple_cat(next,
serialize(std::forward<Ts>(ts)...));
440 template <
typename... Ts>
443 if constexpr (
sizeof...(Ts) == 0)
449 return deserialize_impl<Ts...>(data, size);
455 template <
typename... Us>
461 template <
typename... Ts>
465 Matcher::template correct_size_v<Ts...>,
466 "Incorrect number of arguments for PreciseSerializer");
468 Matcher::template close_enough_v<Ts...>,
469 "Incorrect type of arguments for PreciseSerializer");
474 template <
typename... Ts>
478 Matcher::template correct_size_v<Ts...>,
479 "Incorrect number of results for PreciseSerializer");
481 Matcher::template close_enough_v<Ts...>,
482 "Incorrect type of results for PreciseSerializer");
500 template <
typename... Us>
503 using Tup = std::tuple<Us...>;
507 template <
typename... Ts>
511 Matcher::template correct_size_v<Ts...>,
512 "Incorrect tuple size for TupleSerializer");
514 Matcher::template close_enough_v<Ts...>,
515 "Incorrect tuple type for TupleSerializer");
517 return details::tuple_apply(
522 template <
typename... Ts>
526 Matcher::template correct_size_v<Ts...>,
527 "Incorrect number of args for unpacked TupleSerializer");
529 Matcher::template close_enough_v<Ts...>,
530 "Incorrect arg types for unpacked TupleSerializer");
535 template <
typename... Ts>
539 Matcher::template correct_size_v<Ts...>,
540 "Incorrect number of results for TupleSerializer");
542 Matcher::template close_enough_v<Ts...>,
543 "Incorrect type of results for TupleSerializer");
Definition serializer.h:224
static auto deserialize(const uint8_t *data, size_t size)
Definition serializer.h:441
static auto serialize(T &&t, Ts &&... ts)
Definition serializer.h:427
Definition serializer.h:195
static std::tuple deserialize(const uint8_t *, size_t size)
Definition serializer.h:210
static std::tuple serialize(const Ts &... ts)
Can serialize empty messages, but nothing else.
Definition serializer.h:199
Definition serializer.h:457
static auto deserialize(const uint8_t *data, size_t size)
Definition serializer.h:487
static auto deserialize(const uint8_t *data, size_t size)
Definition serializer.h:475
static auto serialize(Ts &&... ts)
Definition serializer.h:462
static auto deserialize(const uint8_t *data, size_t size)
Definition serializer.h:548
static auto serialize(Ts &&... ts)
Definition serializer.h:523
static auto serialize(std::tuple< Ts... > &&t)
Definition serializer.h:508
static auto deserialize(const uint8_t *data, size_t size)
Definition serializer.h:536
Definition serializer.h:494
void skip(const uint8_t *&data, size_t &size, size_t skip)
Definition serialized.h:166
T read(const uint8_t *&data, size_t &size)
Definition serialized.h:59
Definition serializer.h:15
std::shared_ptr< AbstractSerializedSection > PartialSerialization
Definition serializer.h:137
Definition serializer.h:131
virtual size_t size() const =0
virtual const uint8_t * data() const =0
virtual ~AbstractSerializedSection()=default
Definition serializer.h:27
const size_t size
Definition serializer.h:29
const uint8_t * data
Definition serializer.h:28
Definition serializer.h:141
const T t
Definition serializer.h:142
CopiedSection(const T &t_)
Definition serializer.h:144
virtual size_t size() const override
Definition serializer.h:151
virtual const uint8_t * data() const override
Definition serializer.h:146
Definition serializer.h:176
const size_t s
Definition serializer.h:178
MemoryRegionSection(const uint8_t *data_, size_t size_)
Definition serializer.h:180
const uint8_t *const d
Definition serializer.h:177
virtual const uint8_t * data() const override
Definition serializer.h:183
virtual size_t size() const override
Definition serializer.h:188
Definition serializer.h:159
const T & t
Definition serializer.h:160
virtual const uint8_t * data() const override
Definition serializer.h:164
RawSection(const T &t_)
Definition serializer.h:162
virtual size_t size() const override
Definition serializer.h:169
Definition serializer.h:69
std::remove_cvref_t< typename std::tuple_element_t< I, Tup > > CanonTarget
Definition serializer.h:71
static constexpr bool value
Definition serializer.h:90
std::remove_cvref_t< T > CanonArgument
Definition serializer.h:72
Definition serializer.h:104
static constexpr bool value
Definition serializer.h:105
Definition serializer.h:117
static constexpr bool value
Definition serializer.h:118
Definition serializer.h:60
static constexpr bool value
Definition serializer.h:61
Definition serializer.h:55
static constexpr size_t TupSize
Definition serializer.h:56
static constexpr bool close_enough_v
Definition serializer.h:122
static constexpr bool correct_size_v
Definition serializer.h:65
Definition serializer.h:127