Dash Core  0.12.2.1
P2P Digital Currency
prevector.h
Go to the documentation of this file.
1 #ifndef _BITCOIN_PREVECTOR_H_
2 #define _BITCOIN_PREVECTOR_H_
3 
4 #include <stdlib.h>
5 #include <stdint.h>
6 #include <string.h>
7 
8 #include <iterator>
9 
10 #pragma pack(push, 1)
11 
29 template<unsigned int N, typename T, typename Size = uint32_t, typename Diff = int32_t>
30 class prevector {
31 public:
32  typedef Size size_type;
33  typedef Diff difference_type;
34  typedef T value_type;
36  typedef const value_type& const_reference;
37  typedef value_type* pointer;
38  typedef const value_type* const_pointer;
39 
40  class iterator {
41  T* ptr;
42  public:
43  typedef Diff difference_type;
44  typedef T value_type;
45  typedef T* pointer;
46  typedef T& reference;
47  typedef std::random_access_iterator_tag iterator_category;
48  iterator(T* ptr_) : ptr(ptr_) {}
49  T& operator*() const { return *ptr; }
50  T* operator->() const { return ptr; }
51  T& operator[](size_type pos) { return ptr[pos]; }
52  const T& operator[](size_type pos) const { return ptr[pos]; }
53  iterator& operator++() { ptr++; return *this; }
54  iterator& operator--() { ptr--; return *this; }
55  iterator operator++(int) { iterator copy(*this); ++(*this); return copy; }
56  iterator operator--(int) { iterator copy(*this); --(*this); return copy; }
57  difference_type friend operator-(iterator a, iterator b) { return (&(*a) - &(*b)); }
59  iterator& operator+=(size_type n) { ptr += n; return *this; }
61  iterator& operator-=(size_type n) { ptr -= n; return *this; }
62  bool operator==(iterator x) const { return ptr == x.ptr; }
63  bool operator!=(iterator x) const { return ptr != x.ptr; }
64  bool operator>=(iterator x) const { return ptr >= x.ptr; }
65  bool operator<=(iterator x) const { return ptr <= x.ptr; }
66  bool operator>(iterator x) const { return ptr > x.ptr; }
67  bool operator<(iterator x) const { return ptr < x.ptr; }
68  };
69 
71  T* ptr;
72  public:
73  typedef Diff difference_type;
74  typedef T value_type;
75  typedef T* pointer;
76  typedef T& reference;
77  typedef std::bidirectional_iterator_tag iterator_category;
78  reverse_iterator(T* ptr_) : ptr(ptr_) {}
79  T& operator*() { return *ptr; }
80  const T& operator*() const { return *ptr; }
81  T* operator->() { return ptr; }
82  const T* operator->() const { return ptr; }
83  reverse_iterator& operator--() { ptr++; return *this; }
84  reverse_iterator& operator++() { ptr--; return *this; }
85  reverse_iterator operator++(int) { reverse_iterator copy(*this); ++(*this); return copy; }
86  reverse_iterator operator--(int) { reverse_iterator copy(*this); --(*this); return copy; }
87  bool operator==(reverse_iterator x) const { return ptr == x.ptr; }
88  bool operator!=(reverse_iterator x) const { return ptr != x.ptr; }
89  };
90 
92  const T* ptr;
93  public:
94  typedef Diff difference_type;
95  typedef const T value_type;
96  typedef const T* pointer;
97  typedef const T& reference;
98  typedef std::random_access_iterator_tag iterator_category;
99  const_iterator(const T* ptr_) : ptr(ptr_) {}
100  const_iterator(iterator x) : ptr(&(*x)) {}
101  const T& operator*() const { return *ptr; }
102  const T* operator->() const { return ptr; }
103  const T& operator[](size_type pos) const { return ptr[pos]; }
104  const_iterator& operator++() { ptr++; return *this; }
105  const_iterator& operator--() { ptr--; return *this; }
106  const_iterator operator++(int) { const_iterator copy(*this); ++(*this); return copy; }
107  const_iterator operator--(int) { const_iterator copy(*this); --(*this); return copy; }
108  difference_type friend operator-(const_iterator a, const_iterator b) { return (&(*a) - &(*b)); }
110  const_iterator& operator+=(size_type n) { ptr += n; return *this; }
112  const_iterator& operator-=(size_type n) { ptr -= n; return *this; }
113  bool operator==(const_iterator x) const { return ptr == x.ptr; }
114  bool operator!=(const_iterator x) const { return ptr != x.ptr; }
115  bool operator>=(const_iterator x) const { return ptr >= x.ptr; }
116  bool operator<=(const_iterator x) const { return ptr <= x.ptr; }
117  bool operator>(const_iterator x) const { return ptr > x.ptr; }
118  bool operator<(const_iterator x) const { return ptr < x.ptr; }
119  };
120 
122  const T* ptr;
123  public:
124  typedef Diff difference_type;
125  typedef const T value_type;
126  typedef const T* pointer;
127  typedef const T& reference;
128  typedef std::bidirectional_iterator_tag iterator_category;
129  const_reverse_iterator(T* ptr_) : ptr(ptr_) {}
131  const T& operator*() const { return *ptr; }
132  const T* operator->() const { return ptr; }
133  const_reverse_iterator& operator--() { ptr++; return *this; }
134  const_reverse_iterator& operator++() { ptr--; return *this; }
135  const_reverse_iterator operator++(int) { const_reverse_iterator copy(*this); ++(*this); return copy; }
136  const_reverse_iterator operator--(int) { const_reverse_iterator copy(*this); --(*this); return copy; }
137  bool operator==(const_reverse_iterator x) const { return ptr == x.ptr; }
138  bool operator!=(const_reverse_iterator x) const { return ptr != x.ptr; }
139  };
140 
141 private:
144  char direct[sizeof(T) * N];
145  struct {
147  char* indirect;
148  };
149  } _union;
150 
151  T* direct_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.direct) + pos; }
152  const T* direct_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.direct) + pos; }
153  T* indirect_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.indirect) + pos; }
154  const T* indirect_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.indirect) + pos; }
155  bool is_direct() const { return _size <= N; }
156 
157  void change_capacity(size_type new_capacity) {
158  if (new_capacity <= N) {
159  if (!is_direct()) {
160  T* indirect = indirect_ptr(0);
161  T* src = indirect;
162  T* dst = direct_ptr(0);
163  memcpy(dst, src, size() * sizeof(T));
164  free(indirect);
165  _size -= N + 1;
166  }
167  } else {
168  if (!is_direct()) {
169  _union.indirect = static_cast<char*>(realloc(_union.indirect, ((size_t)sizeof(T)) * new_capacity));
170  _union.capacity = new_capacity;
171  } else {
172  char* new_indirect = static_cast<char*>(malloc(((size_t)sizeof(T)) * new_capacity));
173  T* src = direct_ptr(0);
174  T* dst = reinterpret_cast<T*>(new_indirect);
175  memcpy(dst, src, size() * sizeof(T));
176  _union.indirect = new_indirect;
177  _union.capacity = new_capacity;
178  _size += N + 1;
179  }
180  }
181  }
182 
183  T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
184  const T* item_ptr(difference_type pos) const { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
185 
186 public:
187  void assign(size_type n, const T& val) {
188  clear();
189  if (capacity() < n) {
191  }
192  while (size() < n) {
193  _size++;
194  new(static_cast<void*>(item_ptr(size() - 1))) T(val);
195  }
196  }
197 
198  template<typename InputIterator>
199  void assign(InputIterator first, InputIterator last) {
200  size_type n = last - first;
201  clear();
202  if (capacity() < n) {
204  }
205  while (first != last) {
206  _size++;
207  new(static_cast<void*>(item_ptr(size() - 1))) T(*first);
208  ++first;
209  }
210  }
211 
212  prevector() : _size(0) {}
213 
214  explicit prevector(size_type n) : _size(0) {
215  resize(n);
216  }
217 
218  explicit prevector(size_type n, const T& val = T()) : _size(0) {
220  while (size() < n) {
221  _size++;
222  new(static_cast<void*>(item_ptr(size() - 1))) T(val);
223  }
224  }
225 
226  template<typename InputIterator>
227  prevector(InputIterator first, InputIterator last) : _size(0) {
228  size_type n = last - first;
230  while (first != last) {
231  _size++;
232  new(static_cast<void*>(item_ptr(size() - 1))) T(*first);
233  ++first;
234  }
235  }
236 
238  change_capacity(other.size());
239  const_iterator it = other.begin();
240  while (it != other.end()) {
241  _size++;
242  new(static_cast<void*>(item_ptr(size() - 1))) T(*it);
243  ++it;
244  }
245  }
246 
248  if (&other == this) {
249  return *this;
250  }
251  resize(0);
252  change_capacity(other.size());
253  const_iterator it = other.begin();
254  while (it != other.end()) {
255  _size++;
256  new(static_cast<void*>(item_ptr(size() - 1))) T(*it);
257  ++it;
258  }
259  return *this;
260  }
261 
262  size_type size() const {
263  return is_direct() ? _size : _size - N - 1;
264  }
265 
266  bool empty() const {
267  return size() == 0;
268  }
269 
270  iterator begin() { return iterator(item_ptr(0)); }
271  const_iterator begin() const { return const_iterator(item_ptr(0)); }
272  iterator end() { return iterator(item_ptr(size())); }
274 
279 
280  size_t capacity() const {
281  if (is_direct()) {
282  return N;
283  } else {
284  return _union.capacity;
285  }
286  }
287 
289  return *item_ptr(pos);
290  }
291 
292  const T& operator[](size_type pos) const {
293  return *item_ptr(pos);
294  }
295 
296  void resize(size_type new_size) {
297  if (size() > new_size) {
298  erase(item_ptr(new_size), end());
299  }
300  if (new_size > capacity()) {
301  change_capacity(new_size);
302  }
303  while (size() < new_size) {
304  _size++;
305  new(static_cast<void*>(item_ptr(size() - 1))) T();
306  }
307  }
308 
309  void reserve(size_type new_capacity) {
310  if (new_capacity > capacity()) {
311  change_capacity(new_capacity);
312  }
313  }
314 
315  void shrink_to_fit() {
317  }
318 
319  void clear() {
320  resize(0);
321  }
322 
323  iterator insert(iterator pos, const T& value) {
324  size_type p = pos - begin();
325  size_type new_size = size() + 1;
326  if (capacity() < new_size) {
327  change_capacity(new_size + (new_size >> 1));
328  }
329  memmove(item_ptr(p + 1), item_ptr(p), (size() - p) * sizeof(T));
330  _size++;
331  new(static_cast<void*>(item_ptr(p))) T(value);
332  return iterator(item_ptr(p));
333  }
334 
335  void insert(iterator pos, size_type count, const T& value) {
336  size_type p = pos - begin();
337  size_type new_size = size() + count;
338  if (capacity() < new_size) {
339  change_capacity(new_size + (new_size >> 1));
340  }
341  memmove(item_ptr(p + count), item_ptr(p), (size() - p) * sizeof(T));
342  _size += count;
343  for (size_type i = 0; i < count; i++) {
344  new(static_cast<void*>(item_ptr(p + i))) T(value);
345  }
346  }
347 
348  template<typename InputIterator>
349  void insert(iterator pos, InputIterator first, InputIterator last) {
350  size_type p = pos - begin();
351  difference_type count = last - first;
352  size_type new_size = size() + count;
353  if (capacity() < new_size) {
354  change_capacity(new_size + (new_size >> 1));
355  }
356  memmove(item_ptr(p + count), item_ptr(p), (size() - p) * sizeof(T));
357  _size += count;
358  while (first != last) {
359  new(static_cast<void*>(item_ptr(p))) T(*first);
360  ++p;
361  ++first;
362  }
363  }
364 
366  return erase(pos, pos + 1);
367  }
368 
370  iterator p = first;
371  char* endp = (char*)&(*end());
372  while (p != last) {
373  (*p).~T();
374  _size--;
375  ++p;
376  }
377  memmove(&(*first), &(*last), endp - ((char*)(&(*last))));
378  return first;
379  }
380 
381  void push_back(const T& value) {
382  size_type new_size = size() + 1;
383  if (capacity() < new_size) {
384  change_capacity(new_size + (new_size >> 1));
385  }
386  new(item_ptr(size())) T(value);
387  _size++;
388  }
389 
390  void pop_back() {
391  erase(end() - 1, end());
392  }
393 
394  T& front() {
395  return *item_ptr(0);
396  }
397 
398  const T& front() const {
399  return *item_ptr(0);
400  }
401 
402  T& back() {
403  return *item_ptr(size() - 1);
404  }
405 
406  const T& back() const {
407  return *item_ptr(size() - 1);
408  }
409 
411  std::swap(_union, other._union);
412  std::swap(_size, other._size);
413  }
414 
416  clear();
417  if (!is_direct()) {
418  free(_union.indirect);
419  _union.indirect = NULL;
420  }
421  }
422 
423  bool operator==(const prevector<N, T, Size, Diff>& other) const {
424  if (other.size() != size()) {
425  return false;
426  }
427  const_iterator b1 = begin();
428  const_iterator b2 = other.begin();
429  const_iterator e1 = end();
430  while (b1 != e1) {
431  if ((*b1) != (*b2)) {
432  return false;
433  }
434  ++b1;
435  ++b2;
436  }
437  return true;
438  }
439 
440  bool operator!=(const prevector<N, T, Size, Diff>& other) const {
441  return !(*this == other);
442  }
443 
444  bool operator<(const prevector<N, T, Size, Diff>& other) const {
445  if (size() < other.size()) {
446  return true;
447  }
448  if (size() > other.size()) {
449  return false;
450  }
451  const_iterator b1 = begin();
452  const_iterator b2 = other.begin();
453  const_iterator e1 = end();
454  while (b1 != e1) {
455  if ((*b1) < (*b2)) {
456  return true;
457  }
458  if ((*b2) < (*b1)) {
459  return false;
460  }
461  ++b1;
462  ++b2;
463  }
464  return false;
465  }
466 
467  size_t allocated_memory() const {
468  if (is_direct()) {
469  return 0;
470  } else {
471  return ((size_t)(sizeof(T))) * _union.capacity;
472  }
473  }
474 };
475 #pragma pack(pop)
476 
477 #endif
bool operator!=(const prevector< N, T, Size, Diff > &other) const
Definition: prevector.h:440
T * direct_ptr(difference_type pos)
Definition: prevector.h:151
std::bidirectional_iterator_tag iterator_category
Definition: prevector.h:77
prevector & operator=(const prevector< N, T, Size, Diff > &other)
Definition: prevector.h:247
const value_type & const_reference
Definition: prevector.h:36
const_iterator operator--(int)
Definition: prevector.h:107
void resize(size_type new_size)
Definition: prevector.h:296
const T * operator->() const
Definition: prevector.h:82
const T & operator[](size_type pos) const
Definition: prevector.h:52
const value_type * const_pointer
Definition: prevector.h:38
void assign(size_type n, const T &val)
Definition: prevector.h:187
T * indirect_ptr(difference_type pos)
Definition: prevector.h:153
iterator operator+(size_type n)
Definition: prevector.h:58
bool operator<=(const_iterator x) const
Definition: prevector.h:116
iterator operator-(size_type n)
Definition: prevector.h:60
T & back()
Definition: prevector.h:402
void assign(InputIterator first, InputIterator last)
Definition: prevector.h:199
void shrink_to_fit()
Definition: prevector.h:315
void pop_back()
Definition: prevector.h:390
T * operator->() const
Definition: prevector.h:50
reverse_iterator operator++(int)
Definition: prevector.h:85
iterator insert(iterator pos, const T &value)
Definition: prevector.h:323
void clear()
Definition: prevector.h:319
Size size_type
Definition: prevector.h:32
reverse_iterator operator--(int)
Definition: prevector.h:86
const T & operator[](size_type pos) const
Definition: prevector.h:103
bool operator!=(iterator x) const
Definition: prevector.h:63
const_iterator & operator-=(size_type n)
Definition: prevector.h:112
const_reverse_iterator & operator--()
Definition: prevector.h:133
const_iterator & operator++()
Definition: prevector.h:104
iterator operator++(int)
Definition: prevector.h:55
void insert(iterator pos, InputIterator first, InputIterator last)
Definition: prevector.h:349
const_reverse_iterator operator--(int)
Definition: prevector.h:136
const T & back() const
Definition: prevector.h:406
const T * operator->() const
Definition: prevector.h:132
iterator operator--(int)
Definition: prevector.h:56
const T * direct_ptr(difference_type pos) const
Definition: prevector.h:152
size_t allocated_memory() const
Definition: prevector.h:467
bool operator==(const prevector< N, T, Size, Diff > &other) const
Definition: prevector.h:423
size_t capacity() const
Definition: prevector.h:280
const_reverse_iterator & operator++()
Definition: prevector.h:134
bool is_direct() const
Definition: prevector.h:155
~prevector()
Definition: prevector.h:415
iterator(T *ptr_)
Definition: prevector.h:48
T & operator[](size_type pos)
Definition: prevector.h:51
bool operator==(const_reverse_iterator x) const
Definition: prevector.h:137
bool operator>=(iterator x) const
Definition: prevector.h:64
prevector(const prevector< N, T, Size, Diff > &other)
Definition: prevector.h:237
prevector(size_type n, const T &val=T())
Definition: prevector.h:218
const_reverse_iterator operator++(int)
Definition: prevector.h:135
bool operator>=(const_iterator x) const
Definition: prevector.h:115
T value_type
Definition: prevector.h:34
const T * item_ptr(difference_type pos) const
Definition: prevector.h:184
iterator end()
Definition: prevector.h:272
Diff difference_type
Definition: prevector.h:33
void push_back(const T &value)
Definition: prevector.h:381
T & front()
Definition: prevector.h:394
value_type * pointer
Definition: prevector.h:37
const T & operator*() const
Definition: prevector.h:101
const_reverse_iterator rend() const
Definition: prevector.h:278
const_reverse_iterator rbegin() const
Definition: prevector.h:276
T & operator[](size_type pos)
Definition: prevector.h:288
void swap(prevector< N, T, Size, Diff > &other)
Definition: prevector.h:410
bool operator<=(iterator x) const
Definition: prevector.h:65
void insert(iterator pos, size_type count, const T &value)
Definition: prevector.h:335
const_iterator operator+(size_type n)
Definition: prevector.h:109
prevector(size_type n)
Definition: prevector.h:214
reverse_iterator rend()
Definition: prevector.h:277
const_reverse_iterator(reverse_iterator x)
Definition: prevector.h:130
bool operator>(const_iterator x) const
Definition: prevector.h:117
bool operator==(iterator x) const
Definition: prevector.h:62
reverse_iterator rbegin()
Definition: prevector.h:275
char direct[sizeof(T) *N]
Definition: prevector.h:144
iterator & operator+=(size_type n)
Definition: prevector.h:59
iterator erase(iterator pos)
Definition: prevector.h:365
bool operator<(iterator x) const
Definition: prevector.h:67
const T & operator[](size_type pos) const
Definition: prevector.h:292
const_iterator(iterator x)
Definition: prevector.h:100
reverse_iterator & operator++()
Definition: prevector.h:84
T & operator*() const
Definition: prevector.h:49
bool operator!=(const_reverse_iterator x) const
Definition: prevector.h:138
const_iterator & operator--()
Definition: prevector.h:105
bool operator==(reverse_iterator x) const
Definition: prevector.h:87
const_iterator operator-(size_type n)
Definition: prevector.h:111
void reserve(size_type new_capacity)
Definition: prevector.h:309
const T * operator->() const
Definition: prevector.h:102
void change_capacity(size_type new_capacity)
Definition: prevector.h:157
const T & front() const
Definition: prevector.h:398
prevector(InputIterator first, InputIterator last)
Definition: prevector.h:227
T * item_ptr(difference_type pos)
Definition: prevector.h:183
void * memcpy(void *a, const void *b, size_t c)
bool empty() const
Definition: prevector.h:266
bool operator>(iterator x) const
Definition: prevector.h:66
reverse_iterator & operator--()
Definition: prevector.h:83
std::random_access_iterator_tag iterator_category
Definition: prevector.h:47
union prevector::direct_or_indirect _union
const T & operator*() const
Definition: prevector.h:80
std::bidirectional_iterator_tag iterator_category
Definition: prevector.h:128
static int count
Definition: tests.c:41
const_iterator operator++(int)
Definition: prevector.h:106
iterator begin()
Definition: prevector.h:270
std::random_access_iterator_tag iterator_category
Definition: prevector.h:98
size_type size() const
Definition: prevector.h:262
iterator erase(iterator first, iterator last)
Definition: prevector.h:369
bool operator!=(const_iterator x) const
Definition: prevector.h:114
iterator & operator++()
Definition: prevector.h:53
size_type _size
Definition: prevector.h:142
difference_type friend operator-(iterator a, iterator b)
Definition: prevector.h:57
const T * indirect_ptr(difference_type pos) const
Definition: prevector.h:154
bool operator<(const_iterator x) const
Definition: prevector.h:118
const_iterator end() const
Definition: prevector.h:273
iterator & operator-=(size_type n)
Definition: prevector.h:61
void * memmove(void *a, const void *b, size_t c)
const_iterator begin() const
Definition: prevector.h:271
iterator & operator--()
Definition: prevector.h:54
bool operator==(const_iterator x) const
Definition: prevector.h:113
bool operator!=(reverse_iterator x) const
Definition: prevector.h:88
const_iterator & operator+=(size_type n)
Definition: prevector.h:110
const_iterator(const T *ptr_)
Definition: prevector.h:99
value_type & reference
Definition: prevector.h:35
difference_type friend operator-(const_iterator a, const_iterator b)
Definition: prevector.h:108