5 #ifndef BITCOIN_PREVECTOR_H 6 #define BITCOIN_PREVECTOR_H 16 #include <type_traits> 37 template<
unsigned int N,
typename T,
typename Size = u
int32_t,
typename Diff =
int32_t>
166 if (new_capacity <= N) {
184 char* new_indirect = static_cast<char*>(malloc(((
size_t)
sizeof(T)) * new_capacity));
185 assert(new_indirect);
187 T* dst = reinterpret_cast<T*>(new_indirect);
199 void fill(T* dst, ptrdiff_t
count,
const T& value = T{}) {
200 std::fill_n(dst,
count, value);
203 template<
typename InputIterator>
204 void fill(T* dst, InputIterator first, InputIterator last) {
205 while (first != last) {
206 new(static_cast<void*>(dst)) T(*first);
222 template<
typename InputIterator>
223 void assign(InputIterator first, InputIterator last) {
245 template<
typename InputIterator>
265 if (&other ==
this) {
313 if (cur_size == new_size) {
316 if (cur_size > new_size) {
323 ptrdiff_t increase = new_size - cur_size;
351 new(static_cast<void*>(ptr)) T(value);
367 template<
typename InputIterator>
378 fill(ptr, first, last);
389 if (new_size <
size()) {
397 return erase(pos, pos + 1);
408 char* endp = (
char*)&(*
end());
409 if (!std::is_trivially_destructible<T>::value) {
418 memmove(&(*first), &(*last), endp - ((
char*)(&(*last))));
457 if (!std::is_trivially_destructible<T>::value) {
474 if ((*b1) != (*b2)) {
484 return !(*
this == other);
528 #endif // BITCOIN_PREVECTOR_H bool operator!=(const prevector< N, T, Size, Diff > &other) const
Definition: prevector.h:483
T * direct_ptr(difference_type pos)
Definition: prevector.h:159
std::bidirectional_iterator_tag iterator_category
Definition: prevector.h:85
prevector & operator=(const prevector< N, T, Size, Diff > &other)
Definition: prevector.h:264
const value_type & const_reference
Definition: prevector.h:44
const_iterator operator--(int)
Definition: prevector.h:115
void resize(size_type new_size)
Definition: prevector.h:311
const T * operator->() const
Definition: prevector.h:90
const T & operator[](size_type pos) const
Definition: prevector.h:60
const value_type * const_pointer
Definition: prevector.h:46
void assign(size_type n, const T &val)
Definition: prevector.h:213
T * indirect_ptr(difference_type pos)
Definition: prevector.h:161
iterator operator+(size_type n)
Definition: prevector.h:66
T & operator *() const
Definition: prevector.h:57
bool operator<=(const_iterator x) const
Definition: prevector.h:124
const T * pointer
Definition: prevector.h:104
iterator operator-(size_type n)
Definition: prevector.h:68
T & back()
Definition: prevector.h:443
prevector(prevector< N, T, Size, Diff > &&other)
Definition: prevector.h:260
const T * ptr
Definition: prevector.h:130
T & reference
Definition: prevector.h:84
void assign(InputIterator first, InputIterator last)
Definition: prevector.h:223
T * pointer
Definition: prevector.h:83
void shrink_to_fit()
Definition: prevector.h:334
void pop_back()
Definition: prevector.h:431
T * operator->() const
Definition: prevector.h:58
const T & operator *() const
Definition: prevector.h:139
reverse_iterator operator++(int)
Definition: prevector.h:93
iterator insert(iterator pos, const T &value)
Definition: prevector.h:342
void clear()
Definition: prevector.h:338
Size size_type
Definition: prevector.h:40
reverse_iterator operator--(int)
Definition: prevector.h:94
const T & operator[](size_type pos) const
Definition: prevector.h:111
bool operator!=(iterator x) const
Definition: prevector.h:71
const_iterator & operator-=(size_type n)
Definition: prevector.h:120
const_reverse_iterator & operator--()
Definition: prevector.h:141
const_iterator & operator++()
Definition: prevector.h:112
iterator operator++(int)
Definition: prevector.h:63
void insert(iterator pos, InputIterator first, InputIterator last)
Definition: prevector.h:368
const_reverse_iterator operator--(int)
Definition: prevector.h:144
T * ptr
Definition: prevector.h:79
reverse_iterator(T *ptr_)
Definition: prevector.h:86
void fill(T *dst, InputIterator first, InputIterator last)
Definition: prevector.h:204
const T & back() const
Definition: prevector.h:447
const T * operator->() const
Definition: prevector.h:140
iterator operator--(int)
Definition: prevector.h:64
const value_type * data() const
Definition: prevector.h:522
const T value_type
Definition: prevector.h:103
const T * direct_ptr(difference_type pos) const
Definition: prevector.h:160
size_t allocated_memory() const
Definition: prevector.h:510
Definition: prevector.h:99
bool operator==(const prevector< N, T, Size, Diff > &other) const
Definition: prevector.h:466
void resize_uninitialized(size_type new_size)
Definition: prevector.h:381
size_t capacity() const
Definition: prevector.h:295
const_reverse_iterator & operator++()
Definition: prevector.h:142
bool is_direct() const
Definition: prevector.h:163
bool operator<(const prevector< N, T, Size, Diff > &other) const
Definition: prevector.h:487
~prevector()
Definition: prevector.h:456
Diff difference_type
Definition: prevector.h:81
iterator(T *ptr_)
Definition: prevector.h:56
T & operator[](size_type pos)
Definition: prevector.h:59
bool operator==(const_reverse_iterator x) const
Definition: prevector.h:145
bool operator>=(iterator x) const
Definition: prevector.h:72
value_type * data()
Definition: prevector.h:518
prevector(const prevector< N, T, Size, Diff > &other)
Definition: prevector.h:253
const_reverse_iterator operator++(int)
Definition: prevector.h:143
bool operator>=(const_iterator x) const
Definition: prevector.h:123
void fill(T *dst, ptrdiff_t count, const T &value=T{})
Definition: prevector.h:199
T value_type
Definition: prevector.h:42
const T * item_ptr(difference_type pos) const
Definition: prevector.h:197
size_type capacity
Definition: prevector.h:154
T * operator->()
Definition: prevector.h:89
iterator end()
Definition: prevector.h:287
Diff difference_type
Definition: prevector.h:41
void push_back(const T &value)
Definition: prevector.h:422
char * indirect
Definition: prevector.h:155
T & front()
Definition: prevector.h:435
prevector & operator=(prevector< N, T, Size, Diff > &&other)
Definition: prevector.h:272
value_type * pointer
Definition: prevector.h:45
const_reverse_iterator rend() const
Definition: prevector.h:293
const_reverse_iterator rbegin() const
Definition: prevector.h:291
T & operator[](size_type pos)
Definition: prevector.h:303
void swap(prevector< N, T, Size, Diff > &other)
Definition: prevector.h:451
bool operator<=(iterator x) const
Definition: prevector.h:73
void insert(iterator pos, size_type count, const T &value)
Definition: prevector.h:355
Diff difference_type
Definition: prevector.h:51
const_iterator operator+(size_type n)
Definition: prevector.h:117
Diff difference_type
Definition: prevector.h:102
T * ptr
Definition: prevector.h:49
Definition: prevector.h:151
prevector(size_type n)
Definition: prevector.h:235
reverse_iterator rend()
Definition: prevector.h:292
T & operator *()
Definition: prevector.h:87
const_reverse_iterator(reverse_iterator x)
Definition: prevector.h:138
bool operator>(const_iterator x) const
Definition: prevector.h:125
bool operator==(iterator x) const
Definition: prevector.h:70
reverse_iterator rbegin()
Definition: prevector.h:290
char direct[sizeof(T) *N]
Definition: prevector.h:152
iterator & operator+=(size_type n)
Definition: prevector.h:67
iterator erase(iterator pos)
Definition: prevector.h:396
bool operator<(iterator x) const
Definition: prevector.h:75
Diff difference_type
Definition: prevector.h:132
const_reverse_iterator(const T *ptr_)
Definition: prevector.h:137
const T & operator[](size_type pos) const
Definition: prevector.h:307
prevector()
Definition: prevector.h:233
T value_type
Definition: prevector.h:52
const_iterator(iterator x)
Definition: prevector.h:108
reverse_iterator & operator++()
Definition: prevector.h:92
Definition: prevector.h:38
bool operator!=(const_reverse_iterator x) const
Definition: prevector.h:146
const T & operator *() const
Definition: prevector.h:109
const_iterator & operator--()
Definition: prevector.h:113
bool operator==(reverse_iterator x) const
Definition: prevector.h:95
const_iterator operator-(size_type n)
Definition: prevector.h:119
void reserve(size_type new_capacity)
Definition: prevector.h:328
const T * operator->() const
Definition: prevector.h:110
const T value_type
Definition: prevector.h:133
const T & reference
Definition: prevector.h:135
void change_capacity(size_type new_capacity)
Definition: prevector.h:165
const T & reference
Definition: prevector.h:105
const T & front() const
Definition: prevector.h:439
Definition: prevector.h:129
prevector(InputIterator first, InputIterator last)
Definition: prevector.h:246
T * item_ptr(difference_type pos)
Definition: prevector.h:196
void * memcpy(void *a, const void *b, size_t c)
Definition: glibc_compat.cpp:18
bool empty() const
Definition: prevector.h:281
bool operator>(iterator x) const
Definition: prevector.h:74
Definition: prevector.h:48
reverse_iterator & operator--()
Definition: prevector.h:91
T & reference
Definition: prevector.h:54
std::random_access_iterator_tag iterator_category
Definition: prevector.h:55
union prevector::direct_or_indirect _union
std::bidirectional_iterator_tag iterator_category
Definition: prevector.h:136
static int count
Definition: tests.c:45
T value_type
Definition: prevector.h:82
const_iterator operator++(int)
Definition: prevector.h:114
iterator begin()
Definition: prevector.h:285
std::random_access_iterator_tag iterator_category
Definition: prevector.h:106
size_type size() const
Definition: prevector.h:277
iterator erase(iterator first, iterator last)
Definition: prevector.h:400
bool operator!=(const_iterator x) const
Definition: prevector.h:122
iterator & operator++()
Definition: prevector.h:61
size_type _size
Definition: prevector.h:150
difference_type friend operator-(iterator a, iterator b)
Definition: prevector.h:65
const T * indirect_ptr(difference_type pos) const
Definition: prevector.h:162
bool operator<(const_iterator x) const
Definition: prevector.h:126
T * pointer
Definition: prevector.h:53
prevector(size_type n, const T &val)
Definition: prevector.h:239
const T * ptr
Definition: prevector.h:100
const_iterator end() const
Definition: prevector.h:288
iterator & operator-=(size_type n)
Definition: prevector.h:69
void * memmove(void *a, const void *b, size_t c)
const_iterator begin() const
Definition: prevector.h:286
iterator & operator--()
Definition: prevector.h:62
bool operator==(const_iterator x) const
Definition: prevector.h:121
bool operator!=(reverse_iterator x) const
Definition: prevector.h:96
const T * pointer
Definition: prevector.h:134
const_iterator & operator+=(size_type n)
Definition: prevector.h:118
const_iterator(const T *ptr_)
Definition: prevector.h:107
value_type & reference
Definition: prevector.h:43
Definition: prevector.h:78
difference_type friend operator-(const_iterator a, const_iterator b)
Definition: prevector.h:116