From 8d5ba2fa395d4caa5d46591055938245ce6fedfd Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 May 2025 10:38:50 -0400 Subject: [PATCH] tape: EncodeGBEU returns the amount of bytes written --- tape/types.go | 8 +++++--- tape/types_test.go | 14 +++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/tape/types.go b/tape/types.go index 82a0a15..3d56c88 100644 --- a/tape/types.go +++ b/tape/types.go @@ -3,6 +3,8 @@ package tape import "fmt" +// encoding and decoding functions must not make any allocations + const dataMaxSize = 0xFFFF const uint16Max = 0xFFFF @@ -119,12 +121,12 @@ func DecodeGBEU[T UInt](data []byte) (T, error) { } // EncodeGBEU encodes an 8 to 64 bit growing integer into a given buffer. -func EncodeGBEU[T UInt] (buffer []byte, value T) (error) { +func EncodeGBEU[T UInt] (buffer []byte, value T) (n int, err error) { window := (GBEUSize(value) - 1) * 7 index := 0 for window >= 0 { - if index >= len(buffer) { return fmt.Errorf("encoding GBEU: %w", ErrWrongBufferLength) } + if index >= len(buffer) { return index, fmt.Errorf("encoding GBEU: %w", ErrWrongBufferLength) } chunk := uint8(value >> window) & 0x7F if window > 0 { @@ -135,7 +137,7 @@ func EncodeGBEU[T UInt] (buffer []byte, value T) (error) { index += 1 window -= 7 } - return nil + return index, nil } // GBEUSize returns the size (in octets) of a GBEU integer. diff --git a/tape/types_test.go b/tape/types_test.go index 5c684d9..13a1078 100644 --- a/tape/types_test.go +++ b/tape/types_test.go @@ -107,17 +107,17 @@ func TestGBEU(test *testing.T) { 255, 255, 255, 255, 255, 255, 255, 255, } - err := EncodeGBEU[uint64](buffer[:0], 5) + _, err := EncodeGBEU[uint64](buffer[:0], 5) if err == nil { test.Fatal("no error") } if err.Error() != "encoding GBEU: wrong buffer length" { test.Fatal(err) } - err = EncodeGBEU[uint64](buffer[:2], 5555555) + _, err = EncodeGBEU[uint64](buffer[:2], 5555555) if err == nil { test.Fatal("no error") } if err.Error() != "encoding GBEU: wrong buffer length" { test.Fatal(err) } _, err = DecodeGBEU[uint64](buffer[:0]) if err == nil { test.Fatal("no error") } if err.Error() != "decoding GBEU: GBEU not terminated" { test.Fatal(err) } - err = EncodeGBEU[uint64](buffer[:], 0x97) + _, err = EncodeGBEU[uint64](buffer[:], 0x97) if err != nil { test.Fatal(err) } if correct, got := []byte { 0x81, 0x17 }, buffer[:2]; !slices.Equal(correct, got) { message := "not equal:" @@ -132,7 +132,7 @@ func TestGBEU(test *testing.T) { test.Fatalf("not equal: %x", got) } - err = EncodeGBEU[uint64](buffer[:], 0x123456) + _, err = EncodeGBEU[uint64](buffer[:], 0x123456) if err != nil { test.Fatal(err) } if correct, got := []byte { 0xc8, 0xe8, 0x56 }, buffer[:3]; !slices.Equal(correct, got) { message := "not equal:" @@ -148,7 +148,7 @@ func TestGBEU(test *testing.T) { } maxGBEU64 := []byte { 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F } - err = EncodeGBEU[uint64](buffer[:], 0xFFFFFFFFFFFFFFFF) + _, err = EncodeGBEU[uint64](buffer[:], 0xFFFFFFFFFFFFFFFF) if err != nil { test.Fatal(err) } if correct, got := maxGBEU64, buffer[:10]; !slices.Equal(correct, got) { message := "not equal:" @@ -163,7 +163,7 @@ func TestGBEU(test *testing.T) { test.Fatalf("not equal: %x", got) } - err = EncodeGBEU[uint64](buffer[:], 11) + _, err = EncodeGBEU[uint64](buffer[:], 11) if err != nil { test.Fatal(err) } if correct, got := byte(0xb), buffer[0]; correct != got { test.Fatal("not equal:", got) @@ -177,7 +177,7 @@ func TestGBEU(test *testing.T) { for _ = range largeNumberNTestRounds { buffer = [16]byte { } number := uint64(rand.Int()) - err := EncodeGBEU[uint64](buffer[:], number) + _, err := EncodeGBEU[uint64](buffer[:], number) if err != nil { test.Fatal(err) } decoded, err := DecodeGBEU[uint64](buffer[:]) if err != nil { test.Fatal(err) }