From 1c5abd40837375191c63365e6dde3a8edc77752b Mon Sep 17 00:00:00 2001 From: brent s Date: Tue, 1 Feb 2022 15:36:56 -0500 Subject: [PATCH] modifying bitmask to allow specifying an explicit value, and changing to uint instead of uint8 --- bitmask/{bitmasks.go => bitmask.go} | 27 ++++++++++++++++++++++++++- bitmask/doc.go | 16 ++++++++++++---- 2 files changed, 38 insertions(+), 5 deletions(-) rename bitmask/{bitmasks.go => bitmask.go} (72%) diff --git a/bitmask/bitmasks.go b/bitmask/bitmask.go similarity index 72% rename from bitmask/bitmasks.go rename to bitmask/bitmask.go index 2d3d868..549bfae 100644 --- a/bitmask/bitmasks.go +++ b/bitmask/bitmask.go @@ -1,11 +1,12 @@ package bitmask // MaskBit is a flag container. -type MaskBit uint8 +type MaskBit uint /* NewMaskBit is a convenience function. 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!) as shown in the example. */ @@ -16,6 +17,16 @@ func NewMaskBit() (m *MaskBit) { 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. 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. func (m *MaskBit) AddFlag(flag MaskBit) { + *m |= flag + return } // ClearFlag removes MaskBit flag from m. func (m *MaskBit) ClearFlag(flag MaskBit) { + *m &= flag + return } // ToggleFlag switches MaskBit flag in m to its inverse; if true, it is now false and vice versa. func (m *MaskBit) ToggleFlag(flag MaskBit) { + *m ^= flag + + return +} + +// Value returns the current raw uint value of a MaskBit. +func (m *MaskBit) Value() (v uint) { + + v = uint(*m) + return } diff --git a/bitmask/doc.go b/bitmask/doc.go index bba44e0..d550aa0 100644 --- a/bitmask/doc.go +++ b/bitmask/doc.go @@ -11,18 +11,18 @@ To use this, set constants like thus: "r00t2.io/goutils/bitmask" ) - const OPTNONE types.MaskBit = 0 + const OPTNONE bitmask.MaskBit = 0 const ( - OPT1 types.MaskBit = 1 << iota + OPT1 bitmask.MaskBit = 1 << iota OPT2 OPT3 // ... ) - var MyMask *MaskBit + var MyMask *bitmask.MaskBit func main() { - MyMask = types.NewMaskBit + MyMask = bitmask.NewMaskBit() MyMask.AddFlag(OPT1) MyMask.AddFlag(OPT3) @@ -41,5 +41,13 @@ As would this: But this would return false: 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