Files

52 lines
1011 B
Go
Raw Permalink Normal View History

2026-03-19 14:52:12 +03:00
package generator
2026-03-23 09:47:14 +03:00
import "github.com/edmand46/arpack/parser"
2026-03-19 14:52:12 +03:00
type segment struct {
2026-03-23 09:47:14 +03:00
bools []parser.Field
single *parser.Field
2026-03-19 14:52:12 +03:00
}
func isBoolField(f parser.Field) bool {
return f.Kind == parser.KindPrimitive && f.Primitive == parser.KindBool
}
func segmentFields(fields []parser.Field) []segment {
var segs []segment
i := 0
for i < len(fields) {
if !isBoolField(fields[i]) {
f := fields[i]
segs = append(segs, segment{single: &f})
i++
continue
}
for i < len(fields) && isBoolField(fields[i]) {
var group []parser.Field
for i < len(fields) && isBoolField(fields[i]) && len(group) < 8 {
group = append(group, fields[i])
i++
}
segs = append(segs, segment{bools: group})
}
}
return segs
}
func packedMinWireSize(fields []parser.Field) int {
total := 0
for _, seg := range segmentFields(fields) {
if seg.single != nil {
s := seg.single.WireSize()
if s == -1 {
total += 2
} else {
total += s
}
} else {
total += 1
}
}
return total
}