5 #ifndef BITCOIN_PREVECTOR_H 6 #define BITCOIN_PREVECTOR_H 15 #include <type_traits> 36 template<
unsigned int N,
typename T,
typename Size = u
int32_t,
typename Diff =
int32_t>
59 const T&
operator[](size_type pos)
const {
return ptr[pos]; }
110 const T&
operator[](size_type pos)
const {
return ptr[pos]; }
149 #pragma pack(push, 1) 151 char direct[
sizeof(T) * N];
158 alignas(
char*) direct_or_indirect
_union = {};
161 static_assert(
alignof(
char*) %
alignof(size_type) == 0 &&
sizeof(
char*) %
alignof(size_type) == 0,
"size_type cannot have more restrictive alignment requirement than pointer");
162 static_assert(
alignof(
char*) %
alignof(T) == 0,
"value_type T cannot have more restrictive alignment requirement than pointer");
171 if (new_capacity <= N) {
189 char* new_indirect =
static_cast<char*
>(malloc(((
size_t)
sizeof(T)) * new_capacity));
190 assert(new_indirect);
192 T* dst =
reinterpret_cast<T*
>(new_indirect);
204 void fill(T* dst, ptrdiff_t
count,
const T& value = T{}) {
205 std::fill_n(dst, count, value);
208 template<
typename InputIterator>
209 void fill(T* dst, InputIterator first, InputIterator last) {
210 while (first != last) {
211 new(
static_cast<void*
>(dst)) T(*first);
227 template<
typename InputIterator>
228 void assign(InputIterator first, InputIterator last) {
229 size_type n = last - first;
250 template<
typename InputIterator>
252 size_type n = last - first;
259 size_type n = other.
size();
270 if (&other ==
this) {
283 return is_direct() ? _size : _size - N - 1;
298 const_reverse_iterator
rend()
const {
return const_reverse_iterator(
item_ptr(-1)); }
317 size_type cur_size =
size();
318 if (cur_size == new_size) {
321 if (cur_size > new_size) {
328 ptrdiff_t increase = new_size - cur_size;
348 size_type p = pos -
begin();
349 size_type new_size =
size() + 1;
356 new(
static_cast<void*
>(
ptr)) T(value);
361 size_type p = pos -
begin();
367 memmove(ptr + count, ptr, (
size() - p) *
sizeof(T));
372 template<
typename InputIterator>
374 size_type p = pos -
begin();
375 difference_type count = last - first;
381 memmove(ptr + count, ptr, (
size() - p) *
sizeof(T));
383 fill(ptr, first, last);
391 _size += new_size -
size();
394 if (new_size <
size()) {
397 _size += new_size -
size();
402 return erase(pos, pos + 1);
413 char* endp = (
char*)&(*
end());
414 if (!std::is_trivially_destructible<T>::value) {
423 memmove(&(*first), &(*last), endp - ((
char*)(&(*last))));
427 template<
typename... Args>
429 size_type new_size =
size() + 1;
463 std::swap(_size, other.
_size);
467 if (!std::is_trivially_destructible<T>::value) {
480 const_iterator b1 =
begin();
481 const_iterator b2 = other.
begin();
482 const_iterator e1 =
end();
484 if ((*b1) != (*b2)) {
494 return !(*
this == other);
497 bool operator<(const prevector<N, T, Size, Diff>& other)
const {
498 if (
size() < other.size()) {
501 if (
size() > other.size()) {
504 const_iterator b1 =
begin();
505 const_iterator b2 = other.begin();
506 const_iterator e1 =
end();
532 const value_type*
data()
const {
537 #endif // BITCOIN_PREVECTOR_H T * direct_ptr(difference_type pos)
struct prevector::direct_or_indirect::@2 indirect_contents
std::bidirectional_iterator_tag iterator_category
prevector & operator=(const prevector< N, T, Size, Diff > &other)
const value_type & const_reference
const_iterator operator--(int)
void resize(size_type new_size)
const value_type * const_pointer
bool operator!=(const prevector< N, T, Size, Diff > &other) const
void assign(size_type n, const T &val)
bool operator>=(iterator x) const
T * indirect_ptr(difference_type pos)
iterator operator+(size_type n)
bool operator==(const prevector< N, T, Size, Diff > &other) const
iterator operator-(size_type n)
prevector(prevector< N, T, Size, Diff > &&other)
bool operator==(reverse_iterator x) const
void assign(InputIterator first, InputIterator last)
reverse_iterator operator++(int)
iterator insert(iterator pos, const T &value)
const T * direct_ptr(difference_type pos) const
const value_type * data() const
bool operator<(iterator x) const
reverse_iterator operator--(int)
const_iterator & operator-=(size_type n)
const_reverse_iterator & operator--()
const_iterator & operator++()
void insert(iterator pos, InputIterator first, InputIterator last)
const T * operator->() const
const_reverse_iterator operator--(int)
reverse_iterator(T *ptr_)
bool operator!=(const_reverse_iterator x) const
void fill(T *dst, InputIterator first, InputIterator last)
bool operator<=(iterator x) const
bool operator!=(const_iterator x) const
const_reverse_iterator rend() const
const T & operator[](size_type pos) const
void resize_uninitialized(size_type new_size)
const_reverse_iterator & operator++()
T & operator[](size_type pos)
const T * operator->() const
prevector(const prevector< N, T, Size, Diff > &other)
direct_or_indirect _union
const_reverse_iterator operator++(int)
void fill(T *dst, ptrdiff_t count, const T &value=T{})
bool operator!=(reverse_iterator x) const
void push_back(const T &value)
prevector & operator=(prevector< N, T, Size, Diff > &&other)
const T * indirect_ptr(difference_type pos) const
T & operator[](size_type pos)
void swap(prevector< N, T, Size, Diff > &other)
void insert(iterator pos, size_type count, const T &value)
const_iterator operator+(size_type n)
const_reverse_iterator(reverse_iterator x)
reverse_iterator rbegin()
iterator & operator+=(size_type n)
iterator erase(iterator pos)
const T * item_ptr(difference_type pos) const
const_reverse_iterator(const T *ptr_)
const_iterator begin() const
const_iterator(iterator x)
reverse_iterator & operator++()
const T * operator->() const
Implements a drop-in replacement for std::vector<T> which stores up to N elements directly (without h...
size_t allocated_memory() const
const_iterator & operator--()
const_iterator operator-(size_type n)
void reserve(size_type new_capacity)
bool operator!=(iterator x) const
bool operator<=(const_iterator x) const
const T & operator*() const
bool operator==(const_reverse_iterator x) const
const_reverse_iterator rbegin() const
void change_capacity(size_type new_capacity)
prevector(InputIterator first, InputIterator last)
T * item_ptr(difference_type pos)
const T & operator*() const
void * memcpy(void *a, const void *b, size_t c)
void emplace_back(Args &&...args)
bool operator<(const_iterator x) const
reverse_iterator & operator--()
bool operator==(iterator x) const
std::random_access_iterator_tag iterator_category
std::bidirectional_iterator_tag iterator_category
const_iterator operator++(int)
const_iterator end() const
std::random_access_iterator_tag iterator_category
iterator erase(iterator first, iterator last)
bool operator>(const_iterator x) const
bool operator==(const_iterator x) const
bool operator>(iterator x) const
difference_type friend operator-(iterator a, iterator b)
const T & operator[](size_type pos) const
prevector(size_type n, const T &val)
iterator & operator-=(size_type n)
void * memmove(void *a, const void *b, size_t c)
bool operator>=(const_iterator x) const
const_iterator & operator+=(size_type n)
const_iterator(const T *ptr_)
const T & operator[](size_type pos) const
const T & operator*() const
difference_type friend operator-(const_iterator a, const_iterator b)