InfiniTime.git

commit 6d5847e0467863addbbb1d8e85905dd5e682d145

Author: Finlay Davidson <finlay.davidson@coderclass.nl>

circularbuffer: Add circular buffer utility struct

 src/utility/CircularBuffer.h | 51 ++++++++++++++++++++++++++++++++++++++


diff --git a/src/utility/CircularBuffer.h b/src/utility/CircularBuffer.h
new file mode 100644
index 0000000000000000000000000000000000000000..c8abe92e4e58284004ee866cc93fabcbed7e7ed1
--- /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;
+    };
+  }
+}