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