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