Skip to content

Commit 498d159

Browse files
committed
Add String(), FromString() methods
1 parent 05f80fa commit 498d159

3 files changed

Lines changed: 78 additions & 3 deletions

File tree

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,12 @@ func main() {
3232
fmt.PrintLn(n)
3333
return true
3434
})
35+
36+
// to string, from string
37+
var b3 bitmap.Bitmap
38+
b3.Set(1)
39+
b3.Set(100)
40+
b3.String() // "2|68719476736"
41+
b4, err := bitmap.FromString("2|68719476736")
3542
}
3643
```

bitmap.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package bitmap
22

3-
import "math/bits"
3+
import (
4+
"math/bits"
5+
"strconv"
6+
"strings"
7+
)
48

59
type Bitmap []uint64
610

@@ -97,6 +101,36 @@ func (b *Bitmap) Range(f func(n uint32) bool) {
97101
}
98102
}
99103

104+
func (b *Bitmap) String() string {
105+
var sb strings.Builder
106+
107+
for i := range *b {
108+
sb.WriteString(strconv.FormatUint((*b)[i], 10))
109+
if i != len(*b)-1 {
110+
sb.WriteString("|")
111+
}
112+
}
113+
114+
return sb.String()
115+
}
116+
117+
func FromString(str string) (Bitmap, error) {
118+
if str == "" {
119+
return Bitmap{}, nil
120+
}
121+
122+
nums := strings.Split(str, "|")
123+
result := make(Bitmap, 0, len(nums))
124+
for _, num := range nums {
125+
v, err := strconv.ParseUint(num, 10, 64)
126+
if err != nil {
127+
return nil, err
128+
}
129+
result = append(result, v)
130+
}
131+
return result, nil
132+
}
133+
100134
func (b *Bitmap) grow(length uint32) {
101135
if length+1 > uint32(len(*b)) {
102136
*b = append(*b, make(Bitmap, length+1-uint32(len(*b)))...)

bitmap_test.go

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"testing"
55

66
"github.com/stretchr/testify/assert"
7-
"github.com/stretchr/testify/require"
87
)
98

109
func Benchmark_Bitmap_Set(b *testing.B) {
@@ -168,5 +167,40 @@ func Test_Bitmap_Range(t *testing.T) {
168167
return true
169168
})
170169

171-
require.Equal(t, []uint32{0, 1, 2, 1000}, items)
170+
assert.Equal(t, []uint32{0, 1, 2, 1000}, items)
171+
}
172+
173+
func Benchmark_Bitmap_String(b *testing.B) {
174+
bm := Bitmap{0, 5, 1000}
175+
for i := 0; i < b.N; i++ {
176+
_ = bm.String()
177+
}
178+
}
179+
180+
func Test_Bitmap_String(t *testing.T) {
181+
b := Bitmap{}
182+
assert.Equal(t, "", b.String())
183+
184+
b = Bitmap{0, 5, 100}
185+
assert.Equal(t, "0|5|100", b.String())
186+
}
187+
188+
func Test_FromString(t *testing.T) {
189+
t.Run("must return error if unable to parse the string", func(t *testing.T) {
190+
_, err := FromString("qwe")
191+
assert.Error(t, err)
192+
})
193+
t.Run("must parse the string correctly", func(t *testing.T) {
194+
v, err := FromString("")
195+
assert.Nil(t, err)
196+
assert.Equal(t, Bitmap{}, v)
197+
198+
v, err = FromString("0")
199+
assert.Nil(t, err)
200+
assert.Equal(t, Bitmap{0}, v)
201+
202+
v, err = FromString("0|5")
203+
assert.Nil(t, err)
204+
assert.Equal(t, Bitmap{0, 5}, v)
205+
})
172206
}

0 commit comments

Comments
 (0)