12#define FMT_HEADER_ONLY
13#include <fmt/format.h>
25 [[nodiscard]]
const char*
what() const noexcept
override
32 T
peek(
const uint8_t*& data,
size_t& size)
35 static constexpr auto max_size = 32u;
36 static_assert(
sizeof(T) <= max_size);
41 fmt::format(
"Insufficient space (peek<T>: {} < {})", size,
sizeof(T)));
44 static constexpr auto alignment =
alignof(T);
45 if (
reinterpret_cast<std::uintptr_t
>(data) % alignment != 0)
48 alignas(T) uint8_t scratch[max_size];
49 std::memcpy(scratch, data,
sizeof(T));
58 T
read(
const uint8_t*& data,
size_t& size)
63 fmt::format(
"Insufficient space (read<T>: {} < {})", size,
sizeof(T)));
67 std::memcpy(
reinterpret_cast<uint8_t*
>(&v), data,
sizeof(T));
74 inline std::string
read(
const uint8_t*& data,
size_t& size)
76 auto len = read<size_t>(data, size);
80 fmt::format(
"Insufficient space (read string: {} < {})", size, len));
83 std::string v(data, data + len);
89 inline std::vector<uint8_t>
read(
90 const uint8_t*& data,
size_t& size,
size_t block_size)
92 if (size < block_size)
95 "Insufficient space (read block: {} < {})", size, block_size));
98 std::vector<uint8_t> v(data, data + block_size);
105 void write(uint8_t*& data,
size_t& size,
const T& v)
107 if (size <
sizeof(T))
110 fmt::format(
"Insufficient space (write<T>: {} < {})", size,
sizeof(T)));
113 const auto*
const src =
reinterpret_cast<const uint8_t*
>(&v);
114 std::memcpy(data, src,
sizeof(T));
120 uint8_t*& data,
size_t& size,
const uint8_t* block,
size_t block_size)
122 if (size < block_size)
125 "Insufficient space (write block: {} < {})", size, block_size));
130 std::memcpy(data, block, block_size);
137 inline void write(uint8_t*& data,
size_t& size,
const std::string& v)
139 const auto string_size =
sizeof(size_t) + v.size();
140 if (size < string_size)
143 "Insufficient space (write string: {} < {})", size, string_size));
146 write(data, size, v.size());
147 write(data, size,
reinterpret_cast<const uint8_t*
>(v.data()), v.size());
151 T&
overlay(
const uint8_t*& data,
size_t& size)
153 if (size <
sizeof(T))
156 "Insufficient space (overlay<T>: {} < {})", size,
sizeof(T)));
165 inline void skip(
const uint8_t*& data,
size_t& size,
size_t skip)
170 fmt::format(
"Insufficient space (skip: {} < {})", size,
skip));
Definition serialized.h:18
InsufficientSpaceException(std::string msg_)
Definition serialized.h:23
const char * what() const noexcept override
Definition serialized.h:25
Definition serialized.h:16
void write(uint8_t *&data, size_t &size, const T &v)
Definition serialized.h:105
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
T & overlay(const uint8_t *&data, size_t &size)
Definition serialized.h:151
T peek(const uint8_t *&data, size_t &size)
Definition serialized.h:32