aboutsummaryrefslogtreecommitdiffstats
path: root/src/utility
diff options
context:
space:
mode:
Diffstat (limited to 'src/utility')
-rw-r--r--src/utility/CircularBuffer.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/utility/CircularBuffer.h b/src/utility/CircularBuffer.h
new file mode 100644
index 00000000..c8abe92e
--- /dev/null
+++ b/src/utility/CircularBuffer.h
@@ -0,0 +1,51 @@
+#pragma once
+
+#include <array>
+#include <cstddef>
+
+namespace Pinetime {
+ namespace Utility {
+ template <class T, size_t S>
+ struct CircularBuffer {
+ constexpr size_t Size() const {
+ return S;
+ }
+
+ size_t Idx() const {
+ return idx;
+ }
+
+ T& operator[](size_t n) {
+ return data[(idx + n) % S];
+ }
+
+ const T& operator[](size_t n) const {
+ return data[(idx + n) % S];
+ }
+
+ void operator++() {
+ idx++;
+ idx %= S;
+ }
+
+ void operator++(int) {
+ operator++();
+ }
+
+ void operator--() {
+ if (idx > 0) {
+ idx--;
+ } else {
+ idx = S - 1;
+ }
+ }
+
+ void operator--(int) {
+ operator--();
+ }
+
+ std::array<T, S> data;
+ size_t idx = 0;
+ };
+ }
+}