shitty bitfield packing code

This commit is contained in:
adman
2026-03-02 22:24:26 +01:00
parent 085b83cb71
commit 8d1a4b581b
10 changed files with 41961 additions and 41813 deletions
+40 -2
View File
@@ -3,6 +3,8 @@ package main
import (
"go/ast"
"go/token"
"slices"
"strconv"
"github.com/admin-else/strom/proto_generator/protodef"
"github.com/go-viper/mapstructure/v2"
@@ -156,11 +158,47 @@ func BitFieldEncoder(g *Generator, varToSet ast.Expr, dataRaw any, name string)
for _, field := range data {
totalSize += field.Size
}
p, err := BitSizeToUnsignedProtodefName(totalSize)
packedVarName := name + "Packed"
packedExpr := Ident(packedVarName)
packedTypeStr := "uint" + strconv.Itoa(totalSize)
s = append(s, VarStmt(packedVarName, Ident(packedTypeStr)))
slices.Reverse(data)
shiftBy := 0
for _, field := range data {
boolFix := packedTypeStr
if field.Size == 1 {
boolFix = "proto_base.Bool2" + boolFix
}
s = append(s, OrAssign( // lisp ahh
packedExpr,
LeftShift(
Grouping(
BinAnd(
Call(
Ident(boolFix),
SelectorExprAndStr(
varToSet,
CamelCase(field.Name),
),
),
NumLitHex((1<<field.Size)-1),
),
),
NumLitHex(shiftBy),
),
))
shiftBy += field.Size
}
encodePacked, err := g.VisitEncoder(packedExpr, "u"+strconv.Itoa(totalSize), name)
if err != nil {
return
}
return g.VisitEncoder(varToSet, p, name)
s = append(s, encodePacked...)
return
}
func SwitchEncoder(g *Generator, varToSet ast.Expr, dataRaw any, name string) (s []ast.Stmt, err error) {