barretenberg
Loading...
Searching...
No Matches
bincode.hpp
1// Copyright (c) Facebook, Inc. and its affiliates
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4#pragma once
5
6#include <cstdint>
7#include <limits>
8
9#include "binary.hpp"
10#include "serde.hpp"
11
12// Maximum length supported in practice (e.g. Java).
13constexpr size_t BINCODE_MAX_LENGTH = (1ull << 31) - 1;
14
15namespace serde {
16
17class BincodeSerializer : public BinarySerializer<BincodeSerializer> {
19
20 public:
22 : Parent(SIZE_MAX)
23 {}
24
25 void serialize_f32(float value);
26 void serialize_f64(double value);
27 void serialize_len(size_t value);
28 void serialize_variant_index(uint32_t value);
29
30 static constexpr bool enforce_strict_map_ordering = false;
31};
32
33class BincodeDeserializer : public BinaryDeserializer<BincodeDeserializer> {
35
36 public:
37 BincodeDeserializer(std::vector<uint8_t> bytes)
38 : Parent(std::move(bytes), SIZE_MAX)
39 {}
40
41 float deserialize_f32();
42 double deserialize_f64();
43 size_t deserialize_len();
44 uint32_t deserialize_variant_index();
45
46 static constexpr bool enforce_strict_map_ordering = false;
47};
48
49// Native floats and doubles must be IEEE-754 values of the expected size.
50static_assert(std::numeric_limits<float>::is_iec559);
51static_assert(std::numeric_limits<double>::is_iec559);
52static_assert(sizeof(float) == sizeof(uint32_t));
53static_assert(sizeof(double) == sizeof(uint64_t));
54
55inline void BincodeSerializer::serialize_f32(float value)
56{
57 Parent::serialize_u32(*reinterpret_cast<uint32_t*>(&value));
58}
59
60inline void BincodeSerializer::serialize_f64(double value)
61{
62 Parent::serialize_u64(*reinterpret_cast<uint64_t*>(&value));
63}
64
65inline void BincodeSerializer::serialize_len(size_t value)
66{
67 if (value > BINCODE_MAX_LENGTH) {
68 throw_or_abort("Length is too large");
69 }
70 Parent::serialize_u64((uint64_t)value);
71}
72
73inline void BincodeSerializer::serialize_variant_index(uint32_t value)
74{
75 Parent::serialize_u32((uint32_t)value);
76}
77
78inline float BincodeDeserializer::deserialize_f32()
79{
80 auto value = Parent::deserialize_u32();
81 return *reinterpret_cast<float*>(&value);
82}
83
84inline double BincodeDeserializer::deserialize_f64()
85{
86 auto value = Parent::deserialize_u64();
87 return *reinterpret_cast<double*>(&value);
88}
89
90inline size_t BincodeDeserializer::deserialize_len()
91{
92 auto value = (size_t)Parent::deserialize_u64();
93 if (value > BINCODE_MAX_LENGTH) {
94 throw_or_abort("Length is too large");
95 }
96 return (size_t)value;
97}
98
99inline uint32_t BincodeDeserializer::deserialize_variant_index()
100{
101 return Parent::deserialize_u32();
102}
103
104} // end of namespace serde
Definition: binary.hpp:52
Definition: binary.hpp:14
Definition: bincode.hpp:33
Definition: bincode.hpp:17