9#include <small_vector/SmallVector.h>
19 using WriterData = llvm_vecsmall::SmallVector<uint8_t, 64>;
24 void serialise_entry(
const T& t)
26 size_t size_before = buf.size();
27 buf.resize(buf.size() +
sizeof(T));
29 auto data_ = buf.data() + size_before;
30 auto size_ = buf.size() - size_before;
35 void serialise_vector(
const T& entry)
37 size_t entry_size_bytes =
sizeof(
typename T::value_type) * entry.size();
38 size_t size_before = buf.size();
40 buf.resize(buf.size() + entry_size_bytes);
42 auto data_ = buf.data() + size_before;
43 auto size_ = buf.size() - size_before;
47 reinterpret_cast<const uint8_t*
>(entry.data()),
51 template <
typename T,
size_t SIZE>
52 void serialise_array(
const std::array<T, SIZE>& array)
54 constexpr size_t array_size = SIZE *
sizeof(T);
55 size_t size_before = buf.size();
56 buf.resize(buf.size() + array_size);
58 auto data_ = buf.data() + size_before;
59 auto size_ = buf.size() - size_before;
63 reinterpret_cast<const uint8_t*
>(array.data()),
67 void serialise_string(
const std::string& str)
69 size_t size_before = buf.size();
70 buf.resize(buf.size() +
sizeof(
size_t) + str.size());
72 auto data_ = buf.data() + size_before;
73 auto size_ = buf.size() - size_before;
85 std::is_same_v<T, ccf::kv::serialisers::SerialisedEntry>)
87 serialise_entry(entry.size() *
sizeof(
typename T::value_type));
90 serialise_vector(entry);
93 else if constexpr (std::is_same_v<T, ccf::crypto::Sha256Hash>)
95 serialise_array(entry.h);
97 else if constexpr (std::is_same_v<T, EntryType>)
99 serialise_entry(
static_cast<uint8_t
>(entry));
101 else if constexpr (std::is_same_v<T, std::string>)
103 serialise_string(entry);
105 else if constexpr (std::is_integral_v<T>)
107 serialise_entry(entry);
123 return {buf.data(), buf.data() + buf.size()};
136 template <
typename T>
141 const auto entry = serialized::read<T>(data, remainder);
152 auto entry_size = read_entry<size_t>();
154 if (remainder < entry_size)
156 throw std::runtime_error(fmt::format(
157 "Expected {} byte entry, found only {}", entry_size, remainder));
170 RawReader(
const uint8_t* data_in_ptr =
nullptr,
size_t data_in_size = 0)
172 init(data_in_ptr, data_in_size);
175 void init(
const uint8_t* data_in_ptr,
size_t data_in_size)
182 template <
typename T>
187 std::is_same_v<T, ccf::kv::serialisers::SerialisedEntry>)
189 size_t entry_offset = 0;
192 T ret(entry_size /
sizeof(
typename T::value_type));
193 auto data_ =
reinterpret_cast<uint8_t*
>(ret.data());
194 auto size_ = entry_size;
202 auto data_ =
reinterpret_cast<uint8_t*
>(ret.data());
203 constexpr size_t size = ret.size() *
sizeof(
typename T::value_type);
210 else if constexpr (std::is_same_v<T, ccf::kv::EntryType>)
212 uint8_t entry_type = read_entry<uint8_t>();
214 throw std::logic_error(
215 fmt::format(
"Invalid EntryType: {}", entry_type));
219 else if constexpr (std::is_same_v<T, std::string>)
221 size_t entry_offset = 0;
226 else if constexpr (std::is_integral_v<T>)
228 return read_entry<T>();
234 "Can't deserialise this type");
Definition raw_serialise.h:128
const uint8_t * data_ptr
Definition raw_serialise.h:130
RawReader(const RawReader &other)=delete
size_t read_size_prefixed_entry(size_t &start_offset)
Definition raw_serialise.h:149
bool is_eos()
Definition raw_serialise.h:238
RawReader(const uint8_t *data_in_ptr=nullptr, size_t data_in_size=0)
Definition raw_serialise.h:170
RawReader & operator=(const RawReader &other)=delete
size_t data_size
Definition raw_serialise.h:132
T read_entry()
Definition raw_serialise.h:137
T read_next()
Definition raw_serialise.h:183
void init(const uint8_t *data_in_ptr, size_t data_in_size)
Definition raw_serialise.h:175
size_t data_offset
Definition raw_serialise.h:131
Definition raw_serialise.h:15
void append(const T &entry)
Definition raw_serialise.h:81
std::vector< uint8_t > get_raw_data()
Definition raw_serialise.h:121
void clear()
Definition raw_serialise.h:116
Definition app_interface.h:19
EntryType
Definition kv_types.h:269
void write(uint8_t *&data, size_t &size, const T &v)
Definition serialized.h:106