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(const void* ptr, int len);
106  int
107  addRaw(const Serializer& s);
108 
109  int
110  addVL(Blob const& vector);
111  int
112  addVL(Slice const& slice);
113  template <class Iter>
114  int
115  addVL(Iter begin, Iter end, int len);
116  int
117  addVL(const void* ptr, int len);
118 
119  // disassemble functions
120  bool
121  get8(int&, int offset) const;
122 
123  template <typename Integer>
124  bool
125  getInteger(Integer& number, int offset)
126  {
127  static const auto bytes = sizeof(Integer);
128  if ((offset + bytes) > mData.size())
129  return false;
130  number = 0;
131 
132  auto ptr = &mData[offset];
133  for (auto i = 0; i < bytes; ++i)
134  {
135  if (i)
136  number <<= 8;
137  number |= *ptr++;
138  }
139  return true;
140  }
141 
142  template <std::size_t Bits, typename Tag = void>
143  bool
145  {
146  auto success = (offset + (Bits / 8)) <= mData.size();
147  if (success)
148  memcpy(data.begin(), &(mData.front()) + offset, (Bits / 8));
149  return success;
150  }
151 
152  int
153  addFieldID(int type, int name);
154  int
155  addFieldID(SerializedTypeID type, int name)
156  {
157  return addFieldID(safe_cast<int>(type), name);
158  }
159 
160  // DEPRECATED
161  uint256
162  getSHA512Half() const;
163 
164  // totality functions
165  Blob const&
166  peekData() const
167  {
168  return mData;
169  }
170  Blob
171  getData() const
172  {
173  return mData;
174  }
175  Blob&
177  {
178  return mData;
179  }
180 
181  int
183  {
184  return mData.size();
185  }
186  const void*
187  getDataPtr() const
188  {
189  return mData.data();
190  }
191  void*
193  {
194  return mData.data();
195  }
196  int
197  getLength() const
198  {
199  return mData.size();
200  }
202  getString() const
203  {
204  return std::string(static_cast<const char*>(getDataPtr()), size());
205  }
206  void
208  {
209  mData.clear();
210  }
211  bool
212  chop(int num);
213 
214  // vector-like functions
215  Blob ::iterator
217  {
218  return mData.begin();
219  }
220  Blob ::iterator
221  end()
222  {
223  return mData.end();
224  }
225  Blob ::const_iterator
226  begin() const
227  {
228  return mData.begin();
229  }
230  Blob ::const_iterator
231  end() const
232  {
233  return mData.end();
234  }
235  void
236  reserve(size_t n)
237  {
238  mData.reserve(n);
239  }
240  void
241  resize(size_t n)
242  {
243  mData.resize(n);
244  }
245  size_t
246  capacity() const
247  {
248  return mData.capacity();
249  }
250 
251  bool
252  operator==(Blob const& v)
253  {
254  return v == mData;
255  }
256  bool
257  operator!=(Blob const& v)
258  {
259  return v != mData;
260  }
261  bool
263  {
264  return v.mData == mData;
265  }
266  bool
268  {
269  return v.mData != mData;
270  }
271 
272  static int
273  decodeLengthLength(int b1);
274  static int
275  decodeVLLength(int b1);
276  static int
277  decodeVLLength(int b1, int b2);
278  static int
279  decodeVLLength(int b1, int b2, int b3);
280 
281 private:
282  static int
283  encodeLengthLength(int length); // length to encode length
284  int
285  addEncoded(int length);
286 };
287 
288 template <class Iter>
289 int
290 Serializer::addVL(Iter begin, Iter end, int len)
291 {
292  int ret = addEncoded(len);
293  for (; begin != end; ++begin)
294  {
295  addRaw(begin->data(), begin->size());
296 #ifndef NDEBUG
297  len -= begin->size();
298 #endif
299  }
300  assert(len == 0);
301  return ret;
302 }
303 
304 //------------------------------------------------------------------------------
305 
306 // DEPRECATED
307 // Transitional adapter to new serialization interfaces
309 {
310 private:
311  std::uint8_t const* p_;
314 
315 public:
316  SerialIter(void const* data, std::size_t size) noexcept;
317 
318  SerialIter(Slice const& slice) : SerialIter(slice.data(), slice.size())
319  {
320  }
321 
322  // Infer the size of the data based on the size of the passed array.
323  template <int N>
324  explicit SerialIter(std::uint8_t const (&data)[N]) : SerialIter(&data[0], N)
325  {
326  static_assert(N > 0, "");
327  }
328 
330  empty() const noexcept
331  {
332  return remain_ == 0;
333  }
334 
335  void
336  reset() noexcept;
337 
338  int
339  getBytesLeft() const noexcept
340  {
341  return static_cast<int>(remain_);
342  }
343 
344  // get functions throw on error
345  unsigned char
346  get8();
347 
349  get16();
350 
352  get32();
353 
355  get64();
356 
357  template <std::size_t Bits, class Tag = void>
359  getBitString();
360 
361  uint128
363  {
364  return getBitString<128>();
365  }
366 
367  uint160
369  {
370  return getBitString<160>();
371  }
372 
373  uint256
375  {
376  return getBitString<256>();
377  }
378 
379  void
380  getFieldID(int& type, int& name);
381 
382  // Returns the size of the VL if the
383  // next object is a VL. Advances the iterator
384  // to the beginning of the VL.
385  int
386  getVLDataLength();
387 
388  Slice
389  getSlice(std::size_t bytes);
390 
391  // VFALCO DEPRECATED Returns a copy
392  Blob
393  getRaw(int size);
394 
395  // VFALCO DEPRECATED Returns a copy
396  Blob
397  getVL();
398 
399  void
400  skip(int num);
401 
402  Buffer
403  getVLBuffer();
404 
405  template <class T>
406  T
407  getRawHelper(int size);
408 };
409 
410 template <std::size_t Bits, class Tag>
411 base_uint<Bits, Tag>
413 {
414  auto const n = Bits / 8;
415 
416  if (remain_ < n)
417  Throw<std::runtime_error>("invalid SerialIter getBitString");
418 
419  auto const x = p_;
420 
421  p_ += n;
422  used_ += n;
423  remain_ -= n;
424 
426 }
427 
428 } // namespace ripple
429 
430 #endif
std::vector::resize
T resize(T... args)
ripple::Serializer::end
Blob ::iterator end()
Definition: Serializer.h:221
ripple::Serializer::chop
bool chop(int num)
Definition: Serializer.cpp:176
ripple::SerialIter::SerialIter
SerialIter(Slice const &slice)
Definition: Serializer.h:318
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:236
ripple::Serializer::addFieldID
int addFieldID(int type, int name)
Definition: Serializer.cpp:124
ripple::Serializer::addInteger
int addInteger(Integer)
ripple::Serializer::modData
Blob & modData()
Definition: Serializer.h:176
ripple::Slice
An immutable linear range of bytes.
Definition: Slice.h:44
ripple::Serializer::erase
void erase()
Definition: Serializer.h:207
std::vector::reserve
T reserve(T... args)
ripple::Serializer::operator==
bool operator==(Blob const &v)
Definition: Serializer.h:252
std::vector< unsigned char >
std::vector::size
T size(T... args)
ripple::Serializer::getString
std::string getString() const
Definition: Serializer.h:202
ripple::SerializedTypeID
SerializedTypeID
Definition: SField.h:52
ripple::Serializer::add8
int add8(unsigned char i)
Definition: Serializer.cpp:158
ripple::Serializer::getDataPtr
void * getDataPtr()
Definition: Serializer.h:192
ripple::SerialIter::getFieldID
void getFieldID(int &type, int &name)
Definition: Serializer.cpp:406
ripple::Serializer::decodeVLLength
static int decodeVLLength(int b1)
Definition: Serializer.cpp:293
ripple::Buffer
Like std::vector<char> but better.
Definition: Buffer.h:35
ripple::Serializer::getSHA512Half
uint256 getSHA512Half() const
Definition: Serializer.cpp:186
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:274
std::vector::front
T front(T... args)
ripple::Serializer::begin
Blob ::iterator begin()
Definition: Serializer.h:216
ripple::base_uint::data
pointer data()
Definition: base_uint.h:113
std::vector::clear
T clear(T... args)
ripple::base_uint::size
constexpr static std::size_t size()
Definition: base_uint.h:426
ripple::SerialIter::SerialIter
SerialIter(void const *data, std::size_t size) noexcept
Definition: Serializer.cpp:330
ripple::Serializer::data
void const * data() const noexcept
Definition: Serializer.h:75
ripple::Serializer::getInteger
bool getInteger(Integer &number, int offset)
Definition: Serializer.h:125
ripple::Serializer::getDataLength
int getDataLength() const
Definition: Serializer.h:182
ripple::base_uint
Integers of any length that is a multiple of 32-bits.
Definition: base_uint.h:73
std::vector::capacity
T capacity(T... args)
ripple::Serializer::operator!=
bool operator!=(Blob const &v)
Definition: Serializer.h:257
ripple::SerialIter::get8
unsigned char get8()
Definition: Serializer.cpp:354
ripple::HashPrefix
HashPrefix
Prefix for hashing functions.
Definition: HashPrefix.h:54
ripple::SerialIter::get256
uint256 get256()
Definition: Serializer.h:374
ripple::SerialIter::get64
std::uint64_t get64()
Definition: Serializer.cpp:391
ripple::Serializer::operator!=
bool operator!=(const Serializer &v)
Definition: Serializer.h:267
ripple::Serializer::getDataPtr
const void * getDataPtr() const
Definition: Serializer.h:187
ripple::SerialIter::empty
std::size_t empty() const noexcept
Definition: Serializer.h:330
ripple::SerialIter::get160
uint160 get160()
Definition: Serializer.h:368
ripple::Serializer::resize
void resize(size_t n)
Definition: Serializer.h:241
ripple::Serializer::addRaw
int addRaw(Blob const &vector)
Definition: Serializer.cpp:100
ripple::Serializer::get8
bool get8(int &, int offset) const
Definition: Serializer.cpp:166
ripple::Serializer::slice
Slice slice() const noexcept
Definition: Serializer.h:63
cstdint
ripple::SerialIter
Definition: Serializer.h:308
ripple::Serializer::addEncoded
int addEncoded(int length)
Definition: Serializer.cpp:223
ripple::SerialIter::getVL
Blob getVL()
Definition: Serializer.cpp:500
std::uint16_t
ripple::SerialIter::skip
void skip(int num)
Definition: Serializer.cpp:344
ripple::SerialIter::used_
std::size_t used_
Definition: Serializer.h:313
ripple::Serializer::capacity
size_t capacity() const
Definition: Serializer.h:246
ripple::Serializer::end
Blob ::const_iterator end() const
Definition: Serializer.h:231
ripple::SerialIter::remain_
std::size_t remain_
Definition: Serializer.h:312
ripple::Serializer
Definition: Serializer.h:39
ripple::SerialIter::getRaw
Blob getRaw(int size)
Definition: Serializer.cpp:456
ripple::SerialIter::getBitString
base_uint< Bits, Tag > getBitString()
Definition: Serializer.h:412
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::getBitString
bool getBitString(base_uint< Bits, Tag > &data, int offset) const
Definition: Serializer.h:144
ripple::SerialIter::getBytesLeft
int getBytesLeft() const noexcept
Definition: Serializer.h:339
ripple::Serializer::size
std::size_t size() const noexcept
Definition: Serializer.h:69
iomanip
ripple::SerialIter::get128
uint128 get128()
Definition: Serializer.h:362
std::vector::begin
T begin(T... args)
ripple::base_uint::fromVoid
static base_uint fromVoid(void const *data)
Definition: base_uint.h:223
cassert
ripple::Serializer::peekData
Blob const & peekData() const
Definition: Serializer.h:166
ripple::SerialIter::getVLDataLength
int getVLDataLength()
Definition: Serializer.cpp:462
ripple::SerialIter::getRawHelper
T getRawHelper(int size)
Definition: Serializer.cpp:434
ripple::SerialIter::p_
std::uint8_t const * p_
Definition: Serializer.h:311
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:192
ripple::Serializer::begin
Blob ::const_iterator begin() const
Definition: Serializer.h:226
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:171
std::vector::end
T end(T... args)
ripple::Serializer::getLength
int getLength() const
Definition: Serializer.h:197
ripple::SerialIter::get32
std::uint32_t get32()
Definition: Serializer.cpp:378
ripple::Serializer::encodeLengthLength
static int encodeLengthLength(int length)
Definition: Serializer.cpp:255
ripple::SerialIter::reset
void reset() noexcept
Definition: Serializer.cpp:336
ripple::SerialIter::getVLBuffer
Buffer getVLBuffer()
Definition: Serializer.cpp:506
ripple::Serializer::addFieldID
int addFieldID(SerializedTypeID type, int name)
Definition: Serializer.h:155
std::vector::data
T data(T... args)
type_traits
ripple::Serializer::operator==
bool operator==(const Serializer &v)
Definition: Serializer.h:262
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:487
ripple::SerialIter::get16
std::uint16_t get16()
Definition: Serializer.cpp:366
ripple::SerialIter::SerialIter
SerialIter(std::uint8_t const (&data)[N])
Definition: Serializer.h:324