Skip to content

Commit

Permalink
chore: clean up proto Value code (#435)
Browse files Browse the repository at this point in the history
  • Loading branch information
muktihari authored Sep 15, 2024
1 parent 8136630 commit e2c16ec
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 121 deletions.
70 changes: 32 additions & 38 deletions proto/value.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ func (v Value) String() string {
return unsafe.String((*byte)(v.ptr), v.num)
}

// SliceBool returns Value as []bool, if it's not a valid []bool value, it returns nil.
// SliceBool returns Value as []typedef.Bool, if it's not a valid []typedef.Bool value, it returns nil.
// The caller takes ownership of the returned value, so Value should no longer be used after this call,
// except the returned value is copied and the copied value is used instead.
func (v Value) SliceBool() []typedef.Bool {
Expand Down Expand Up @@ -347,7 +347,7 @@ func (v Value) SliceString() []string {
// Any returns Value's underlying value. If the underlying value is a slice, the caller takes ownership of that slice value,
// so Value should no longer be used after this call, except the returned value is copied and the copied value is used instead.
func (v Value) Any() any {
switch v.Type() {
switch v.typ {
case TypeBool:
return v.Bool()
case TypeInt8:
Expand Down Expand Up @@ -402,7 +402,7 @@ func (v Value) Any() any {

// Align checks whether Value's type is align with given basetype.
func (v Value) Align(t basetype.BaseType) bool {
switch v.Type() {
switch v.typ {
case TypeBool, TypeSliceBool:
return t == basetype.Enum
case TypeInt8, TypeSliceInt8:
Expand Down Expand Up @@ -439,7 +439,7 @@ func (v Value) Align(t basetype.BaseType) bool {
func (v Value) Valid(t basetype.BaseType) bool {
var invalidCount int

switch v.Type() {
switch v.typ {
case TypeBool:
return v.num < 2 // Only 0 (false) and 1 (true) is valid
case TypeInt8:
Expand Down Expand Up @@ -471,17 +471,17 @@ func (v Value) Valid(t basetype.BaseType) bool {
return uint32(v.num) != basetype.Uint32zInvalid
}
return uint32(v.num) != basetype.Uint32Invalid
case TypeFloat32:
return uint32(v.num) != basetype.Float32Invalid
case TypeFloat64:
return v.num != basetype.Float64Invalid
case TypeInt64:
return int64(v.num) != basetype.Sint64Invalid
case TypeUint64:
if t == basetype.Uint64z {
return v.num != basetype.Uint64zInvalid
}
return v.num != basetype.Uint64Invalid
case TypeFloat32:
return uint32(v.num) != basetype.Float32Invalid
case TypeFloat64:
return v.num != basetype.Float64Invalid
case TypeString:
s := v.String()
return s != basetype.StringInvalid && s != "\x00"
Expand Down Expand Up @@ -565,22 +565,6 @@ func (v Value) Valid(t basetype.BaseType) bool {
}
}
return invalidCount != len(vals)
case TypeSliceFloat32:
vals := v.SliceFloat32()
for i := range vals {
if math.Float32bits(vals[i]) == basetype.Float32Invalid {
invalidCount++
}
}
return invalidCount != len(vals)
case TypeSliceFloat64:
vals := v.SliceFloat64()
for i := range vals {
if math.Float64bits(vals[i]) == basetype.Float64Invalid {
invalidCount++
}
}
return invalidCount != len(vals)
case TypeSliceInt64:
vals := v.SliceInt64()
for i := range vals {
Expand All @@ -605,6 +589,22 @@ func (v Value) Valid(t basetype.BaseType) bool {
}
}
return invalidCount != len(vals)
case TypeSliceFloat32:
vals := v.SliceFloat32()
for i := range vals {
if math.Float32bits(vals[i]) == basetype.Float32Invalid {
invalidCount++
}
}
return invalidCount != len(vals)
case TypeSliceFloat64:
vals := v.SliceFloat64()
for i := range vals {
if math.Float64bits(vals[i]) == basetype.Float64Invalid {
invalidCount++
}
}
return invalidCount != len(vals)
case TypeSliceString:
vals := v.SliceString()
for i := range vals {
Expand Down Expand Up @@ -913,13 +913,11 @@ func Sizeof(val Value) int {
switch val.typ {
case TypeString:
s := val.String()
if len(s) == 0 {
return 1 * sizes[TypeString] // utf-8 null terminated string
n := len(s)
if n == 0 || s[n-1] != '\x00' {
n += 1
}
if l := len(s); l > 0 && s[l-1] == '\x00' {
return l * sizes[TypeString]
}
return (len(s) + 1) * sizes[TypeString]
return n * sizes[TypeString]
case TypeSliceBool:
return int(val.num) * sizes[TypeBool]
case TypeSliceInt8:
Expand All @@ -946,15 +944,11 @@ func Sizeof(val Value) int {
vs := val.SliceString()
var size int
for i := range vs {
if len(vs[i]) == 0 {
size += 1 // utf-8 null terminated string
continue
}
if l := len(vs[i]); l > 0 && vs[i][l-1] == '\x00' {
size += l
continue
n := len(vs[i])
if n == 0 || vs[i][n-1] != '\x00' {
n += 1 // utf-8 null terminated string
}
size += len(vs[i]) + 1
size += n
}
if size == 0 {
return 1 * sizes[TypeString] // utf-8 null terminated string
Expand Down
157 changes: 74 additions & 83 deletions proto/value_marshal.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const ErrTypeNotSupported = errorString("type is not supported")
// If arch is 0, marshal in Little-Endian, otherwise marshal in Big-Endian.
func (v Value) MarshalAppend(b []byte, arch byte) ([]byte, error) {
// NOTE: The size of the resulting bytes should align with Sizeof.
switch v.Type() {
switch v.typ {
case TypeBool:
val := v.Bool()
if val > 1 {
Expand All @@ -25,6 +25,74 @@ func (v Value) MarshalAppend(b []byte, arch byte) ([]byte, error) {
b = append(b, byte(val))
}
return b, nil
case TypeInt8:
return append(b, uint8(v.num)), nil
case TypeUint8:
return append(b, uint8(v.num)), nil
case TypeInt16:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint16(b, uint16(v.num))
} else {
b = binary.BigEndian.AppendUint16(b, uint16(v.num))
}
return b, nil
case TypeUint16:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint16(b, uint16(v.num))
} else {
b = binary.BigEndian.AppendUint16(b, uint16(v.num))
}
return b, nil
case TypeInt32:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint32(b, uint32(v.num))
} else {
b = binary.BigEndian.AppendUint32(b, uint32(v.num))
}
return b, nil
case TypeUint32:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint32(b, uint32(v.num))
} else {
b = binary.BigEndian.AppendUint32(b, uint32(v.num))
}
return b, nil
case TypeInt64:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint64(b, uint64(v.num))
} else {
b = binary.BigEndian.AppendUint64(b, uint64(v.num))
}
return b, nil
case TypeUint64:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint64(b, v.num)
} else {
b = binary.BigEndian.AppendUint64(b, v.num)
}
return b, nil
case TypeFloat32:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint32(b, uint32(v.num))
} else {
b = binary.BigEndian.AppendUint32(b, uint32(v.num))
}
return b, nil
case TypeFloat64:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint64(b, v.num)
} else {
b = binary.BigEndian.AppendUint64(b, v.num)
}
return b, nil
case TypeString:
val := v.String()
n := len(val)
b = append(b, val...)
if n == 0 || val[n-1] != 0 {
b = append(b, 0) // add utf-8 null-terminated string
}
return b, nil
case TypeSliceBool:
vals := v.SliceBool()
for i := range vals {
Expand All @@ -35,28 +103,14 @@ func (v Value) MarshalAppend(b []byte, arch byte) ([]byte, error) {
}
}
return b, nil
case TypeInt8:
b = append(b, uint8(v.num))
return b, nil
case TypeSliceInt8:
vals := v.SliceInt8()
for i := range vals {
b = append(b, uint8(vals[i]))
}
return b, nil
case TypeUint8:
b = append(b, uint8(v.num))
return b, nil
case TypeSliceUint8:
b = append(b, v.SliceUint8()...)
return b, nil
case TypeInt16:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint16(b, uint16(v.num))
} else {
b = binary.BigEndian.AppendUint16(b, uint16(v.num))
}
return b, nil
return append(b, v.SliceUint8()...), nil
case TypeSliceInt16:
vals := v.SliceInt16()
if arch == LittleEndian {
Expand All @@ -69,13 +123,6 @@ func (v Value) MarshalAppend(b []byte, arch byte) ([]byte, error) {
}
}
return b, nil
case TypeUint16:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint16(b, uint16(v.num))
} else {
b = binary.BigEndian.AppendUint16(b, uint16(v.num))
}
return b, nil
case TypeSliceUint16:
vals := v.SliceUint16()
if arch == LittleEndian {
Expand All @@ -88,13 +135,6 @@ func (v Value) MarshalAppend(b []byte, arch byte) ([]byte, error) {
}
}
return b, nil
case TypeInt32:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint32(b, uint32(v.num))
} else {
b = binary.BigEndian.AppendUint32(b, uint32(v.num))
}
return b, nil
case TypeSliceInt32:
vals := v.SliceInt32()
if arch == LittleEndian {
Expand All @@ -107,13 +147,6 @@ func (v Value) MarshalAppend(b []byte, arch byte) ([]byte, error) {
}
}
return b, nil
case TypeUint32:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint32(b, uint32(v.num))
} else {
b = binary.BigEndian.AppendUint32(b, uint32(v.num))
}
return b, nil
case TypeSliceUint32:
vals := v.SliceUint32()
if arch == LittleEndian {
Expand All @@ -126,13 +159,6 @@ func (v Value) MarshalAppend(b []byte, arch byte) ([]byte, error) {
}
}
return b, nil
case TypeInt64:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint64(b, uint64(v.num))
} else {
b = binary.BigEndian.AppendUint64(b, uint64(v.num))
}
return b, nil
case TypeSliceInt64:
vals := v.SliceInt64()
if arch == LittleEndian {
Expand All @@ -145,13 +171,6 @@ func (v Value) MarshalAppend(b []byte, arch byte) ([]byte, error) {
}
}
return b, nil
case TypeUint64:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint64(b, v.num)
} else {
b = binary.BigEndian.AppendUint64(b, v.num)
}
return b, nil
case TypeSliceUint64:
vals := v.SliceUint64()
if arch == LittleEndian {
Expand All @@ -164,13 +183,6 @@ func (v Value) MarshalAppend(b []byte, arch byte) ([]byte, error) {
}
}
return b, nil
case TypeFloat32:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint32(b, uint32(v.num))
} else {
b = binary.BigEndian.AppendUint32(b, uint32(v.num))
}
return b, nil
case TypeSliceFloat32:
vals := v.SliceFloat32()
if arch == LittleEndian {
Expand All @@ -183,13 +195,6 @@ func (v Value) MarshalAppend(b []byte, arch byte) ([]byte, error) {
}
}
return b, nil
case TypeFloat64:
if arch == LittleEndian {
b = binary.LittleEndian.AppendUint64(b, v.num)
} else {
b = binary.BigEndian.AppendUint64(b, v.num)
}
return b, nil
case TypeSliceFloat64:
vals := v.SliceFloat64()
if arch == LittleEndian {
Expand All @@ -202,31 +207,17 @@ func (v Value) MarshalAppend(b []byte, arch byte) ([]byte, error) {
}
}
return b, nil
case TypeString:
val := v.String()
if len(val) == 0 {
b = append(b, 0x00)
return b, nil
}
b = append(b, val...)
if val[len(val)-1] != '\x00' {
b = append(b, '\x00') // add utf-8 null-terminated string
}
return b, nil
case TypeSliceString:
vals := v.SliceString()
for i := range vals {
if len(vals[i]) == 0 {
b = append(b, '\x00')
continue
}
n := len(vals[i])
b = append(b, vals[i]...)
if vals[i][len(vals[i])-1] != '\x00' {
b = append(b, '\x00')
if n == 0 || vals[i][n-1] != 0 {
b = append(b, 0) // add utf-8 null-terminated string
}
}
if len(vals) == 0 {
b = append(b, '\x00')
b = append(b, 0) // add utf-8 null-terminated string
}
return b, nil
default:
Expand Down

0 comments on commit e2c16ec

Please sign in to comment.