6#include "barretenberg/common/throw_or_abort.hpp"
25 : std::invalid_argument(what_arg)
28 : std::invalid_argument(what_arg)
35 : std::invalid_argument(what_arg)
38 : std::invalid_argument(what_arg)
52 return lhs.high == rhs.high && lhs.low == rhs.low;
65 return lhs.high == rhs.high && lhs.low == rhs.low;
78 : ptr_(
new T{ value })
85 ptr_ = std::unique_ptr<T>{
new T{ *other } };
92 std::swap(ptr_, temp.ptr_);
100 T& operator*() {
return *ptr_; }
102 const T& operator*()
const {
return *ptr_; }
104 T*
const operator->() {
return ptr_.operator->(); }
106 const T*
const operator->()
const {
return ptr_.operator->(); }
108 const T*
const get()
const {
return ptr_.get(); }
110 operator bool()
const {
return (
bool)ptr_; }
115 std::unique_ptr<T> ptr_;
126 template <
typename Serializer>
static void serialize(
const T& value, Serializer& serializer);
132 template <
typename Deserializer>
static T deserialize(Deserializer& deserializer);
139 template <
typename Serializer>
static void serialize(
const std::string& value, Serializer& serializer)
141 serializer.serialize_str(value);
147 template <
typename Serializer>
static void serialize(
const std::monostate&, Serializer& serializer)
149 serializer.serialize_unit();
155 template <
typename Serializer>
static void serialize(
const bool& value, Serializer& serializer)
157 serializer.serialize_bool(value);
163 template <
typename Serializer>
static void serialize(
const char32_t& value, Serializer& serializer)
165 serializer.serialize_char(value);
171 template <
typename Serializer>
static void serialize(
const float& value, Serializer& serializer)
173 serializer.serialize_f32(value);
179 template <
typename Serializer>
static void serialize(
const double& value, Serializer& serializer)
181 serializer.serialize_f64(value);
187 template <
typename Serializer>
static void serialize(
const uint8_t& value, Serializer& serializer)
189 serializer.serialize_u8(value);
195 template <
typename Serializer>
static void serialize(
const uint16_t& value, Serializer& serializer)
197 serializer.serialize_u16(value);
203 template <
typename Serializer>
static void serialize(
const uint32_t& value, Serializer& serializer)
205 serializer.serialize_u32(value);
211 template <
typename Serializer>
static void serialize(
const uint64_t& value, Serializer& serializer)
213 serializer.serialize_u64(value);
219 template <
typename Serializer>
static void serialize(
const uint128_t& value, Serializer& serializer)
221 serializer.serialize_u128(value);
227 template <
typename Serializer>
static void serialize(
const int8_t& value, Serializer& serializer)
229 serializer.serialize_i8(value);
235 template <
typename Serializer>
static void serialize(
const int16_t& value, Serializer& serializer)
237 serializer.serialize_i16(value);
243 template <
typename Serializer>
static void serialize(
const int32_t& value, Serializer& serializer)
245 serializer.serialize_i32(value);
251 template <
typename Serializer>
static void serialize(
const int64_t& value, Serializer& serializer)
253 serializer.serialize_i64(value);
259 template <
typename Serializer>
static void serialize(
const int128_t& value, Serializer& serializer)
261 serializer.serialize_i128(value);
269 template <
typename Serializer>
static void serialize(
const value_ptr<T>& value, Serializer& serializer)
277 template <
typename Serializer>
static void serialize(
const std::optional<T>& option, Serializer& serializer)
279 if (option.has_value()) {
280 serializer.serialize_option_tag(
true);
283 serializer.serialize_option_tag(
false);
289template <
typename T,
typename Allocator>
struct Serializable<std::vector<T, Allocator>> {
290 template <
typename Serializer>
static void serialize(
const std::vector<T, Allocator>& value, Serializer& serializer)
292 serializer.serialize_len(value.size());
293 for (
const T& item : value) {
300template <
typename T, std::
size_t N>
struct Serializable<std::array<T, N>> {
301 template <
typename Serializer>
static void serialize(
const std::array<T, N>& value, Serializer& serializer)
303 for (
const T& item : value) {
310template <
typename K,
typename V,
typename Allocator>
struct Serializable<std::map<K, V, Allocator>> {
311 template <
typename Serializer>
static void serialize(
const std::map<K, V, Allocator>& value, Serializer& serializer)
313 serializer.serialize_len(value.size());
314 std::vector<size_t> offsets;
315 for (
const auto& item : value) {
316 if constexpr (Serializer::enforce_strict_map_ordering) {
317 offsets.push_back(serializer.get_buffer_offset());
322 if constexpr (Serializer::enforce_strict_map_ordering) {
323 serializer.sort_last_entries(std::move(offsets));
330 template <
typename Serializer>
static void serialize(
const std::tuple<Types...>& value, Serializer& serializer)
340 template <
typename Serializer>
static void serialize(
const std::variant<Types...>& value, Serializer& serializer)
343 serializer.serialize_variant_index(value.index());
346 [&serializer](
const auto& arg) {
347 using T =
typename std::decay<
decltype(arg)>::type;
358 template <
typename Deserializer>
static std::string deserialize(Deserializer& deserializer)
360 return deserializer.deserialize_str();
366 template <
typename Deserializer>
static std::monostate deserialize(Deserializer& deserializer)
368 return deserializer.deserialize_unit();
374 template <
typename Deserializer>
static bool deserialize(Deserializer& deserializer)
376 return deserializer.deserialize_bool();
382 template <
typename Deserializer>
static float deserialize(Deserializer& deserializer)
384 return deserializer.deserialize_f32();
390 template <
typename Deserializer>
static double deserialize(Deserializer& deserializer)
392 return deserializer.deserialize_f64();
398 template <
typename Deserializer>
static char32_t deserialize(Deserializer& deserializer)
400 return deserializer.deserialize_char();
406 template <
typename Deserializer>
static uint8_t deserialize(Deserializer& deserializer)
408 return deserializer.deserialize_u8();
414 template <
typename Deserializer>
static uint16_t deserialize(Deserializer& deserializer)
416 return deserializer.deserialize_u16();
422 template <
typename Deserializer>
static uint32_t deserialize(Deserializer& deserializer)
424 return deserializer.deserialize_u32();
430 template <
typename Deserializer>
static uint64_t deserialize(Deserializer& deserializer)
432 return deserializer.deserialize_u64();
438 template <
typename Deserializer>
static uint128_t deserialize(Deserializer& deserializer)
440 return deserializer.deserialize_u128();
446 template <
typename Deserializer>
static int8_t deserialize(Deserializer& deserializer)
448 return deserializer.deserialize_i8();
454 template <
typename Deserializer>
static int16_t deserialize(Deserializer& deserializer)
456 return deserializer.deserialize_i16();
462 template <
typename Deserializer>
static int32_t deserialize(Deserializer& deserializer)
464 return deserializer.deserialize_i32();
470 template <
typename Deserializer>
static int64_t deserialize(Deserializer& deserializer)
472 return deserializer.deserialize_i64();
478 template <
typename Deserializer>
static int128_t deserialize(Deserializer& deserializer)
480 return deserializer.deserialize_i128();
488 template <
typename Deserializer>
static value_ptr<T> deserialize(Deserializer& deserializer)
496 template <
typename Deserializer>
static std::optional<T> deserialize(Deserializer& deserializer)
498 auto tag = deserializer.deserialize_option_tag();
508template <
typename T,
typename Allocator>
struct Deserializable<std::vector<T, Allocator>> {
509 template <
typename Deserializer>
static std::vector<T> deserialize(Deserializer& deserializer)
511 std::vector<T> result;
512 size_t len = deserializer.deserialize_len();
513 for (
size_t i = 0; i < len; i++) {
522 template <
typename Deserializer>
static std::map<K, V> deserialize(Deserializer& deserializer)
524 std::map<K, V> result;
525 size_t len = deserializer.deserialize_len();
526 std::optional<std::tuple<size_t, size_t>> previous_key_slice;
527 for (
size_t i = 0; i < len; i++) {
528 if constexpr (Deserializer::enforce_strict_map_ordering) {
529 auto start = deserializer.get_buffer_offset();
531 auto end = deserializer.get_buffer_offset();
532 if (previous_key_slice.has_value()) {
533 deserializer.check_that_key_slices_are_increasing(previous_key_slice.value(), { start, end });
535 previous_key_slice = { start, end };
537 result.insert({ key, value });
541 result.insert({ key, value });
550 template <
typename Deserializer>
static std::array<T, N> deserialize(Deserializer& deserializer)
552 std::array<T, N> result;
553 for (T& item : result) {
562 template <
typename Deserializer>
static std::tuple<Types...> deserialize(Deserializer& deserializer)
572 template <
typename Deserializer>
static std::variant<Types...> deserialize(Deserializer& deserializer)
577 using Case = std::function<std::variant<Types...>(Deserializer&)>;
578 auto make_case = [](
auto tag) -> Case {
581 using T =
typename decltype(tag)::type;
587 static const std::array<Case,
sizeof...(Types)> cases = { make_case(std::common_type<Types>{})... };
590 auto index = deserializer.deserialize_variant_index();
591 if (index > cases.size()) {
592 throw_or_abort(
"Unknown variant index for enum");
594 return cases.at(index)(deserializer);
Definition: serde.hpp:131
Definition: serde.hpp:125