summaryrefslogtreecommitdiff
path: root/internal/datas/rbuffer.go
diff options
context:
space:
mode:
authorPaul Buetow <35781042+pbuetow@users.noreply.github.com>2021-03-29 17:49:16 +0100
committerGitHub <noreply@github.com>2021-03-29 17:49:16 +0100
commit9a467da883976c74d231ea9c7773430f583bab98 (patch)
tree4e75a996ef44bc5adc771c318753b0c4ad934269 /internal/datas/rbuffer.go
parente811d1725ee5f931ece6fac01db70227b0fc8a7a (diff)
parent93fce245564ffde20c3e5113757bc65672f69ed5 (diff)
Merge pull request #22 from snonux/develop
Add context awareness to dgrep
Diffstat (limited to 'internal/datas/rbuffer.go')
-rw-r--r--internal/datas/rbuffer.go49
1 files changed, 49 insertions, 0 deletions
diff --git a/internal/datas/rbuffer.go b/internal/datas/rbuffer.go
new file mode 100644
index 0000000..df8f622
--- /dev/null
+++ b/internal/datas/rbuffer.go
@@ -0,0 +1,49 @@
+package datas
+
+import "fmt"
+
+// RBuffer is a simple circular string ring buffer data structure.
+type RBuffer struct {
+ Capacity int
+ size int
+ readPos int
+ writePos int
+ data []string
+}
+
+// NewRBuffer creates a new string ring buffer.
+func NewRBuffer(capacity int) (*RBuffer, error) {
+ if capacity < 1 {
+ return nil, fmt.Errorf("RBuffer capacity must not be less than 1")
+ }
+
+ r := RBuffer{
+ Capacity: capacity,
+ size: capacity + 1,
+ data: make([]string, capacity+1),
+ }
+
+ return &r, nil
+}
+
+// Add a value.
+func (r *RBuffer) Add(value string) {
+ r.data[r.writePos] = value
+ r.writePos = (r.writePos + 1) % r.size
+
+ if r.writePos == r.readPos {
+ r.readPos = (r.readPos + 1) % r.size
+ }
+}
+
+// Get a value.
+func (r *RBuffer) Get() (string, bool) {
+ if r.readPos == r.writePos {
+ // RBuffer is empty.
+ return "", false
+ }
+
+ value := r.data[r.readPos]
+ r.readPos = (r.readPos + 1) % r.size
+ return value, true
+}