Add VarLong encoder/decoder and integrate into generation pipeline

This commit is contained in:
adman
2025-12-24 12:35:14 +01:00
parent dd41115ca2
commit db091d17df
7 changed files with 52 additions and 21 deletions
+36 -1
View File
@@ -144,7 +144,7 @@ func EncodeVarInt(w io.Writer, v int32) (err error) {
if uv != 0 {
b |= 0x80
}
err := binary.Write(w, binary.BigEndian, b)
err = binary.Write(w, binary.BigEndian, b)
if err != nil {
return err
}
@@ -171,6 +171,41 @@ func DecodeVarInt(r io.Reader) (ret int32, err error) {
return
}
func EncodeVarLong(w io.Writer, v int64) (err error) {
uv := uint64(v)
for {
b := uint8(uv & 0x7F)
uv >>= 7
if uv != 0 {
b |= 0x80
}
err = binary.Write(w, binary.BigEndian, b)
if err != nil {
return err
}
if uv == 0 {
break
}
}
return nil
}
func DecodeVarLong(r io.Reader) (ret int64, err error) {
for i := range 10 { // ceil(64/7)
var b uint8
err = binary.Read(r, binary.BigEndian, &b)
if err != nil {
return
}
ret |= int64(uint64(b&0x7F) << (7 * uint64(i)))
if b&0x80 == 0 {
return
}
}
err = errors.New("VarInt too long")
return
}
func ErroringIndex[K comparable, V any, M map[K]V](m M, i K) (v V, err error) {
var ok bool
v, ok = m[i]