// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package codegen

const bitsTmpl = `
{{- define "BitsDefinition" -}}
{{range .DocComments}}
//{{ . }}
{{- end}}
type {{ .Name }} {{ .Type }}
const (
	{{- range .Members }}
	{{ $.Name }}{{ .Name }} {{ $.Name }} = {{ .Value }}
	{{- end }}
	{{ .Name }}_Mask {{ .Name }} = {{ .Mask }}
)

func (_ {{ .Name }}) I_BitsMask() {{ .Name }} {
	return {{ .Name }}_Mask
}

func (_ {{ .Name }}) I_BitsIsStrict() bool {
	return {{ .IsStrict }}
}

func (x {{ .Name }}) HasUnknownBits() bool {
	return x.GetUnknownBits() != 0
}

func (x {{ .Name }}) GetUnknownBits() uint64 {
	return uint64(^{{ .Name }}_Mask & x)
}

func (x {{ .Name }}) InvertBits() {{ .Name }} {
  return {{ .Name }}_Mask & ^x
}

// HasBits validates that all flipped bits in the mask are set.
func (x {{ .Name }}) HasBits(mask {{ .Name }}) bool {
	return mask | x == x
}

// ClearBits ensures all flipped bits in the mask are unset.
func (x {{ .Name }}) ClearBits(mask {{ .Name }}) {{ .Name }} {
  return ^mask & x
}

func (x {{.Name}}) String() string {
	switch x {
	{{- range .Members }}
	case {{ .Value }}:
		return "{{.Name}}"
	{{- end }}
	}
	return "Unknown"
}
{{- end -}}
`
