adding Bytes() to MaskBit

This commit is contained in:
brent s. 2022-02-01 18:26:26 -05:00
parent 1c5abd4083
commit c4b3c6441a
Signed by: bts
GPG Key ID: 8C004C2F93481F6B
1 changed files with 47 additions and 0 deletions

View File

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

import (
"bytes"
"errors"
"encoding/binary"
"math/bits"
)

// MaskBit is a flag container.
type MaskBit uint

@ -62,6 +69,46 @@ func (m *MaskBit) ToggleFlag(flag MaskBit) {
return
}

/*
Bytes returns the current value of a MasBit as a byte slice (big-endian).

If trim is false, b will (probably) be 4 bytes long if you're on a 32-bit size system,
and b will (probably) be 8 bytes long if you're on a 64-bit size system. You can determine
the size of the resulting slice via (math/)bits.UintSize / 8.

If trim is true, it will trim leading null bytes (if any). This will lead to an unpredictable
byte slice length in b, but is most likely preferred for byte operations.

*/
func (m *MaskBit) Bytes(trim bool) (b []byte) {

var b2 []byte
var size int = bits.UintSize / 8
var err error

b2 = make([]byte, size)

switch s := bits.UintSize; s {
case 32:
binary.BigEndian.PutUint32(b2[:], uint32(*m))
case 64:
binary.BigEndian.PutUint64(b2[:], uint64(*m))
default:
err = errors.New("unsupported Uint/system bit size")
panic(err)
}

if trim {
b = bytes.TrimLeft(b2, "\x00")
return
} else {
b = b2
return
}

return
}

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