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