Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,7 @@ GLOBAL OPTIONS:
--buildtag value, -b value [ --buildtag value, -b value ] Adds build tags to a generated enum file.
--output-suffix .go Changes the default filename suffix of _enum to something else. .go will be appended to the end of the string no matter what, so that `_test.go` cases can be accommodated
--no-iota Disables the use of iota in generated enums. (default: false)
--bitfield Generates the values as bit fields. (default: false)
--help, -h show help
--version, -v print the version
```
Expand Down
43 changes: 43 additions & 0 deletions example/enum_bitfield.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//go:generate ../bin/go-enum --names -b example --bitfield --values

package example

/*
ENUM(

E2P0
E2P1
E2P2
E2P3
E2P4
E2P5
E2P6
E2P7
E2P8
E2P9
E2P10
E2P11
E2P12
E2P13
E2P14
E2P15
E2P16
E2P17
E2P18
E2P19
E2P20
E2P21
E2P22
E2P23
E2P24
E2P25
E2P26
E2P27
E2P28
E2P29
E2P30
E2P31

)
*/
type Enum32bitfield uint32
259 changes: 259 additions & 0 deletions example/enum_bitfield_enum.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

49 changes: 49 additions & 0 deletions example/enum_bitfield_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
//go:build example
// +build example

package example

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestEnum32bitfield(t *testing.T) {
t.Parallel()

allFields := Enum32bitfieldValues()

// Generate all pairs (i, j) where i < j to avoid duplicates
testCases := make([]struct {
name string
field1 Enum32bitfield
field2 Enum32bitfield
}, 0, len(allFields)*(len(allFields)-1)/2)

for i := 0; i < len(allFields); i++ {
for j := i + 1; j < len(allFields); j++ {
testCases = append(testCases, struct {
name string
field1 Enum32bitfield
field2 Enum32bitfield
}{
name: allFields[i].String() + "_" + allFields[j].String(),
field1: allFields[i],
field2: allFields[j],
})
}
}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
t.Parallel()

// Collapse the two views
collapsed := tc.field1 | tc.field2

assert.Equal(t, tc.field1, collapsed^tc.field2)
assert.Equal(t, tc.field2, collapsed^tc.field1)
})
}
}
3 changes: 2 additions & 1 deletion generator/enum.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const (
{{- $enumType := .enum.Type -}}
{{- $noComments := .nocomments -}}
{{- $noIota := .noIota -}}
{{- $bitField := .bitField -}}
{{- $vars := dict "lastoffset" "0" -}}
{{ range $rIndex, $value := .enum.Values }}
{{- $lastOffset := pluck "lastoffset" $vars | first }}{{ $offset := offset $rIndex $enumType $value }}
Expand All @@ -32,7 +33,7 @@ const (
// {{$value.Comment}}
{{- end}}
{{if $noIota }}{{$value.PrefixedName}} {{$enumName}} = {{directVal $enumType $value}}{{else -}}
{{$value.PrefixedName}} {{ if eq $rIndex 0 }}{{$enumName}} = iota{{ if ne "0" $offset }} + {{ $offset }}{{end}}{{else if ne $lastOffset $offset }}{{$enumName}} = iota + {{ $offset }}{{end}}{{$_ := set $vars "lastoffset" $offset}}
{{$value.PrefixedName}} {{ if eq $rIndex 0 }}{{$enumName}} = {{if $bitField }}1<<{{end}}iota{{ if ne "0" $offset }} + {{ $offset }}{{end}}{{else if ne $lastOffset $offset }}{{$enumName}} = iota + {{ $offset }}{{end}}{{$_ := set $vars "lastoffset" $offset}}
{{- end}}
{{- end}}
)
Expand Down
Loading