xrpld
Loading...
Searching...
No Matches
Serializer.h
1#pragma once
2
3#include <xrpl/basics/Blob.h>
4#include <xrpl/basics/Buffer.h>
5#include <xrpl/basics/Slice.h>
6#include <xrpl/basics/base_uint.h>
7#include <xrpl/basics/contract.h>
8#include <xrpl/basics/safe_cast.h>
9#include <xrpl/beast/utility/instrumentation.h>
10#include <xrpl/protocol/HashPrefix.h>
11#include <xrpl/protocol/SField.h>
12
13#include <cstdint>
14#include <cstring>
15#include <stdexcept>
16#include <string>
17#include <type_traits>
18
19namespace xrpl {
20
22{
23private:
24 // DEPRECATED
26
27public:
28 explicit Serializer(int n = 256)
29 {
30 data_.reserve(n);
31 }
32
34 {
35 data_.resize(size);
36
37 if (size != 0u)
38 {
39 XRPL_ASSERT(data, "xrpl::Serializer::Serializer(void const*) : non-null input");
40 std::memcpy(data_.data(), data, size);
41 }
42 }
43
44 [[nodiscard]] Slice
45 slice() const noexcept
46 {
47 return Slice(data_.data(), data_.size());
48 }
49
50 [[nodiscard]] std::size_t
51 size() const noexcept
52 {
53 return data_.size();
54 }
55
56 [[nodiscard]] void const*
57 data() const noexcept
58 {
59 return data_.data();
60 }
61
62 // assemble functions
63 int
64 add8(unsigned char i);
65 int
67
68 template <typename T>
70 int
71 add32(T i)
72 {
73 int const ret = data_.size();
74 data_.push_back(static_cast<unsigned char>((i >> 24) & 0xff));
75 data_.push_back(static_cast<unsigned char>((i >> 16) & 0xff));
76 data_.push_back(static_cast<unsigned char>((i >> 8) & 0xff));
77 data_.push_back(static_cast<unsigned char>(i & 0xff));
78 return ret;
79 }
80
81 int
83
84 template <typename T>
86 int
87 add64(T i)
88 {
89 int const ret = data_.size();
90 data_.push_back(static_cast<unsigned char>((i >> 56) & 0xff));
91 data_.push_back(static_cast<unsigned char>((i >> 48) & 0xff));
92 data_.push_back(static_cast<unsigned char>((i >> 40) & 0xff));
93 data_.push_back(static_cast<unsigned char>((i >> 32) & 0xff));
94 data_.push_back(static_cast<unsigned char>((i >> 24) & 0xff));
95 data_.push_back(static_cast<unsigned char>((i >> 16) & 0xff));
96 data_.push_back(static_cast<unsigned char>((i >> 8) & 0xff));
97 data_.push_back(static_cast<unsigned char>(i & 0xff));
98 return ret;
99 }
100
101 template <typename Integer>
102 int addInteger(Integer);
103
104 template <std::size_t Bits, class Tag>
105 int
107 {
108 return addRaw(v.data(), v.size());
109 }
110
111 int
112 addRaw(Blob const& vector);
113 int
115 int
116 addRaw(void const* ptr, int len);
117 int
118 addRaw(Serializer const& s);
119
120 int
121 addVL(Blob const& vector);
122 int
123 addVL(Slice const& slice);
124 template <class Iter>
125 int
126 addVL(Iter begin, Iter end, int len);
127 int
128 addVL(void const* ptr, int len);
129
130 // disassemble functions
131 bool
132 get8(int&, int offset) const;
133
134 template <typename Integer>
135 bool
136 getInteger(Integer& number, int offset)
137 {
138 static auto const kBytes = sizeof(Integer);
139 if ((offset + kBytes) > data_.size())
140 return false;
141 number = 0;
142
143 auto ptr = &data_[offset];
144 for (auto i = 0; i < kBytes; ++i)
145 {
146 if (i)
147 number <<= 8;
148 number |= *ptr++;
149 }
150 return true;
151 }
152
153 template <std::size_t Bits, typename Tag = void>
154 bool
156 {
157 auto success = (offset + (Bits / 8)) <= data_.size();
158 if (success)
159 memcpy(data.begin(), &(data_.front()) + offset, (Bits / 8));
160 return success;
161 }
162
163 int
164 addFieldID(int type, int name);
165 int
167 {
168 return addFieldID(safeCast<int>(type), name);
169 }
170
171 // DEPRECATED
172 [[nodiscard]] uint256
173 getSHA512Half() const;
174
175 // totality functions
176 [[nodiscard]] Blob const&
177 peekData() const
178 {
179 return data_;
180 }
181 [[nodiscard]] Blob
182 getData() const
183 {
184 return data_;
185 }
186 Blob&
188 {
189 return data_;
190 }
191
192 [[nodiscard]] int
194 {
195 return data_.size();
196 }
197 [[nodiscard]] void const*
199 {
200 return data_.data();
201 }
202 void*
204 {
205 return data_.data();
206 }
207 [[nodiscard]] int
208 getLength() const
209 {
210 return data_.size();
211 }
212 [[nodiscard]] std::string
213 getString() const
214 {
215 return std::string(static_cast<char const*>(getDataPtr()), size());
216 }
217 void
219 {
220 data_.clear();
221 }
222 bool
223 chop(int num);
224
225 // vector-like functions
226 Blob ::iterator
228 {
229 return data_.begin();
230 }
231 Blob ::iterator
233 {
234 return data_.end();
235 }
236 [[nodiscard]] Blob ::const_iterator
237 begin() const
238 {
239 return data_.begin();
240 }
241 [[nodiscard]] Blob ::const_iterator
242 end() const
243 {
244 return data_.end();
245 }
246 void
247 reserve(size_t n)
248 {
249 data_.reserve(n);
250 }
251 void
252 resize(size_t n)
253 {
254 data_.resize(n);
255 }
256 [[nodiscard]] size_t
257 capacity() const
258 {
259 return data_.capacity();
260 }
261
262 bool
263 operator==(Blob const& v) const
264 {
265 return v == data_;
266 }
267 bool
268 operator==(Serializer const& v) const
269 {
270 return v.data_ == data_;
271 }
272
273 static int
274 decodeLengthLength(int b1);
275 static int
276 decodeVLLength(int b1);
277 static int
278 decodeVLLength(int b1, int b2);
279 static int
280 decodeVLLength(int b1, int b2, int b3);
281
282private:
283 static int
284 encodeLengthLength(int length); // length to encode length
285 int
286 addEncoded(int length);
287};
288
289template <class Iter>
290int
291Serializer::addVL(Iter begin, Iter end, int len)
292{
293 int const ret = addEncoded(len);
294 for (; begin != end; ++begin)
295 {
296 addRaw(begin->data(), begin->size());
297#ifndef NDEBUG
298 len -= begin->size();
299#endif
300 }
301 XRPL_ASSERT(len == 0, "xrpl::Serializer::addVL : length matches distance");
302 return ret;
303}
304
305//------------------------------------------------------------------------------
306
307// DEPRECATED
308// Transitional adapter to new serialization interfaces
310{
311private:
315
316public:
317 SerialIter(void const* data, std::size_t size) noexcept;
318
319 SerialIter(Slice const& slice) : SerialIter(slice.data(), slice.size())
320 {
321 }
322
323 // Infer the size of the data based on the size of the passed array.
324 template <int N>
325 explicit SerialIter(std::uint8_t const (&data)[N]) : SerialIter(&data[0], N)
326 {
327 static_assert(N > 0);
328 }
329
330 [[nodiscard]] bool
331 empty() const noexcept
332 {
333 return remain_ == 0;
334 }
335
336 void
337 reset() noexcept;
338
339 [[nodiscard]] int
340 getBytesLeft() const noexcept
341 {
342 return static_cast<int>(remain_);
343 }
344
345 // get functions throw on error
346 unsigned char
347 get8();
348
350 get16();
351
353 get32();
355 geti32();
356
358 get64();
360 geti64();
361
362 template <std::size_t Bits, class Tag = void>
364 getBitString();
365
366 uint128
368 {
369 return getBitString<128>();
370 }
371
372 uint160
374 {
375 return getBitString<160>();
376 }
377
378 uint192
380 {
381 return getBitString<192>();
382 }
383
384 uint256
386 {
387 return getBitString<256>();
388 }
389
390 void
391 getFieldID(int& type, int& name);
392
393 // Returns the size of the VL if the
394 // next object is a VL. Advances the iterator
395 // to the beginning of the VL.
396 int
398
399 Slice
400 getSlice(std::size_t bytes);
401
402 // VFALCO DEPRECATED Returns a copy
403 Blob
404 getRaw(int size);
405
406 // VFALCO DEPRECATED Returns a copy
407 Blob
408 getVL();
409
410 void
411 skip(int num);
412
413 Buffer
414 getVLBuffer();
415
416 template <class T>
417 T
418 getRawHelper(int size);
419};
420
421template <std::size_t Bits, class Tag>
422BaseUInt<Bits, Tag>
424{
425 auto const n = Bits / 8;
426
427 if (remain_ < n)
428 Throw<std::runtime_error>("invalid SerialIter getBitString");
429
430 auto const x = p_;
431
432 p_ += n;
433 used_ += n;
434 remain_ -= n;
435
437}
438
439} // namespace xrpl
Integers of any length that is a multiple of 32-bits.
Definition base_uint.h:82
static BaseUInt fromVoid(void const *data)
Definition base_uint.h:339
pointer data()
Definition base_uint.h:117
static constexpr std::size_t size()
Definition base_uint.h:548
Like std::vector<char> but better.
Definition Buffer.h:19
int getBytesLeft() const noexcept
Definition Serializer.h:340
SerialIter(Slice const &slice)
Definition Serializer.h:319
BaseUInt< Bits, Tag > getBitString()
Definition Serializer.h:423
bool empty() const noexcept
Definition Serializer.h:331
uint160 get160()
Definition Serializer.h:373
Slice getSlice(std::size_t bytes)
void getFieldID(int &type, int &name)
std::size_t remain_
Definition Serializer.h:313
SerialIter(void const *data, std::size_t size) noexcept
uint256 get256()
Definition Serializer.h:385
std::uint8_t const * p_
Definition Serializer.h:312
uint128 get128()
Definition Serializer.h:367
std::size_t used_
Definition Serializer.h:314
SerialIter(std::uint8_t const (&data)[N])
Definition Serializer.h:325
uint192 get192()
Definition Serializer.h:379
int addFieldID(int type, int name)
Blob::const_iterator begin() const
Definition Serializer.h:237
void const * getDataPtr() const
Definition Serializer.h:198
int addInteger(Integer)
Blob const & peekData() const
Definition Serializer.h:177
bool getInteger(Integer &number, int offset)
Definition Serializer.h:136
int addBitString(BaseUInt< Bits, Tag > const &v)
Definition Serializer.h:106
Blob::iterator begin()
Definition Serializer.h:227
bool getBitString(BaseUInt< Bits, Tag > &data, int offset) const
Definition Serializer.h:155
size_t capacity() const
Definition Serializer.h:257
std::string getString() const
Definition Serializer.h:213
int addVL(Blob const &vector)
Blob::iterator end()
Definition Serializer.h:232
int getLength() const
Definition Serializer.h:208
Serializer(void const *data, std::size_t size)
Definition Serializer.h:33
static int decodeLengthLength(int b1)
int addFieldID(SerializedTypeID type, int name)
Definition Serializer.h:166
int addRaw(Blob const &vector)
Slice slice() const noexcept
Definition Serializer.h:45
bool operator==(Blob const &v) const
Definition Serializer.h:263
bool operator==(Serializer const &v) const
Definition Serializer.h:268
void * getDataPtr()
Definition Serializer.h:203
Blob getData() const
Definition Serializer.h:182
std::size_t size() const noexcept
Definition Serializer.h:51
bool get8(int &, int offset) const
int getDataLength() const
Definition Serializer.h:193
Blob::const_iterator end() const
Definition Serializer.h:242
static int encodeLengthLength(int length)
Serializer(int n=256)
Definition Serializer.h:28
void reserve(size_t n)
Definition Serializer.h:247
void resize(size_t n)
Definition Serializer.h:252
void const * data() const noexcept
Definition Serializer.h:57
An immutable linear range of bytes.
Definition Slice.h:28
T is_same_v
T memcpy(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
BaseUInt< 192 > uint192
Definition base_uint.h:581
BaseUInt< 128 > uint128
Definition base_uint.h:578
constexpr Dest safeCast(Src s) noexcept
Definition safe_cast.h:21
BaseUInt< 160 > uint160
Definition base_uint.h:579
SerializedTypeID
Definition SField.h:94
HashPrefix
Prefix for hashing functions.
Definition HashPrefix.h:35
std::vector< unsigned char > Blob
Storage for linear binary data.
Definition Blob.h:11
BaseUInt< 256 > uint256
Definition base_uint.h:580
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
Definition contract.h:52