FastLED 3.9.15
Loading...
Searching...
No Matches
circular_buffer.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/math_macros.h"
4#include "fl/namespace.h"
5#include "fl/ptr.h" // Assuming this provides `scoped_array` or similar
6#include <stddef.h> // For size_t
7#include <stdint.h> // For standard integer types
8
9namespace fl {
10
11template <typename T> class CircularBuffer {
12 public:
14 : mCapacity(capacity + 1), mHead(0),
15 mTail(0) { // Extra space for distinguishing full/empty
16 mBuffer.reset(new T[mCapacity]);
17 }
18
19 CircularBuffer(const CircularBuffer &) = delete;
21
22 bool push_back(const T &value) {
23 if (full()) {
24 mTail = increment(mTail); // Overwrite the oldest element
25 }
26 mBuffer[mHead] = value;
28 return true;
29 }
30
31 bool pop_front(T *dst = nullptr) {
32 if (empty()) {
33 return false;
34 }
35 if (dst) {
36 *dst = mBuffer[mTail];
37 }
39 return true;
40 }
41
42 bool push_front(const T &value) {
43 if (full()) {
44 mHead = decrement(mHead); // Overwrite the oldest element
45 }
47 mBuffer[mTail] = value;
48 return true;
49 }
50
51 bool pop_back(T *dst = nullptr) {
52 if (empty()) {
53 return false;
54 }
56 if (dst) {
57 *dst = mBuffer[mHead];
58 }
59 return true;
60 }
61
62 T &front() { return mBuffer[mTail]; }
63
64 const T &front() const { return mBuffer[mTail]; }
65
66 T &back() { return mBuffer[(mHead + mCapacity - 1) % mCapacity]; }
67
68 const T &back() const {
69 return mBuffer[(mHead + mCapacity - 1) % mCapacity];
70 }
71
72 T &operator[](size_t index) { return mBuffer[(mTail + index) % mCapacity]; }
73
74 const T &operator[](size_t index) const {
75 return mBuffer[(mTail + index) % mCapacity];
76 }
77
78 size_t size() const { return (mHead + mCapacity - mTail) % mCapacity; }
79
80 size_t capacity() const { return mCapacity - 1; }
81
82 bool empty() const { return mHead == mTail; }
83
84 bool full() const { return increment(mHead) == mTail; }
85
86 void clear() { mHead = mTail = 0; }
87
88 private:
89 size_t increment(size_t index) const { return (index + 1) % mCapacity; }
90
91 size_t decrement(size_t index) const {
92 return (index + mCapacity - 1) % mCapacity;
93 }
94
96 size_t mCapacity;
97 size_t mHead;
98 size_t mTail;
99};
100
101} // namespace fl
bool pop_front(T *dst=nullptr)
size_t capacity() const
T & operator[](size_t index)
bool pop_back(T *dst=nullptr)
const T & operator[](size_t index) const
fl::scoped_array< T > mBuffer
size_t size() const
CircularBuffer(size_t capacity)
CircularBuffer & operator=(const CircularBuffer &)=delete
const T & back() const
bool push_front(const T &value)
bool push_back(const T &value)
CircularBuffer(const CircularBuffer &)=delete
size_t decrement(size_t index) const
size_t increment(size_t index) const
const T & front() const
Implements the FastLED namespace macros.
Implements a simple red square effect for 2D LED grids.
Definition crgb.h:16