Tool Libs
UMIT-TIROL Institute of Automation and Control Engineering library collection
 
Loading...
Searching...
No Matches
queue.h
Go to the documentation of this file.
1
5#pragma once
6#include "buffer.h"
7
8#include <core/streams.h>
9
11template <typename T>
12class Queue : public Sink<T>, public Source<T> {
13 Buffer<T> q;
14 struct WrappingIndex {
15 WrappingIndex(size_t sz) : sz(sz) { }
16 WrappingIndex(const WrappingIndex &other) : val(other.val), sz(other.sz) {}
17 WrappingIndex& operator=(const WrappingIndex &other) {
18 val = other.val;
19 sz = other.sz;
20 return *this;
21 }
22 size_t val{};
23 size_t sz{};
24 operator size_t() {
25 return val;
26 }
27 size_t operator++(int) {
28 auto tmp = val;
29 val = (val + 1) % sz;
30 return tmp;
31 }
32 } head, tail;
33
34public:
36 Queue(const Buffer<T> &buf) : q(buf), head{q.size}, tail{q.size} {}
37 Queue(Buffer<T> &&buf) : q(std::move(buf)), head{q.size}, tail{q.size} {}
39 Queue(size_t size=30)
40 : q(size)
41 , head{size}
42 , tail{size}
43 { }
44 using Sink<T>::push;
49 void push(T &&val) override {
50 assert(q.len < q.size);
51 q[tail++] = std::move(val);
52 q.len++;
53 }
55 T& front() {
56 assert(q.len != 0);
57 return q[head];
58 }
65 T pop() override {
66 assert(q.len != 0);
67 q.len--;
68 return std::move(q[head++]);
69 }
73 void drop() {
74 assert(q.len != 0);
75 q.len--;
76 head++;
77 }
79 size_t size() {
80 return q.len;
81 }
83 bool empty() override {
84 return q.len == 0;
85 }
87 bool full() override {
88 return q.len == q.size;
89 }
91 T getAt(size_t idx) {
92 return q[(head + idx) % head.sz];
93 }
94};
Copyright (c) 2023 IACE.
simple Buffer backed queue implementation
Definition queue.h:12
Queue(const Buffer< T > &buf)
create Queue directly from filled Buffer
Definition queue.h:36
T pop() override
remove front of queue and return it
Definition queue.h:65
T getAt(size_t idx)
return element at idx
Definition queue.h:91
Queue(size_t size=30)
create Queue with constant size
Definition queue.h:39
bool empty() override
check if queue is empty
Definition queue.h:83
bool full() override
return true if queue is full
Definition queue.h:87
void push(T &&val) override
move element into queue
Definition queue.h:49
void drop()
shift head of queue without touching underlying memory
Definition queue.h:73
size_t size()
return number of elements in queue
Definition queue.h:79
T & front()
return reference to first element in queue
Definition queue.h:55
Copyright (c) 2023 IACE.
dynamically allocated, but fixed-size buffer template
Definition buffer.h:18
size_t size
total capacity of buffer
Definition buffer.h:23
size_t len
number of items stored in buffer
Definition buffer.h:21
generic object sink, i.e.
Definition streams.h:15
generic object source, i.e.
Definition streams.h:40