diff options
| author | Paul Buetow <35781042+pbuetow@users.noreply.github.com> | 2021-03-29 17:49:16 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-29 17:49:16 +0100 |
| commit | 9a467da883976c74d231ea9c7773430f583bab98 (patch) | |
| tree | 4e75a996ef44bc5adc771c318753b0c4ad934269 /internal/datas/rbuffer.go | |
| parent | e811d1725ee5f931ece6fac01db70227b0fc8a7a (diff) | |
| parent | 93fce245564ffde20c3e5113757bc65672f69ed5 (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.go | 49 |
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 +} |
