diff --git a/buffer.go b/buffer.go index 321c7a1..858d97f 100644 --- a/buffer.go +++ b/buffer.go @@ -7,6 +7,7 @@ import ( // Buffer is a 2-dimensional buffer type Buffer[T any] struct { data [][]T + x, y int width int height int parent *Buffer[T] @@ -24,6 +25,7 @@ func NewBuffer[T any](width, height int, defaultValue T) *Buffer[T] { } return &Buffer[T]{ + x: 0, y: 0, data: b, width: width, height: height, @@ -32,18 +34,18 @@ func NewBuffer[T any](width, height int, defaultValue T) *Buffer[T] { } } -func (b *Buffer[T]) x(x int) int { +func (b *Buffer[T]) limX(x int) int { return limit(x, 0, b.width-1) } -func (b *Buffer[T]) y(y int) int { +func (b *Buffer[T]) limY(y int) int { return limit(y, 0, b.height-1) } // Set sets the value at position (x,y) to c func (b *Buffer[T]) Set(x, y int, v T) { if b.width > 0 && b.height > 0 { - b.data[b.y(y)][b.x(x)] = v + b.data[b.limY(y)][b.limX(x)] = v } } @@ -67,14 +69,26 @@ func (b *Buffer[T]) Height() int { return b.height } -// ForEach calls f for every value in this buffer +// OffsetX returns the horizontal offset of b relative to its parent buffer. +// OffsetX returns 0 if b has no parent +func (b *Buffer[T]) OffsetX() int { + return b.x +} + +// OffsetY returns the vertical offset of b relative to its parent buffer. +// OffsetY returns 0 if b has no parent +func (b *Buffer[T]) OffsetY() int { + return b.y +} + +// ForEachLine calls f for each line in b func (b *Buffer[T]) ForEachLine(f func(line int, content []T)) { for line, content := range b.data { f(line, content) } } -// ForEach calls f for every value in this buffer +// ForEach calls f for every value in b func (b *Buffer[T]) ForEach(f func(x, y int, v T)) { for y, col := range b.data { for x, v := range col { @@ -116,6 +130,7 @@ func (b *Buffer[T]) Sub(x, y, w, h int) *Buffer[T] { // make buffer return &Buffer[T]{ + x: x, y: y, data: data, width: w, height: h, diff --git a/buffer_test.go b/buffer_test.go index a159b70..b81e9b6 100644 --- a/buffer_test.go +++ b/buffer_test.go @@ -22,3 +22,9 @@ func TestSet(t *testing.T) { b := NewBuffer(0, 0, ' ') b.Set(0, 0, 'a') } + +func TestOffset(t *testing.T) { + b := NewBuffer(10, 10, ' ') + b = b.Sub(3, 3, 3, 3) + fmt.Println(b.OffsetX(), b.OffsetY()) +}