diff options
-rw-r--r-- | src/lib/io/bytebuffer.go | 10 | ||||
-rw-r--r-- | src/lib/io/bytebuffer_test.go | 17 |
2 files changed, 22 insertions, 5 deletions
diff --git a/src/lib/io/bytebuffer.go b/src/lib/io/bytebuffer.go index 011166e9c..88371c4b7 100644 --- a/src/lib/io/bytebuffer.go +++ b/src/lib/io/bytebuffer.go @@ -39,9 +39,17 @@ func (b *ByteBuffer) Len() int { return len(b.buf) - b.off } +// Truncates the buffer so it contains n bytes. +// It preserves the data in the buffer at positions [0 : n]. +// It is an error to call b.Truncate(n) with n > b.Len(). +func (b *ByteBuffer) Truncate(n int) { + b.buf = b.buf[0 : b.off + n]; +} + // Reset resets the buffer so it has no content. +// b.Reset() is the same as b.Truncate(0). func (b *ByteBuffer) Reset() { - b.off = len(b.buf) + b.buf = b.buf[0 : b.off]; } // Write appends the contents of p to the buffer. The return diff --git a/src/lib/io/bytebuffer_test.go b/src/lib/io/bytebuffer_test.go index 6a4f3c9b9..e91a6415e 100644 --- a/src/lib/io/bytebuffer_test.go +++ b/src/lib/io/bytebuffer_test.go @@ -89,6 +89,9 @@ func TestBasicOperations(t *testing.T) { buf.Reset(); check(t, "TestBasicOperations (2)", &buf, ""); + buf.Truncate(0); + check(t, "TestBasicOperations (3)", &buf, ""); + n, err := buf.Write(data[0 : 1]); if n != 1 { t.Errorf("wrote 1 byte, but n == %d\n", n); @@ -96,16 +99,22 @@ func TestBasicOperations(t *testing.T) { if err != nil { t.Errorf("err should always be nil, but err == %s\n", err); } - check(t, "TestBasicOperations (3)", &buf, "a"); + check(t, "TestBasicOperations (4)", &buf, "a"); n, err = buf.Write(data[1 : 26]); if n != 25 { t.Errorf("wrote 25 bytes, but n == %d\n", n); } - check(t, "TestBasicOperations (4)", &buf, string(data[0 : 26])); + check(t, "TestBasicOperations (5)", &buf, string(data[0 : 26])); + + buf.Truncate(26); + check(t, "TestBasicOperations (6)", &buf, string(data[0 : 26])); + + buf.Truncate(20); + check(t, "TestBasicOperations (7)", &buf, string(data[0 : 20])); - empty(t, "TestBasicOperations (5)", &buf, string(data[0 : 26]), make([]byte, 5)); - empty(t, "TestBasicOperations (6)", &buf, "", make([]byte, 100)); + empty(t, "TestBasicOperations (8)", &buf, string(data[0 : 20]), make([]byte, 5)); + empty(t, "TestBasicOperations (9)", &buf, "", make([]byte, 100)); } } |