From 35a92f92bd0ce15c658dd6794238ca90b71e4422 Mon Sep 17 00:00:00 2001 From: Joe Tsai Date: Wed, 13 Apr 2022 13:21:30 -0700 Subject: encoding/binary: add AppendVarint AppendUvarint This adds a straight-forward implementation of the functionality. A more performant version could be added that unrolls the loop as is done in google.golang.org/protobuf/encoding/protowire, but usages that demand high performance can use that package instead. Fixes #51644 Change-Id: I9d3b615a60cdff47e5200e7e5d2276adf4c93783 Reviewed-on: https://go-review.googlesource.com/c/go/+/400176 Reviewed-by: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov Run-TryBot: Joseph Tsai TryBot-Result: Gopher Robot --- src/encoding/binary/varint.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/encoding/binary/varint.go') diff --git a/src/encoding/binary/varint.go b/src/encoding/binary/varint.go index 1b07e2541d..c807d15f44 100644 --- a/src/encoding/binary/varint.go +++ b/src/encoding/binary/varint.go @@ -36,6 +36,16 @@ const ( MaxVarintLen64 = 10 ) +// AppendUvarint appends the varint-encoded form of x, +// as generated by PutUvarint, to buf and returns the extended buffer. +func AppendUvarint(buf []byte, x uint64) []byte { + for x >= 0x80 { + buf = append(buf, byte(x)|0x80) + x >>= 7 + } + return append(buf, byte(x)) +} + // PutUvarint encodes a uint64 into buf and returns the number of bytes written. // If the buffer is too small, PutUvarint will panic. func PutUvarint(buf []byte, x uint64) int { @@ -77,6 +87,16 @@ func Uvarint(buf []byte) (uint64, int) { return 0, 0 } +// AppendVarint appends the varint-encoded form of x, +// as generated by PutVarint, to buf and returns the extended buffer. +func AppendVarint(buf []byte, x int64) []byte { + ux := uint64(x) << 1 + if x < 0 { + ux = ^ux + } + return AppendUvarint(buf, ux) +} + // PutVarint encodes an int64 into buf and returns the number of bytes written. // If the buffer is too small, PutVarint will panic. func PutVarint(buf []byte, x int64) int { -- cgit v1.3