aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/containers/ring_buffer/ring_buffer.h
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/containers/ring_buffer/ring_buffer.h
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/containers/ring_buffer/ring_buffer.h')
-rw-r--r--library/cpp/containers/ring_buffer/ring_buffer.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/library/cpp/containers/ring_buffer/ring_buffer.h b/library/cpp/containers/ring_buffer/ring_buffer.h
new file mode 100644
index 0000000000..41220dcf6b
--- /dev/null
+++ b/library/cpp/containers/ring_buffer/ring_buffer.h
@@ -0,0 +1,81 @@
+#pragma once
+
+#include <util/generic/vector.h>
+#include <util/system/yassert.h>
+
+template <typename T>
+class TSimpleRingBuffer {
+public:
+ TSimpleRingBuffer(size_t maxSize)
+ : MaxSize(maxSize)
+ {
+ Items.reserve(MaxSize);
+ }
+
+ TSimpleRingBuffer(const TSimpleRingBuffer&) = default;
+ TSimpleRingBuffer(TSimpleRingBuffer&&) = default;
+
+ TSimpleRingBuffer& operator=(const TSimpleRingBuffer&) = default;
+ TSimpleRingBuffer& operator=(TSimpleRingBuffer&&) = default;
+
+ // First available item
+ size_t FirstIndex() const {
+ return Begin;
+ }
+
+ size_t AvailSize() const {
+ return Items.size();
+ }
+
+ // Total number of items inserted
+ size_t TotalSize() const {
+ return FirstIndex() + AvailSize();
+ }
+
+ bool IsAvail(size_t index) const {
+ return index >= FirstIndex() && index < TotalSize();
+ }
+
+ const T& operator[](size_t index) const {
+ Y_ASSERT(IsAvail(index));
+ return Items[RealIndex(index)];
+ }
+
+ T& operator[](size_t index) {
+ Y_ASSERT(IsAvail(index));
+ return Items[RealIndex(index)];
+ }
+
+ void PushBack(const T& t) {
+ if (Items.size() < MaxSize) {
+ Items.push_back(t);
+ } else {
+ Items[RealIndex(Begin)] = t;
+ Begin += 1;
+ }
+ }
+
+ void Clear() {
+ Items.clear();
+ Begin = 0;
+ }
+
+private:
+ size_t RealIndex(size_t index) const {
+ return index % MaxSize;
+ }
+
+private:
+ size_t MaxSize;
+ size_t Begin = 0;
+ TVector<T> Items;
+};
+
+template <typename T, size_t maxSize>
+class TStaticRingBuffer: public TSimpleRingBuffer<T> {
+public:
+ TStaticRingBuffer()
+ : TSimpleRingBuffer<T>(maxSize)
+ {
+ }
+};