11#define FMT_HEADER_ONLY
12#include <fmt/format.h>
24 const char*
what()
const throw()
override
31 T
peek(
const uint8_t*& data,
size_t& size)
34 static constexpr auto max_size = 32u;
35 static_assert(
sizeof(T) <= max_size);
40 fmt::format(
"Insufficient space (peek<T>: {} < {})", size,
sizeof(T)));
43 static constexpr auto alignment =
alignof(T);
44 if (
reinterpret_cast<std::uintptr_t
>(data) % alignment != 0)
47 alignas(T) uint8_t scratch[max_size];
48 std::memcpy(scratch, data,
sizeof(T));
59 T
read(
const uint8_t*& data,
size_t& size)
64 fmt::format(
"Insufficient space (read<T>: {} < {})", size,
sizeof(T)));
68 std::memcpy(
reinterpret_cast<uint8_t*
>(&v), data,
sizeof(T));
75 inline std::string
read(
const uint8_t*& data,
size_t& size)
77 size_t len = read<size_t>(data, size);
81 fmt::format(
"Insufficient space (read string: {} < {})", size, len));
84 std::string v(data, data + len);
90 inline std::vector<uint8_t>
read(
91 const uint8_t*& data,
size_t& size,
size_t block_size)
93 if (size < block_size)
96 "Insufficient space (read block: {} < {})", size, block_size));
99 std::vector<uint8_t> v(data, data + block_size);
106 void write(uint8_t*& data,
size_t& size,
const T& v)
108 if (size <
sizeof(T))
111 fmt::format(
"Insufficient space (write<T>: {} < {})", size,
sizeof(T)));
114 const auto src =
reinterpret_cast<const uint8_t*
>(&v);
115 std::memcpy(data, src,
sizeof(T));
121 uint8_t*& data,
size_t& size,
const uint8_t* block,
size_t block_size)
123 if (size < block_size)
126 "Insufficient space (write block: {} < {})", size, block_size));
131 std::memcpy(data, block, block_size);
138 inline void write(uint8_t*& data,
size_t& size,
const std::string& v)
140 const auto string_size =
sizeof(size_t) + v.size();
141 if (size < string_size)
144 "Insufficient space (write string: {} < {})", size, string_size));
147 write(data, size, v.size());
148 write(data, size, (
const uint8_t*)v.data(), v.size());
152 T&
overlay(
const uint8_t*& data,
size_t& size)
154 if (size <
sizeof(T))
157 "Insufficient space (overlay<T>: {} < {})", size,
sizeof(T)));
166 inline void skip(
const uint8_t*& data,
size_t& size,
size_t skip)
171 fmt::format(
"Insufficient space (skip: {} < {})", size,
skip));
Definition serialized.h:17
const char * what() const override
Definition serialized.h:24
InsufficientSpaceException(const std::string &msg_)
Definition serialized.h:22
Definition serialized.h:15
void write(uint8_t *&data, size_t &size, const T &v)
Definition serialized.h:106
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
T & overlay(const uint8_t *&data, size_t &size)
Definition serialized.h:152
T peek(const uint8_t *&data, size_t &size)
Definition serialized.h:31