27 # ifndef TPL_MEMARRAY_H 28 # define TPL_MEMARRAY_H 37 # include <ahIterator.H> 38 # include <array_it.H> 39 # include <array_utils.H> 41 using namespace Aleph;
77 static constexpr
size_t Min_Dim = 4;
87 mutable size_t contract_threshold;
92 T *
get_ptr() const noexcept {
return ptr; }
95 const size_t &
get_dim() const noexcept {
return dim; }
102 assert(is_power_of_2(dim));
104 contract_threshold = dim / 4;
121 assert(is_power_of_2(dim));
125 const size_t newsz = dim << 1;
126 const size_t mask = dim - 1;
127 T * new_ptr =
new T [newsz];
128 for (
size_t i = 0; i < dim; ++i)
130 assert(((i +
first) & mask) == ((i +
first) % dim));
131 std::swap(ptr[(i +
first) & mask], new_ptr[i]);
136 contract_threshold = dim/4;
154 if (n > contract_threshold)
157 const size_t newsz = dim >> 1;
159 if (newsz <= Min_Dim)
162 T * new_ptr =
new T [newsz];
164 const size_t mask = dim - 1;
165 for (
int i = 0; i < newsz; ++i)
167 assert(((
first + i) & mask) == ((
first + i) % dim));
168 std::swap(ptr[(
first + i) & mask], new_ptr[i]);
171 for (
int i = newsz; i < dim; ++i)
177 contract_threshold = dim/4;
183 void init_dim(
size_t d) noexcept
189 dim = is_power_of_2(d) ? d : 1 << ++k;
192 assert(dim == 1 << k);
203 size_t size() const noexcept {
return n; }
214 MemArray(
size_t __dim = Min_Dim) : ptr(nullptr), n(0)
216 static_assert(std::is_copy_constructible<T>::value,
217 "No copy constructor for T");
218 static_assert(std::is_move_constructible<T>::value,
219 "No move constructor for T");
220 static_assert(std::is_copy_assignable<T>::value,
221 "No copy assign for T");
222 static_assert(std::is_move_assignable<T>::value,
223 "No move assign for T");
240 std::swap(ptr, a.ptr);
241 std::swap(dim, a.dim);
243 std::swap(contract_threshold, a.contract_threshold);
248 : ptr(nullptr), dim(a.dim), n(a.n)
251 for (
int i = 0; i < dim; ++i)
257 : ptr(
nullptr), dim(0), n(0), contract_threshold(0)
271 T * newptr =
new T [a.dim];
272 for (
int i = 0; i < a.n; ++i)
273 newptr[i] = a.ptr[i];
327 ptr[n] = std::forward<T>(item);
334 void open_gap(
size_t pos = 0,
size_t num_entries = 1)
337 Aleph::open_gap(ptr, n, pos, num_entries);
340 void close_gap(
size_t pos,
size_t num_entries = 1)
342 Aleph::close_gap(ptr, n, pos, num_entries);
367 ptr[0] = std::forward<T>(item);
375 throw std::underflow_error(
"top(): MemArray is empty");
384 throw std::underflow_error(
"remove_first(): MemArray is empty");
386 T ret = move(ptr[0]);
405 return put(std::forward<T>(item));
419 return push(std::forward<T>(item));
434 size_t new_n = n + more;
441 size_t new_dim = dim;
442 while (new_dim < new_n)
445 T * new_ptr =
new T[new_dim];
446 for (
size_t i = 0; i < n; ++i)
447 std::swap(ptr[i], new_ptr[i]);
453 contract_threshold = dim/4;
458 const size_t old_n = n;
459 const size_t num_entries = a.
size();
461 for (
size_t i = 0; i < num_entries; ++i)
462 ptr[old_n + i] = a.ptr[i];
487 size_t k = log2(cap);
488 const size_t new_dim = is_power_of_2(cap) ? cap : 1 << ++k;
490 T * new_ptr =
new T[new_dim];
491 for (
size_t i = 0; i < n; ++i)
492 std::swap(ptr[i], new_ptr[i]);
497 contract_threshold = dim/4;
507 throw std::underflow_error(
"MemArray::get(): deleted more entries" 511 T ret = std::move(ptr[n]);
518 T get_ne(
size_t i = 1) noexcept
523 T ret = std::move(ptr[n]);
537 throw std::underflow_error(
"MemArray::last(): empty array");
545 throw std::underflow_error(
"MemArray::first(): empty array");
558 for (
size_t i = 0, j = n - 1; i < j; ++i, --j)
559 std::swap(ptr[i], ptr[j]);
565 T &
access(
const size_t i)
const noexcept
577 throw std::out_of_range(
"access out of range");
597 template <
class Operation>
601 for (
int i = 0; i < n; i++)
602 if (not operation(ptr[i]))
609 template <
class Operation>
616 template <
class Operation>
619 return traverse<Operation>(operation);
623 template <
class Operation>
626 return traverse<Operation>(operation);
629 bool is_valid()
const noexcept {
return ptr; }
644 assert(a.ptr !=
nullptr);
652 # endif // TPL_MEMARRAY_H Definition: tpl_memArray.H:73
T & get_first() const
Definition: tpl_memArray.H:550
void empty_and_release()
Empty the array and release all memory.
Definition: tpl_memArray.H:295
T & access(const size_t i) const noexcept
Definition: tpl_memArray.H:565
const size_t & get_dim() const noexcept
Return the current dimension of array.
Definition: tpl_memArray.H:95
T pop()
pop() the most recently pushed item
Definition: tpl_memArray.H:392
bool traverse(Operation &&operation) const
Definition: tpl_memArray.H:617
T & push(const T &item)
Definition: tpl_memArray.H:350
size_t capacity() const noexcept
The type of element of array.
Definition: tpl_memArray.H:200
T & first() const
Return a modifiable reference to the first element.
Definition: tpl_memArray.H:542
void reserve(const size_t cap)
Definition: tpl_memArray.H:481
void allocate()
Allocate memory for the current dimension.
Definition: tpl_memArray.H:100
void swap(MemArray &a) noexcept
Swap in constant time this with a
Definition: tpl_memArray.H:238
T & put(T &&item)
Definition: tpl_memArray.H:322
bool contract(const size_t first=0)
Definition: tpl_memArray.H:151
T & last() const
Return a modifiable reference to the last element.
Definition: tpl_memArray.H:534
MemArray(const MemArray &a)
Construct a copy of a
Definition: tpl_memArray.H:247
Definition: array_it.H:45
T * get_ptr() const noexcept
Return the current base of array.
Definition: tpl_memArray.H:92
bool traverse(Operation &operation)
Definition: tpl_memArray.H:598
size_t size() const noexcept
Return the number of elements.
Definition: tpl_memArray.H:203
bool traverse(Operation &operation) const
Definition: tpl_memArray.H:610
T remove_last()
Definition: tpl_memArray.H:531
Definition: tpl_memArray.H:635
void putn(const size_t more)
Definition: tpl_memArray.H:431
T & append(T &&item)
Definition: tpl_memArray.H:402
T & insert(T &&item)
Definition: tpl_memArray.H:416
T remove_first()
Remove first item. Gap is closed.
Definition: tpl_memArray.H:381
T & get_last() const
Definition: tpl_memArray.H:553
T & append(T &item)
Definition: tpl_memArray.H:395
void empty()
Empty the container. The array is not contracted.
Definition: tpl_memArray.H:292
bool expand(const size_t first=0)
Definition: tpl_memArray.H:118
T & operator[](const size_t i) const
Definition: tpl_memArray.H:573
MemArray(MemArray &&a) noexcept
Construct a array moved of rvalue a
Definition: tpl_memArray.H:256
bool is_empty() const noexcept
Return true is the array is empty.
Definition: tpl_memArray.H:206
T & put(const T &item)
Definition: tpl_memArray.H:310
MemArray & operator=(const MemArray &a)
Assign by copy a to this
Definition: tpl_memArray.H:264
MemArray(size_t __dim=Min_Dim)
Definition: tpl_memArray.H:214
MemArray & reverse()
Reverse the order of items in array.
Definition: tpl_memArray.H:556
T & insert(T &item)
Definition: tpl_memArray.H:409
Iterator(const MemArray< T > &a) noexcept
Construct an iterator on array a
Definition: tpl_memArray.H:641
bool traverse(Operation &&operation)
Definition: tpl_memArray.H:624
T & push(T &&item)
Definition: tpl_memArray.H:362
T & operator()(const size_t i) const noexcept
Definition: tpl_memArray.H:583