--- /dev/null
+package common
+
+import (
+ "errors"
+)
+
+const bitLen = 32
+
+var (
+ errIndexOutOfBounds = errors.New("index out of bounds error")
+)
+
+type BitMap struct {
+ size uint32
+ arr []int32
+}
+
+func NewBitMap(size uint32) *BitMap {
+ obj := &BitMap{size: size}
+ num := (size + bitLen - 1) / bitLen
+ arr := make([]int32, num)
+ obj.arr = arr
+ return obj
+}
+
+func (b *BitMap) Set(index uint32) error {
+ if index >= b.size {
+ return errIndexOutOfBounds
+ }
+
+ arrIndex, bitIndex := index / bitLen, index % bitLen
+ b.arr[arrIndex] |= (1 << bitIndex)
+ return nil
+}
+
+func (b *BitMap) Clean(index uint32) error {
+ if index >= b.size {
+ return errIndexOutOfBounds
+ }
+
+ arrIndex, bitIndex := index / bitLen, index % bitLen
+ b.arr[arrIndex] &= (^(1 << bitIndex))
+ return nil
+}
+
+func (b *BitMap) Test(index uint32) (bool, error) {
+ if index >= b.size {
+ return false, errIndexOutOfBounds
+ }
+
+ arrIndex, bitIndex := index / bitLen, index % bitLen
+ return b.arr[arrIndex] & (1 << bitIndex) != 0, nil
+}