31 operator std::span<const uint8_t>()
const
41 template <
size_t I = 0,
typename F,
typename... Ts>
42 static auto tuple_apply(
const std::tuple<Ts...>& t,
const F& f)
44 if constexpr (
sizeof...(Ts) == 1)
46 return std::make_tuple();
48 else if constexpr (I ==
sizeof...(Ts) - 1)
50 return f(std::get<I>(t));
54 return std::tuple_cat(f(std::get<I>(t)), tuple_apply<I + 1>(t, f));
58 template <
typename Tup>
61 static constexpr size_t TupSize = std::tuple_size_v<Tup>;
63 template <
typename... Ts>
69 template <
typename... Ts>
72 template <
size_t I,
typename T>
76 std::remove_cvref_t<typename std::tuple_element_t<I, Tup>>;
96 std::is_same_v<CanonTarget, CanonArgument> ||
97 (std::is_same_v<CanonTarget, std::vector<uint8_t>> &&
98 std::is_same_v<CanonArgument, ByteRange>) ||
99 (std::is_same_v<CanonTarget, ByteRange> &&
101 (std::is_same_v<CanonTarget, ByteRange> &&
102 (std::is_array_v<CanonArgument> &&
103 std::is_same_v<std::remove_extent_t<CanonArgument>,
ByteRange>));
107 template <
size_t I,
typename... Ts>
113 template <
size_t I,
typename T,
typename... Ts>
120 template <
typename... Ts>
126 template <
typename... Ts>
130 template <
typename... Ts>
138 [[nodiscard]]
virtual const uint8_t*
data()
const = 0;
139 [[nodiscard]]
virtual size_t size()
const = 0;
144 template <
typename T>
151 [[nodiscard]]
const uint8_t*
data()
const override
153 return reinterpret_cast<const uint8_t*
>(&
t);
156 [[nodiscard]]
size_t size()
const override
162 template <
typename T>
169 [[nodiscard]]
const uint8_t*
data()
const override
171 return reinterpret_cast<const uint8_t*
>(&
t);
174 [[nodiscard]]
size_t size()
const override
182 const uint8_t*
const d;
188 [[nodiscard]]
const uint8_t*
data()
const override
193 [[nodiscard]]
size_t size()
const override
203 template <
typename... Ts>
208 "EmptySerializer was given message payload to serialize - can only "
211 return std::make_tuple();
214 template <
typename... Ts>
217 if constexpr (
sizeof...(Ts) == 0)
221 throw std::logic_error(
222 "EmptySerializer asked to deserialize buffer of size " +
223 std::to_string(size) +
", should be empty");
226 return std::make_tuple();
232 template <
size_t N,
size_t... Is>
233 static auto serialize_byte_range_with_index_sequence(
234 const ByteRange (&brs)[N], std::index_sequence<Is...> )
236 return std::make_tuple(
237 std::make_shared<MemoryRegionSection>(brs[Is].data, brs[Is].size)...);
243 static auto serialize_value(
const ByteRange& br)
245 auto cs = std::make_shared<CopiedSection<size_t>>(br.
size);
246 auto bfs = std::make_shared<MemoryRegionSection>(br.
data, br.
size);
247 return std::tuple_cat(std::make_tuple(cs), std::make_tuple(bfs));
253 static auto serialize_value(
const ByteRange (&brs)[N])
255 return serialize_byte_range_with_index_sequence(
256 brs, std::make_index_sequence<N>{});
260 static auto serialize_value(
const std::vector<uint8_t>& vec)
262 auto cs = std::make_shared<CopiedSection<size_t>>(vec.size());
263 auto bfs = std::make_shared<MemoryRegionSection>(vec.data(), vec.size());
264 return std::tuple_cat(std::make_tuple(cs), std::make_tuple(bfs));
270 static auto serialize_value(std::span<uint8_t> s)
272 auto csd = std::make_shared<CopiedSection<uintptr_t>>(
273 reinterpret_cast<std::uintptr_t
>(s.data()));
274 auto css = std::make_shared<CopiedSection<size_t>>(s.size());
275 return std::tuple_cat(std::make_tuple(csd), std::make_tuple(css));
279 static auto serialize_value(
const std::string& s)
281 auto cs = std::make_shared<CopiedSection<size_t>>(s.size());
282 auto bfs = std::make_shared<MemoryRegionSection>(
283 reinterpret_cast<const uint8_t*
>(s.data()), s.size());
284 return std::tuple_cat(std::make_tuple(cs), std::make_tuple(bfs));
288 template <
typename T>
289 requires(std::is_integral_v<T> || std::is_enum_v<T>)
290 static auto serialize_value(
const T& t)
292 auto rs = std::make_shared<RawSection<T>>(t);
293 return std::make_tuple(rs);
301 static auto serialize_value_final(
const ByteRange& br)
303 auto bfs = std::make_shared<MemoryRegionSection>(br.
data, br.
size);
304 return std::make_tuple(bfs);
309 static auto serialize_value_final(
const std::vector<uint8_t>& vec)
311 auto bfs = std::make_shared<MemoryRegionSection>(vec.data(), vec.size());
312 return std::make_tuple(bfs);
316 template <
typename T>
317 static auto serialize_value_final(
const T& t)
319 return serialize_value(t);
324 template <
typename T>
334 const uint8_t*& data,
size_t& size,
const Tag<ByteRange>& )
336 const auto prefixed_size = serialized::read<size_t>(data, size);
343 static std::vector<uint8_t> deserialize_value(
344 const uint8_t*& data,
346 const Tag<std::vector<uint8_t>>& )
348 const auto prefixed_size = serialized::read<size_t>(data, size);
353 static std::span<uint8_t> deserialize_value(
354 const uint8_t*& data,
356 const Tag<std::span<uint8_t>>& )
358 const auto ptr = serialized::read<uintptr_t>(data, size);
359 const auto s = serialized::read<size_t>(data, size);
360 return {
reinterpret_cast<uint8_t*
>(ptr), s};
364 static std::string deserialize_value(
365 const uint8_t*& data,
size_t& size,
const Tag<std::string>& )
367 return serialized::read<std::string>(data, size);
371 template <
typename T>
372 requires(std::is_integral_v<T> || std::is_enum_v<T>)
373 static T deserialize_value(
374 const uint8_t*& data,
size_t& size,
const Tag<T>& )
376 return serialized::read<T>(data, size);
383 static auto deserialize_value_final(
384 const uint8_t*& data,
size_t& size,
const Tag<ByteRange>& )
392 static auto deserialize_value_final(
393 const uint8_t*& data,
395 const Tag<std::vector<uint8_t>>& )
401 template <
typename T>
402 static T deserialize_value_final(
403 const uint8_t*& data,
size_t& size,
const Tag<T>& tag)
405 return deserialize_value(data, size, tag);
409 template <
typename T,
typename... Ts>
410 static auto deserialize_impl(
const uint8_t* data,
size_t size)
412 using StrippedT = std::remove_cvref_t<T>;
414 if constexpr (
sizeof...(Ts) == 0)
416 return std::make_tuple(
417 deserialize_value_final(data, size, Tag<StrippedT>{}));
422 std::make_tuple(deserialize_value(data, size, Tag<StrippedT>{}));
423 return std::tuple_cat(next, deserialize_impl<Ts...>(data, size));
433 template <
typename T,
typename... Ts>
436 if constexpr (
sizeof...(Ts) == 0)
438 return serialize_value_final(std::forward<T>(t));
442 const auto next = serialize_value(std::forward<T>(t));
443 return std::tuple_cat(next,
serialize(std::forward<Ts>(ts)...));
447 template <
typename... Ts>
450 if constexpr (
sizeof...(Ts) == 0)
456 return deserialize_impl<Ts...>(data, size);
462 template <
typename... Us>
468 template <
typename... Ts>
472 Matcher::template correct_size_v<Ts...>,
473 "Incorrect number of arguments for PreciseSerializer");
475 Matcher::template close_enough_v<Ts...>,
476 "Incorrect type of arguments for PreciseSerializer");
481 template <
typename... Ts>
485 Matcher::template correct_size_v<Ts...>,
486 "Incorrect number of results for PreciseSerializer");
488 Matcher::template close_enough_v<Ts...>,
489 "Incorrect type of results for PreciseSerializer");
507 template <
typename... Us>
510 using Tup = std::tuple<Us...>;
514 template <
typename... Ts>
518 Matcher::template correct_size_v<Ts...>,
519 "Incorrect tuple size for TupleSerializer");
521 Matcher::template close_enough_v<Ts...>,
522 "Incorrect tuple type for TupleSerializer");
524 return details::tuple_apply(
529 template <
typename... Ts>
533 Matcher::template correct_size_v<Ts...>,
534 "Incorrect number of args for unpacked TupleSerializer");
536 Matcher::template close_enough_v<Ts...>,
537 "Incorrect arg types for unpacked TupleSerializer");
542 template <
typename... Ts>
546 Matcher::template correct_size_v<Ts...>,
547 "Incorrect number of results for TupleSerializer");
549 Matcher::template close_enough_v<Ts...>,
550 "Incorrect type of results for TupleSerializer");
Definition serializer.h:231
static auto deserialize(const uint8_t *data, size_t size)
Definition serializer.h:448
static auto serialize(T &&t, Ts &&... ts)
Definition serializer.h:434
Definition serializer.h:200
static std::tuple deserialize(const uint8_t *, size_t size)
Definition serializer.h:215
static std::tuple serialize(const Ts &... ts)
Can serialize empty messages, but nothing else.
Definition serializer.h:204
Definition serializer.h:464
static auto deserialize(const uint8_t *data, size_t size)
Definition serializer.h:494
static auto deserialize(const uint8_t *data, size_t size)
Definition serializer.h:482
static auto serialize(Ts &&... ts)
Definition serializer.h:469
static auto deserialize(const uint8_t *data, size_t size)
Definition serializer.h:555
static auto serialize(Ts &&... ts)
Definition serializer.h:530
static auto serialize(std::tuple< Ts... > &&t)
Definition serializer.h:515
static auto deserialize(const uint8_t *data, size_t size)
Definition serializer.h:543
Definition serializer.h:501
void skip(const uint8_t *&data, size_t &size, size_t skip)
Definition serialized.h:165
T read(const uint8_t *&data, size_t &size)
Definition serialized.h:58
Definition serializer.h:15
std::shared_ptr< AbstractSerializedSection > PartialSerialization
Definition serializer.h:142
Definition serializer.h:136
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:146
const T t
Definition serializer.h:147
const uint8_t * data() const override
Definition serializer.h:151
size_t size() const override
Definition serializer.h:156
CopiedSection(const T &t_)
Definition serializer.h:149
Definition serializer.h:181
const size_t s
Definition serializer.h:183
MemoryRegionSection(const uint8_t *data_, size_t size_)
Definition serializer.h:185
const uint8_t *const d
Definition serializer.h:182
const uint8_t * data() const override
Definition serializer.h:188
size_t size() const override
Definition serializer.h:193
Definition serializer.h:164
const T & t
Definition serializer.h:165
RawSection(const T &t_)
Definition serializer.h:167
const uint8_t * data() const override
Definition serializer.h:169
size_t size() const override
Definition serializer.h:174
Definition serializer.h:74
std::remove_cvref_t< typename std::tuple_element_t< I, Tup > > CanonTarget
Definition serializer.h:76
static constexpr bool value
Definition serializer.h:95
std::remove_cvref_t< T > CanonArgument
Definition serializer.h:77
Definition serializer.h:109
static constexpr bool value
Definition serializer.h:110
Definition serializer.h:122
static constexpr bool value
Definition serializer.h:123
Definition serializer.h:65
static constexpr bool value
Definition serializer.h:66
Definition serializer.h:60
static constexpr size_t TupSize
Definition serializer.h:61
static constexpr bool close_enough_v
Definition serializer.h:127
static constexpr bool correct_size_v
Definition serializer.h:70
Definition serializer.h:132