FancySafeBot 0.0.1
A safe robotics library
Loading...
Searching...
No Matches
fsb_circular_buffer.h
1#pragma once
2
3#include <array>
4#include <cstdlib>
5#include <cstdint>
6
7namespace fsb
8{
9
18enum class CircularBufferStatus : uint8_t
19{
23 SUCCESS = 0,
27 FULL,
31 EMPTY,
36};
37
42template<typename BufferType, size_t BufferSize>
44{
45 public:
46 CircularBuffer() = default;
47
54 CircularBufferStatus push(BufferType push_value);
55
62 CircularBufferStatus force_push(BufferType push_value);
63
70 CircularBufferStatus pop(BufferType &popped_value);
71
78 CircularBufferStatus pop_all(std::array<BufferType, BufferSize> &popped_values, size_t& num_popped);
79
84 void Reset();
85
91 size_t GetFilled() const
92 {
93 size_t filled_size = 0;
94 if (m_full)
95 {
96 filled_size = BufferSize;
97 }
98 else
99 {
100 filled_size = (m_tail > m_head ? (BufferSize - m_tail) + m_head : m_head - m_tail);
101 }
102 return filled_size;
103 }
104
110 size_t GetRemaining() const
111 {
112 size_t remaining_size = 0;
113 if (m_full)
114 {
115 remaining_size = 0;
116 }
117 else
118 {
119 remaining_size = (m_tail > m_head ? m_tail - m_head : BufferSize - (m_head - m_tail));
120 }
121 return remaining_size;
122 }
123
129 size_t GetSize() const
130 {
131 return BufferSize;
132 }
133
134 private:
138 std::array<BufferType, BufferSize> m_buffer;
144 size_t m_tail = 0;
150 size_t m_head = 0;
154 bool m_full = false;
155};
156
157// ===============================
158// CircularBuffer Implementation
159// ===============================
160
161template<typename BufferType, size_t BufferSize>
163{
165 if (GetRemaining() == 0)
166 {
168 }
169 else
170 {
171 // push to head of queue
172 m_buffer[m_head] = push_value;
173 m_head = (m_head + 1) % BufferSize;
174 m_full = (m_head == m_tail);
175 }
176 return status;
177}
178
179template<typename BufferType, size_t BufferSize>
181{
183 if (GetRemaining() == 0)
184 {
185 m_buffer[m_head] = push_value;
186 m_head = (m_head + 1) % BufferSize;
187 m_tail = m_head;
189 }
190 else
191 {
192 // push to head of queue
193 m_buffer[m_head] = push_value;
194 m_head = (m_head + 1) % BufferSize;
195 m_full = (m_head == m_tail);
196 }
197 return status;
198}
199
200template<typename BufferType, size_t BufferSize>
202{
204 if (GetFilled() == 0)
205 {
207 }
208 else
209 {
210 // consume at tail of queue
211 popped_value = m_buffer[m_tail];
212 // advance
213 m_tail = (m_tail + 1) % BufferSize;
214 m_full = false;
215 }
216 return status;
217}
218
219template<typename BufferType, size_t BufferSize>
220CircularBufferStatus CircularBuffer<BufferType, BufferSize>::pop_all(std::array<BufferType, BufferSize> &popped_values, size_t& num_popped)
221{
222 num_popped = 0;
223 while (GetFilled() > 0)
224 {
225 // consume at tail of queue
226 popped_values[num_popped] = m_buffer[m_tail];
227 num_popped++;
228 // advance
229 m_tail = (m_tail + 1) % BufferSize;
230 m_full = false;
231 }
233}
234
235
236template<typename BufferType, size_t BufferSize>
238{
239 m_head = 0;
240 m_tail = 0;
241 m_full = false;
242}
243
244}
Circular Buffer.
Definition fsb_circular_buffer.h:44
CircularBufferStatus
Definition fsb_circular_buffer.h:19
void Reset()
Reset buffer to empty state.
Definition fsb_circular_buffer.h:237
size_t GetRemaining() const
Get number of remaining buffer positions.
Definition fsb_circular_buffer.h:110
size_t GetSize() const
Get total buffer size.
Definition fsb_circular_buffer.h:129
size_t GetFilled() const
Get number of filled buffer positions.
Definition fsb_circular_buffer.h:91
CircularBufferStatus push(BufferType push_value)
Add value to the buffer if there is space available.
Definition fsb_circular_buffer.h:162
CircularBufferStatus pop(BufferType &popped_value)
Get oldest value from buffer.
Definition fsb_circular_buffer.h:201
CircularBufferStatus pop_all(std::array< BufferType, BufferSize > &popped_values, size_t &num_popped)
Get oldest value from buffer.
Definition fsb_circular_buffer.h:220
CircularBufferStatus force_push(BufferType push_value)
Add value to buffer and overwrite oldest value if buffer is full.
Definition fsb_circular_buffer.h:180
@ OVERWRITE
Adding to buffer overwrote existing data.
@ EMPTY
Operation failed, buffer is empty.
@ FULL
Operation failed, buffer is full.
@ SUCCESS
Successful operation.