28 # ifndef TPL_ARRAYQUEUE_H 29 # define TPL_ARRAYQUEUE_H 31 # include <ahAssert.H> 35 # include <ah-args-ctor.H> 36 # include <tpl_dynDlist.H> 37 # include <tpl_memArray.H> 39 using namespace Aleph;
62 public StlAlephIterator<ArrayQueue<T>>
69 void increase_index(
size_t & i,
const size_t inc = 1)
const noexcept
75 T & rear_item(
const size_t i = 0)
const noexcept
77 return this->
access((
size_t) (rear_index - i - 1) % this->dim);
86 std::swap(front_index, q.front_index);
87 std::swap(rear_index, q.rear_index);
96 :
MemArray<T>(sz), front_index(0), rear_index(0)
103 :
MemArray<T>(q), front_index(q.front_index), rear_index(q.rear_index)
111 front_index(q.front_index), rear_index(q.rear_index)
126 front_index = q.front_index;
127 rear_index = q.rear_index;
135 std::swap(front_index, q.front_index);
136 std::swap(rear_index, q.rear_index);
143 T & complete_put() noexcept
145 T & ret_val = this->
access(rear_index);
146 increase_index(rear_index);
161 if (this->
expand(front_index))
164 rear_index = this->n;
166 this->
access(rear_index) = item;
167 return complete_put();
173 if (this->
expand(front_index))
176 rear_index = this->n;
178 this->
access(rear_index) = std::forward<T>(item);
179 return complete_put();
186 T &
append(T && item) {
return put(std::forward<T>(item)); }
192 T &
insert(T && item) {
return put(std::forward<T>(item)); }
209 const size_t max_sz = 2*this->dim - this->n;
211 throw std::overflow_error(
"Maximum putn size reached");
213 const int avail_n = this->dim - this->n;
216 sz -= this->dim - this->n;
218 this->
expand(front_index);
221 increase_index(rear_index, sz);
234 throw std::underflow_error (
"queue is empty");
236 T ret_val = std::forward<T>(this->
access(front_index));
238 increase_index(front_index);
243 rear_index = this->n;
258 throw std::underflow_error (
"queue is empty");
261 increase_index(front_index, i);
266 rear_index = this->n;
269 return this->
access(front_index);
281 throw std::range_error (
"index of front out of range");
283 return this->
access((front_index + i) % this->dim);
292 T &
rear(
const size_t i = 0)
const 295 throw std::range_error (
"index of rear out of range");
307 template <
class Operation>
313 for (
size_t i = 0, idx = front_index; i < this->n; increase_index(idx), ++i)
314 if (not operation(this->
access(idx)))
320 template <
class Operation>
327 template <
class Operation>
330 return traverse<Operation>(operation);
334 template <
class Operation>
337 return traverse<Operation>(operation);
353 : Base(q.ptr, q.dim, q.n, q.front_index, (q.rear_index - 1) % q.dim) {}
370 template <
typename T>
375 public StlAlephIterator<FixedQueue<T>>
386 void increase_index(
size_t & i,
const size_t inc = 1)
const noexcept
388 assert( ((i + inc)%dim) == ((i+ inc)&mask) );
394 T & rear_item(
const size_t i = 0)
const noexcept
396 assert(static_cast<size_t>((rear_index - i - 1) & mask) ==
397 (rear_index - i - 1)%dim);
399 return array[
static_cast<size_t> ((rear_index - i - 1) & mask)];
408 std::swap(dim, q.dim);
409 std::swap(array, q.array);
410 std::swap(front_index, q.front_index);
411 std::swap(rear_index, q.rear_index);
412 std::swap(mask, q.mask);
413 std::swap(num_items, q.num_items);
419 front_index = rear_index = num_items = 0;
432 : array(nullptr), front_index(0), rear_index(0), num_items(0)
435 dim = is_power_of_2(d) ? d : 1 << ++k;
442 if (array !=
nullptr)
448 : dim(q.dim), array(new T [dim]), front_index(q.front_index),
449 rear_index(q.rear_index), mask(q.mask), num_items(q.num_items)
451 for (
size_t i = front_index; i != rear_index; ++i)
452 array[i] = q.array[i];
469 if (array !=
nullptr)
488 T &
put(
const T& item) noexcept
490 assert(num_items < dim);
491 array[rear_index] = item;
492 T & ret_val = array[rear_index];
493 increase_index(rear_index);
499 T &
put(T && item) noexcept
501 assert(num_items < dim);
502 array[rear_index] = std::forward<T>(item);
503 T & ret_val = array[rear_index];
504 increase_index(rear_index);
510 T &
append(
const T& item) noexcept {
return put(item); }
513 T &
append(T && item) noexcept {
return put(std::forward<T>(item)); }
516 T &
insert(
const T& item) noexcept {
return put(item); }
519 T &
insert(T && item) noexcept {
return put(std::forward<T>(item)); }
526 T &
putn(
const size_t n) noexcept
528 assert(num_items + n < dim);
529 increase_index(rear_index, n);
540 assert(num_items > 0);
542 T ret_val = std::move(array[front_index]);
543 increase_index(front_index);
553 T &
getn(
const size_t n) noexcept
555 assert(num_items >= n);
557 increase_index(front_index, n);
558 return array[front_index];
566 T &
front(
const size_t i = 0) const noexcept
568 assert(i < num_items);
569 return array[front_index + i];
577 T &
rear(
const size_t i = 0) const noexcept
579 assert(i < num_items);
584 size_t size() const noexcept {
return num_items; }
587 bool is_empty() const noexcept {
return num_items == 0; }
599 template <
class Operation>
600 bool traverse(Operation & operation) noexcept(noexcept(operation))
604 for (
size_t i = 0, idx = front_index; i < num_items; increase_index(idx), ++i)
605 if (not operation(array[idx]))
611 template <
class Operation>
612 bool traverse(Operation & operation)
const noexcept(noexcept(operation))
618 template <
class Operation>
619 bool traverse(Operation && operation = Operation())
620 const noexcept(noexcept(operation))
622 return traverse<Operation>(operation);
626 template <
class Operation>
627 bool traverse(Operation && operation = Operation())
628 noexcept(noexcept(operation))
630 return traverse<Operation>(operation);
646 : Base(q.array, q.dim, q.num_items, q.front_index,
647 (q.rear_index - 1) % q.dim) {}
Definition: tpl_memArray.H:73
T & access(const size_t i) const noexcept
Definition: tpl_memArray.H:565
Definition: htlist.H:1290
T & putn(size_t sz)
Definition: tpl_arrayQueue.H:207
Definition: tpl_arrayQueue.H:639
T & getn(const size_t n) noexcept
Definition: tpl_arrayQueue.H:553
T & put(T &&item)
Definition: tpl_arrayQueue.H:171
T & front(const size_t i=0) const noexcept
Definition: tpl_arrayQueue.H:566
T & insert(T &&item) noexcept
Definition: tpl_arrayQueue.H:519
bool traverse(Operation &&operation) const
Definition: tpl_arrayQueue.H:328
ArrayQueue & operator=(const ArrayQueue &q)
Copy assign.
Definition: tpl_arrayQueue.H:119
bool traverse(Operation &&operation=Operation()) noexcept(noexcept(operation))
Definition: tpl_arrayQueue.H:627
T & front(const size_t i=0) const
Definition: tpl_arrayQueue.H:278
Definition: tpl_arrayQueue.H:371
void empty() noexcept
empty the queue
Definition: tpl_arrayQueue.H:417
void swap(MemArray &a) noexcept
Swap in constant time this with a
Definition: tpl_memArray.H:238
Definition: tpl_arrayQueue.H:57
T & append(T &&item)
Definition: tpl_arrayQueue.H:186
bool traverse(Operation &operation) noexcept(noexcept(operation))
Definition: tpl_arrayQueue.H:600
bool contract(const size_t first=0)
Definition: tpl_memArray.H:151
T & put(const T &item)
Definition: tpl_arrayQueue.H:159
Definition: tpl_arrayQueue.H:346
T & append(T &&item) noexcept
Definition: tpl_arrayQueue.H:513
T & insert(const T &item)
Definition: tpl_arrayQueue.H:189
T & put(const T &item) noexcept
Definition: tpl_arrayQueue.H:488
T & getn(const size_t i)
Definition: tpl_arrayQueue.H:255
ArrayQueue(const ArrayQueue &q)
Copy constructor.
Definition: tpl_arrayQueue.H:102
T & insert(const T &item) noexcept
Definition: tpl_arrayQueue.H:516
bool traverse(Operation &operation) const noexcept(noexcept(operation))
Definition: tpl_arrayQueue.H:612
bool traverse(Operation &&operation)
Definition: tpl_arrayQueue.H:335
T & putn(const size_t n) noexcept
Definition: tpl_arrayQueue.H:526
Definition: tpl_memArray.H:635
ArrayQueue(ArrayQueue &&q)
Move constructor.
Definition: tpl_arrayQueue.H:109
void swap(ArrayQueue &q) noexcept
Swap this with q
Definition: tpl_arrayQueue.H:83
size_t size() const noexcept
Return the number of items.
Definition: tpl_arrayQueue.H:584
bool is_empty() const noexcept
Return true if the queue is empty.
Definition: tpl_arrayQueue.H:587
bool traverse(Operation &operation)
Definition: tpl_arrayQueue.H:308
FixedQueue(FixedQueue &&q) noexcept
Move constructor.
Definition: tpl_arrayQueue.H:456
bool traverse(Operation &operation) const
Definition: tpl_arrayQueue.H:321
FixedQueue(size_t d=1024)
Definition: tpl_arrayQueue.H:429
bool expand(const size_t first=0)
Definition: tpl_memArray.H:118
ArrayQueue(const size_t sz=8)
Definition: tpl_arrayQueue.H:95
FixedQueue(const FixedQueue &q)
Copy constructor.
Definition: tpl_arrayQueue.H:447
T & put(T &&item) noexcept
Definition: tpl_arrayQueue.H:499
size_t capacity() const noexcept
Return the queue capacity (maximum number of element to be stored)
Definition: tpl_arrayQueue.H:590
T & rear(const size_t i=0) const noexcept
Definition: tpl_arrayQueue.H:577
T & append(const T &item) noexcept
Definition: tpl_arrayQueue.H:510
T & append(const T &item)
Definition: tpl_arrayQueue.H:183
Definition: htlist.H:1323
bool traverse(Operation &&operation=Operation()) const noexcept(noexcept(operation))
Definition: tpl_arrayQueue.H:619
T & rear(const size_t i=0) const
Definition: tpl_arrayQueue.H:292
T & insert(T &&item)
Definition: tpl_arrayQueue.H:192