modifying bitmask to allow specifying an explicit value, and changing to uint instead of uint8

This commit is contained in:
brent s. 2022-02-01 15:36:56 -05:00
parent d98363c0d7
commit 1c5abd4083
Signed by: bts
GPG Key ID: 8C004C2F93481F6B
2 changed files with 38 additions and 5 deletions

View File

@ -1,11 +1,12 @@
package bitmask package bitmask


// MaskBit is a flag container. // MaskBit is a flag container.
type MaskBit uint8 type MaskBit uint


/* /*
NewMaskBit is a convenience function. NewMaskBit is a convenience function.
It will return a MaskBit with a (referenced) value of 0, so set your consts up accordingly. It will return a MaskBit with a (referenced) value of 0, so set your consts up accordingly.

It is highly recommended to set this default as a "None" flag (separate from your iotas!) It is highly recommended to set this default as a "None" flag (separate from your iotas!)
as shown in the example. as shown in the example.
*/ */
@ -16,6 +17,16 @@ func NewMaskBit() (m *MaskBit) {
return return
} }


// NewMaskBitExplicit is like NewMaskBit, but allows you to specify a non-zero (0x0) value.
func NewMaskBitExplicit(value uint) (m *MaskBit) {

var v MaskBit = MaskBit(value)

m = &v

return
}

// HasFlag is true if m has MaskBit flag set/enabled. // HasFlag is true if m has MaskBit flag set/enabled.
func (m *MaskBit) HasFlag(flag MaskBit) (r bool) { func (m *MaskBit) HasFlag(flag MaskBit) (r bool) {


@ -29,18 +40,32 @@ func (m *MaskBit) HasFlag(flag MaskBit) (r bool) {


// AddFlag adds MaskBit flag to m. // AddFlag adds MaskBit flag to m.
func (m *MaskBit) AddFlag(flag MaskBit) { func (m *MaskBit) AddFlag(flag MaskBit) {

*m |= flag *m |= flag

return return
} }


// ClearFlag removes MaskBit flag from m. // ClearFlag removes MaskBit flag from m.
func (m *MaskBit) ClearFlag(flag MaskBit) { func (m *MaskBit) ClearFlag(flag MaskBit) {

*m &= flag *m &= flag

return return
} }


// ToggleFlag switches MaskBit flag in m to its inverse; if true, it is now false and vice versa. // ToggleFlag switches MaskBit flag in m to its inverse; if true, it is now false and vice versa.
func (m *MaskBit) ToggleFlag(flag MaskBit) { func (m *MaskBit) ToggleFlag(flag MaskBit) {

*m ^= flag *m ^= flag

return
}

// Value returns the current raw uint value of a MaskBit.
func (m *MaskBit) Value() (v uint) {

v = uint(*m)

return return
} }

View File

@ -11,18 +11,18 @@ To use this, set constants like thus:
"r00t2.io/goutils/bitmask" "r00t2.io/goutils/bitmask"
) )


const OPTNONE types.MaskBit = 0 const OPTNONE bitmask.MaskBit = 0
const ( const (
OPT1 types.MaskBit = 1 << iota OPT1 bitmask.MaskBit = 1 << iota
OPT2 OPT2
OPT3 OPT3
// ... // ...
) )


var MyMask *MaskBit var MyMask *bitmask.MaskBit


func main() { func main() {
MyMask = types.NewMaskBit MyMask = bitmask.NewMaskBit()


MyMask.AddFlag(OPT1) MyMask.AddFlag(OPT1)
MyMask.AddFlag(OPT3) MyMask.AddFlag(OPT3)
@ -41,5 +41,13 @@ As would this:
But this would return false: But this would return false:


MyMask.HasFlag(OPT2) MyMask.HasFlag(OPT2)

If you need something with more flexibility (as always, at the cost of complexity),
you may be interested in one of the following libraries:

. github.com/alvaroloes/enumer
. github.com/abice/go-enum
. github.com/jeffreyrichter/enum/enum

*/ */
package bitmask package bitmask