rippled
Serializer.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_PROTOCOL_SERIALIZER_H_INCLUDED
21 #define RIPPLE_PROTOCOL_SERIALIZER_H_INCLUDED
22 
23 #include <ripple/basics/Blob.h>
24 #include <ripple/basics/Buffer.h>
25 #include <ripple/basics/Slice.h>
26 #include <ripple/basics/base_uint.h>
27 #include <ripple/basics/contract.h>
28 #include <ripple/basics/safe_cast.h>
29 #include <ripple/protocol/HashPrefix.h>
30 #include <ripple/protocol/SField.h>
31 #include <cassert>
32 #include <cstdint>
33 #include <cstring>
34 #include <iomanip>
35 #include <type_traits>
36 
37 namespace ripple {
38 
40 {
41 private:
42  // DEPRECATED
44 
45 public:
46  explicit Serializer(int n = 256)
47  {
48  mData.reserve(n);
49  }
50 
52  {
53  mData.resize(size);
54 
55  if (size)
56  {
57  assert(data != nullptr);
59  }
60  }
61 
62  Slice
63  slice() const noexcept
64  {
65  return Slice(mData.data(), mData.size());
66  }
67 
69  size() const noexcept
70  {
71  return mData.size();
72  }
73 
74  void const*
75  data() const noexcept
76  {
77  return mData.data();
78  }
79 
80  // assemble functions
81  int
82  add8(unsigned char i);
83  int
85  int
86  add32(std::uint32_t i); // ledger indexes, account sequence, timestamps
87  int
88  add32(HashPrefix p);
89  int
90  add64(std::uint64_t i); // native currency amounts
91 
92  template <typename Integer>
93  int addInteger(Integer);
94 
95  template <std::size_t Bits, class Tag>
96  int
98  {
99  return addRaw(v.data(), v.size());
100  }
101 
102  int
103  addRaw(Blob const& vector);
104  int
105  addRaw(Slice slice);
106  int
107  addRaw(const void* ptr, int len);
108  int
109  addRaw(const Serializer& s);
110 
111  int
112  addVL(Blob const& vector);
113  int
114  addVL(Slice const& slice);
115  template <class Iter>
116  int
117  addVL(Iter begin, Iter end, int len);
118  int
119  addVL(const void* ptr, int len);
120 
121  // disassemble functions
122  bool
123  get8(int&, int offset) const;
124 
125  template <typename Integer>
126  bool
127  getInteger(Integer& number, int offset)
128  {
129  static const auto bytes = sizeof(Integer);
130  if ((offset + bytes) > mData.size())
131  return false;
132  number = 0;
133 
134  auto ptr = &mData[offset];
135  for (auto i = 0; i < bytes; ++i)
136  {
137  if (i)
138  number <<= 8;
139  number |= *ptr++;
140  }
141  return true;
142  }
143 
144  template <std::size_t Bits, typename Tag = void>
145  bool
147  {
148  auto success = (offset + (Bits / 8)) <= mData.size();
149  if (success)
150  memcpy(data.begin(), &(mData.front()) + offset, (Bits / 8));
151  return success;
152  }
153 
154  int
155  addFieldID(int type, int name);
156  int
157  addFieldID(SerializedTypeID type, int name)
158  {
159  return addFieldID(safe_cast<int>(type), name);
160  }
161 
162  // DEPRECATED
163  uint256
164  getSHA512Half() const;
165 
166  // totality functions
167  Blob const&
168  peekData() const
169  {
170  return mData;
171  }
172  Blob
173  getData() const
174  {
175  return mData;
176  }
177  Blob&
179  {
180  return mData;
181  }
182 
183  int
185  {
186  return mData.size();
187  }
188  const void*
189  getDataPtr() const
190  {
191  return mData.data();
192  }
193  void*
195  {
196  return mData.data();
197  }
198  int
199  getLength() const
200  {
201  return mData.size();
202  }
204  getString() const
205  {
206  return std::string(static_cast<const char*>(getDataPtr()), size());
207  }
208  void
210  {
211  mData.clear();
212  }
213  bool
214  chop(int num);
215 
216  // vector-like functions
217  Blob ::iterator
219  {
220  return mData.begin();
221  }
222  Blob ::iterator
223  end()
224  {
225  return mData.end();
226  }
227  Blob ::const_iterator
228  begin() const
229  {
230  return mData.begin();
231  }
232  Blob ::const_iterator
233  end() const
234  {
235  return mData.end();
236  }
237  void
238  reserve(size_t n)
239  {
240  mData.reserve(n);
241  }
242  void
243  resize(size_t n)
244  {
245  mData.resize(n);
246  }
247  size_t
248  capacity() const
249  {
250  return mData.capacity();
251  }
252 
253  bool
254  operator==(Blob const& v) const
255  {
256  return v == mData;
257  }
258  bool
259  operator!=(Blob const& v) const
260  {
261  return v != mData;
262  }
263  bool
264  operator==(const Serializer& v) const
265  {
266  return v.mData == mData;
267  }
268  bool
269  operator!=(const Serializer& v) const
270  {
271  return v.mData != mData;
272  }
273 
274  static int
275  decodeLengthLength(int b1);
276  static int
277  decodeVLLength(int b1);
278  static int
279  decodeVLLength(int b1, int b2);
280  static int
281  decodeVLLength(int b1, int b2, int b3);
282 
283 private:
284  static int
285  encodeLengthLength(int length); // length to encode length
286  int
287  addEncoded(int length);
288 };
289 
290 template <class Iter>
291 int
292 Serializer::addVL(Iter begin, Iter end, int len)
293 {
294  int ret = addEncoded(len);
295  for (; begin != end; ++begin)
296  {
297  addRaw(begin->data(), begin->size());
298 #ifndef NDEBUG
299  len -= begin->size();
300 #endif
301  }
302  assert(len == 0);
303  return ret;
304 }
305 
306 //------------------------------------------------------------------------------
307 
308 // DEPRECATED
309 // Transitional adapter to new serialization interfaces
311 {
312 private:
313  std::uint8_t const* p_;
316 
317 public:
318  SerialIter(void const* data, std::size_t size) noexcept;
319 
320  SerialIter(Slice const& slice) : SerialIter(slice.data(), slice.size())
321  {
322  }
323 
324  // Infer the size of the data based on the size of the passed array.
325  template <int N>
326  explicit SerialIter(std::uint8_t const (&data)[N]) : SerialIter(&data[0], N)
327  {
328  static_assert(N > 0, "");
329  }
330 
332  empty() const noexcept
333  {
334  return remain_ == 0;
335  }
336 
337  void
338  reset() noexcept;
339 
340  int
341  getBytesLeft() const noexcept
342  {
343  return static_cast<int>(remain_);
344  }
345 
346  // get functions throw on error
347  unsigned char
348  get8();
349 
351  get16();
352 
354  get32();
355 
357  get64();
358 
359  template <std::size_t Bits, class Tag = void>
361  getBitString();
362 
363  uint128
365  {
366  return getBitString<128>();
367  }
368 
369  uint160
371  {
372  return getBitString<160>();
373  }
374 
375  uint256
377  {
378  return getBitString<256>();
379  }
380 
381  void
382  getFieldID(int& type, int& name);
383 
384  // Returns the size of the VL if the
385  // next object is a VL. Advances the iterator
386  // to the beginning of the VL.
387  int
388  getVLDataLength();
389 
390  Slice
391  getSlice(std::size_t bytes);
392 
393  // VFALCO DEPRECATED Returns a copy
394  Blob
395  getRaw(int size);
396 
397  // VFALCO DEPRECATED Returns a copy
398  Blob
399  getVL();
400 
401  void
402  skip(int num);
403 
404  Buffer
405  getVLBuffer();
406 
407  template <class T>
408  T
409  getRawHelper(int size);
410 };
411 
412 template <std::size_t Bits, class Tag>
413 base_uint<Bits, Tag>
415 {
416  auto const n = Bits / 8;
417 
418  if (remain_ < n)
419  Throw<std::runtime_error>("invalid SerialIter getBitString");
420 
421  auto const x = p_;
422 
423  p_ += n;
424  used_ += n;
425  remain_ -= n;
426 
428 }
429 
430 } // namespace ripple
431 
432 #endif
std::vector::resize
T resize(T... args)
ripple::Serializer::end
Blob ::iterator end()
Definition: Serializer.h:223
ripple::Serializer::chop
bool chop(int num)
Definition: Serializer.cpp:184
ripple::SerialIter::SerialIter
SerialIter(Slice const &slice)
Definition: Serializer.h:320
std::string
STL class.
ripple::Serializer::mData
Blob mData
Definition: Serializer.h:43
cstring
ripple::Serializer::reserve
void reserve(size_t n)
Definition: Serializer.h:238
ripple::Serializer::addFieldID
int addFieldID(int type, int name)
Definition: Serializer.cpp:132
ripple::Serializer::addInteger
int addInteger(Integer)
ripple::Serializer::modData
Blob & modData()
Definition: Serializer.h:178
ripple::Slice
An immutable linear range of bytes.
Definition: Slice.h:44
ripple::Serializer::erase
void erase()
Definition: Serializer.h:209
std::vector::reserve
T reserve(T... args)
std::vector< unsigned char >
std::vector::size
T size(T... args)
ripple::Serializer::getString
std::string getString() const
Definition: Serializer.h:204
ripple::SerializedTypeID
SerializedTypeID
Definition: SField.h:52
ripple::Serializer::add8
int add8(unsigned char i)
Definition: Serializer.cpp:166
ripple::Serializer::getDataPtr
void * getDataPtr()
Definition: Serializer.h:194
ripple::SerialIter::getFieldID
void getFieldID(int &type, int &name)
Definition: Serializer.cpp:414
ripple::Serializer::decodeVLLength
static int decodeVLLength(int b1)
Definition: Serializer.cpp:301
ripple::Buffer
Like std::vector<char> but better.
Definition: Buffer.h:35
ripple::Serializer::operator==
bool operator==(const Serializer &v) const
Definition: Serializer.h:264
ripple::Serializer::operator!=
bool operator!=(Blob const &v) const
Definition: Serializer.h:259
ripple::Serializer::getSHA512Half
uint256 getSHA512Half() const
Definition: Serializer.cpp:194
ripple::Serializer::add64
int add64(std::uint64_t i)
Definition: Serializer.cpp:60
ripple::Serializer::Serializer
Serializer(int n=256)
Definition: Serializer.h:46
ripple::Serializer::decodeLengthLength
static int decodeLengthLength(int b1)
Definition: Serializer.cpp:282
std::vector::front
T front(T... args)
ripple::Serializer::begin
Blob ::iterator begin()
Definition: Serializer.h:218
ripple::base_uint::data
pointer data()
Definition: base_uint.h:122
std::vector::clear
T clear(T... args)
ripple::base_uint::size
constexpr static std::size_t size()
Definition: base_uint.h:519
ripple::SerialIter::SerialIter
SerialIter(void const *data, std::size_t size) noexcept
Definition: Serializer.cpp:338
ripple::Serializer::data
void const * data() const noexcept
Definition: Serializer.h:75
ripple::Serializer::getInteger
bool getInteger(Integer &number, int offset)
Definition: Serializer.h:127
ripple::Serializer::getDataLength
int getDataLength() const
Definition: Serializer.h:184
ripple::base_uint
Integers of any length that is a multiple of 32-bits.
Definition: base_uint.h:82
std::vector::capacity
T capacity(T... args)
ripple::SerialIter::get8
unsigned char get8()
Definition: Serializer.cpp:362
ripple::HashPrefix
HashPrefix
Prefix for hashing functions.
Definition: HashPrefix.h:54
ripple::SerialIter::get256
uint256 get256()
Definition: Serializer.h:376
ripple::SerialIter::get64
std::uint64_t get64()
Definition: Serializer.cpp:399
ripple::Serializer::getDataPtr
const void * getDataPtr() const
Definition: Serializer.h:189
ripple::SerialIter::empty
std::size_t empty() const noexcept
Definition: Serializer.h:332
ripple::SerialIter::get160
uint160 get160()
Definition: Serializer.h:370
ripple::Serializer::resize
void resize(size_t n)
Definition: Serializer.h:243
ripple::Serializer::addRaw
int addRaw(Blob const &vector)
Definition: Serializer.cpp:100
ripple::Serializer::get8
bool get8(int &, int offset) const
Definition: Serializer.cpp:174
ripple::Serializer::slice
Slice slice() const noexcept
Definition: Serializer.h:63
cstdint
ripple::SerialIter
Definition: Serializer.h:310
ripple::Serializer::addEncoded
int addEncoded(int length)
Definition: Serializer.cpp:231
ripple::SerialIter::getVL
Blob getVL()
Definition: Serializer.cpp:508
std::uint16_t
ripple::SerialIter::skip
void skip(int num)
Definition: Serializer.cpp:352
ripple::SerialIter::used_
std::size_t used_
Definition: Serializer.h:315
ripple::Serializer::operator==
bool operator==(Blob const &v) const
Definition: Serializer.h:254
ripple::Serializer::capacity
size_t capacity() const
Definition: Serializer.h:248
ripple::Serializer::end
Blob ::const_iterator end() const
Definition: Serializer.h:233
ripple::SerialIter::remain_
std::size_t remain_
Definition: Serializer.h:314
ripple::Serializer
Definition: Serializer.h:39
ripple::SerialIter::getRaw
Blob getRaw(int size)
Definition: Serializer.cpp:464
ripple::SerialIter::getBitString
base_uint< Bits, Tag > getBitString()
Definition: Serializer.h:414
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::Serializer::addBitString
int addBitString(base_uint< Bits, Tag > const &v)
Definition: Serializer.h:97
ripple::Serializer::operator!=
bool operator!=(const Serializer &v) const
Definition: Serializer.h:269
ripple::Serializer::getBitString
bool getBitString(base_uint< Bits, Tag > &data, int offset) const
Definition: Serializer.h:146
ripple::SerialIter::getBytesLeft
int getBytesLeft() const noexcept
Definition: Serializer.h:341
ripple::Serializer::size
std::size_t size() const noexcept
Definition: Serializer.h:69
iomanip
ripple::SerialIter::get128
uint128 get128()
Definition: Serializer.h:364
std::vector::begin
T begin(T... args)
ripple::base_uint::fromVoid
static base_uint fromVoid(void const *data)
Definition: base_uint.h:312
cassert
ripple::Serializer::peekData
Blob const & peekData() const
Definition: Serializer.h:168
ripple::SerialIter::getVLDataLength
int getVLDataLength()
Definition: Serializer.cpp:470
ripple::SerialIter::getRawHelper
T getRawHelper(int size)
Definition: Serializer.cpp:442
ripple::SerialIter::p_
std::uint8_t const * p_
Definition: Serializer.h:313
ripple::Serializer::Serializer
Serializer(void const *data, std::size_t size)
Definition: Serializer.h:51
ripple::Serializer::addVL
int addVL(Blob const &vector)
Definition: Serializer.cpp:200
ripple::Serializer::begin
Blob ::const_iterator begin() const
Definition: Serializer.h:228
std::size_t
std::memcpy
T memcpy(T... args)
ripple::Serializer::add32
int add32(std::uint32_t i)
Definition: Serializer.cpp:38
ripple::Serializer::getData
Blob getData() const
Definition: Serializer.h:173
std::vector::end
T end(T... args)
ripple::Serializer::getLength
int getLength() const
Definition: Serializer.h:199
ripple::SerialIter::get32
std::uint32_t get32()
Definition: Serializer.cpp:386
ripple::Serializer::encodeLengthLength
static int encodeLengthLength(int length)
Definition: Serializer.cpp:263
ripple::SerialIter::reset
void reset() noexcept
Definition: Serializer.cpp:344
ripple::SerialIter::getVLBuffer
Buffer getVLBuffer()
Definition: Serializer.cpp:514
ripple::Serializer::addFieldID
int addFieldID(SerializedTypeID type, int name)
Definition: Serializer.h:157
std::vector::data
T data(T... args)
type_traits
ripple::Serializer::add16
int add16(std::uint16_t i)
Definition: Serializer.cpp:29
ripple::SerialIter::getSlice
Slice getSlice(std::size_t bytes)
Definition: Serializer.cpp:495
ripple::SerialIter::get16
std::uint16_t get16()
Definition: Serializer.cpp:374
ripple::SerialIter::SerialIter
SerialIter(std::uint8_t const (&data)[N])
Definition: Serializer.h:326