From 785b48085d81f68328d3ece99b7014a45992d262 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Mon, 8 Sep 2025 18:24:21 -0400 Subject: [PATCH] tape: Dynamically encode floating point values --- tape/dynamic.go | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/tape/dynamic.go b/tape/dynamic.go index abe9742..9e9594a 100644 --- a/tape/dynamic.go +++ b/tape/dynamic.go @@ -36,16 +36,18 @@ func EncodeAny(encoder *Encoder, value any, tag Tag) (n int, err error) { // primitives reflectValue := reflect.ValueOf(value) switch reflectValue.Kind() { - case reflect.Int: return encoder.WriteInt32(int32(reflectValue.Int())) - case reflect.Uint: return encoder.WriteUint32(uint32(reflectValue.Uint())) - case reflect.Int8: return encoder.WriteInt8(int8(reflectValue.Int())) - case reflect.Uint8: return encoder.WriteUint8(uint8(reflectValue.Uint())) - case reflect.Int16: return encoder.WriteInt16(int16(reflectValue.Int())) - case reflect.Uint16: return encoder.WriteUint16(uint16(reflectValue.Uint())) - case reflect.Int32: return encoder.WriteInt32(int32(reflectValue.Int())) - case reflect.Uint32: return encoder.WriteUint32(uint32(reflectValue.Uint())) - case reflect.Int64: return encoder.WriteInt64(int64(reflectValue.Int())) - case reflect.Uint64: return encoder.WriteUint64(uint64(reflectValue.Uint())) + case reflect.Int: return encoder.WriteInt32(int32(reflectValue.Int())) + case reflect.Uint: return encoder.WriteUint32(uint32(reflectValue.Uint())) + case reflect.Int8: return encoder.WriteInt8(int8(reflectValue.Int())) + case reflect.Uint8: return encoder.WriteUint8(uint8(reflectValue.Uint())) + case reflect.Int16: return encoder.WriteInt16(int16(reflectValue.Int())) + case reflect.Uint16: return encoder.WriteUint16(uint16(reflectValue.Uint())) + case reflect.Int32: return encoder.WriteInt32(int32(reflectValue.Int())) + case reflect.Uint32: return encoder.WriteUint32(uint32(reflectValue.Uint())) + case reflect.Int64: return encoder.WriteInt64(int64(reflectValue.Int())) + case reflect.Uint64: return encoder.WriteUint64(uint64(reflectValue.Uint())) + case reflect.Float32: return encoder.WriteFloat32(float32(reflectValue.Float())) + case reflect.Float64: return encoder.WriteFloat64(float64(reflectValue.Float())) case reflect.String: if reflectValue.Len() > MaxStructureLength { return 0, ErrTooLong @@ -244,17 +246,19 @@ func TagAny(value any) (Tag, error) { func tagAny(reflectValue reflect.Value) (Tag, error) { // primitives switch reflectValue.Kind() { - case reflect.Int: return LSI.WithCN(3), nil - case reflect.Int8: return LSI.WithCN(0), nil - case reflect.Int16: return LSI.WithCN(1), nil - case reflect.Int32: return LSI.WithCN(3), nil - case reflect.Int64: return LSI.WithCN(7), nil - case reflect.Uint: return LI.WithCN(3), nil - case reflect.Uint8: return LI.WithCN(0), nil - case reflect.Uint16: return LI.WithCN(1), nil - case reflect.Uint32: return LI.WithCN(3), nil - case reflect.Uint64: return LI.WithCN(7), nil - case reflect.String: return bufferLenTag(reflectValue.Len()), nil + case reflect.Int: return LSI.WithCN(3), nil + case reflect.Int8: return LSI.WithCN(0), nil + case reflect.Int16: return LSI.WithCN(1), nil + case reflect.Int32: return LSI.WithCN(3), nil + case reflect.Int64: return LSI.WithCN(7), nil + case reflect.Uint: return LI.WithCN(3), nil + case reflect.Uint8: return LI.WithCN(0), nil + case reflect.Uint16: return LI.WithCN(1), nil + case reflect.Uint32: return LI.WithCN(3), nil + case reflect.Uint64: return LI.WithCN(7), nil + case reflect.Float32: return FP.WithCN(3), nil + case reflect.Float64: return FP.WithCN(7), nil + case reflect.String: return bufferLenTag(reflectValue.Len()), nil } if reflectValue.CanConvert(reflect.TypeOf(dummyBuffer)) { return bufferLenTag(reflectValue.Len()), nil