Skip to content

Commit c474238

Browse files
authored
add CopyTo for bitmap & bloom-filter (#26)
1 parent 936a3bf commit c474238

File tree

4 files changed

+66
-8
lines changed

4 files changed

+66
-8
lines changed

structs/bitmap/bitmap.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,23 @@ func New(maxIndex uint64, opts ...Option) *Bitmap {
4545
return bm
4646
}
4747

48+
func (b *Bitmap) CopyTo(dst *Bitmap) {
49+
if !b.lockoff {
50+
b.mux.Lock()
51+
defer b.mux.Unlock()
52+
}
53+
if !dst.lockoff {
54+
dst.mux.Lock()
55+
defer dst.mux.Unlock()
56+
}
57+
58+
dst.data = make([]byte, len(b.data))
59+
copy(dst.data, b.data)
60+
dst.size = b.size
61+
dst.max = b.max
62+
dst.lockoff = b.lockoff
63+
}
64+
4865
func (b *Bitmap) Set(index uint64) {
4966
if index > b.max {
5067
return

structs/bitmap/bitmap_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,21 @@ import (
1212
"go.osspkg.com/casecheck"
1313
)
1414

15+
func TestUnit_Bitmap_CopyTO(t *testing.T) {
16+
src := New(65)
17+
src.Set(1)
18+
src.Set(5)
19+
src.Set(60)
20+
21+
dst := New(100)
22+
src.CopyTo(dst)
23+
24+
casecheck.Equal(t, src.size, dst.size)
25+
casecheck.Equal(t, src.data, dst.data)
26+
casecheck.Equal(t, src.lockoff, dst.lockoff)
27+
casecheck.Equal(t, src.max, dst.max)
28+
}
29+
1530
func TestUnit_Bitmap_calcBlockIndex(t *testing.T) {
1631
bm := New(65)
1732

structs/bloom/bloom.go

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,27 @@ func New(opts ...Option) (*Bloom, error) {
9999
return b, nil
100100
}
101101

102+
func (b *Bloom) CopyTo(dst *Bloom) {
103+
b.mux.Lock()
104+
defer b.mux.Unlock()
105+
106+
dst.mux.Lock()
107+
defer dst.mux.Unlock()
108+
109+
b.bits.CopyTo(dst.bits)
110+
dst.size = b.size
111+
112+
dst.salts = make([][saltSize]byte, len(b.salts))
113+
copy(dst.salts, b.salts)
114+
115+
dst.optSize = b.optSize
116+
dst.optRate = b.optRate
117+
}
118+
102119
func (b *Bloom) Dump(w io.Writer) error {
120+
b.mux.RLock()
121+
defer b.mux.RUnlock()
122+
103123
if _, err := w.Write([]byte("OSSPkg:bloom\n")); err != nil {
104124
return fmt.Errorf("write header: %w", err)
105125
}
@@ -118,9 +138,6 @@ func (b *Bloom) Dump(w io.Writer) error {
118138
}
119139
}
120140

121-
b.mux.RLock()
122-
defer b.mux.RUnlock()
123-
124141
if _, err := w.Write(b.bits.Dump()); err != nil {
125142
return fmt.Errorf("write bitmap: %w", err)
126143
}
@@ -129,6 +146,9 @@ func (b *Bloom) Dump(w io.Writer) error {
129146
}
130147

131148
func (b *Bloom) Restore(r io.Reader) error {
149+
b.mux.Lock()
150+
defer b.mux.Unlock()
151+
132152
reader := bufio.NewReader(r)
133153

134154
head, err := reader.ReadBytes('\n')
@@ -174,9 +194,6 @@ func (b *Bloom) Restore(r io.Reader) error {
174194
return fmt.Errorf("read bitmap: %w", err)
175195
}
176196

177-
b.mux.Lock()
178-
defer b.mux.Unlock()
179-
180197
b.bits.Restore(bm)
181198

182199
return nil

structs/bloom/bloom_test.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"crypto/md5"
1111
"crypto/sha1"
1212
"crypto/sha256"
13+
"fmt"
1314
"hash"
1415
"hash/fnv"
1516
"reflect"
@@ -20,7 +21,7 @@ import (
2021
)
2122

2223
func TestUnit_Bloom(t *testing.T) {
23-
bf, err := New(Quantity(1000, 0.00001))
24+
bf, err := New(Quantity(4, 0.01))
2425
casecheck.NoError(t, err)
2526

2627
bf.Add("hello")
@@ -34,8 +35,16 @@ func TestUnit_Bloom(t *testing.T) {
3435

3536
buf := bytes.NewBuffer(nil)
3637
casecheck.NoError(t, bf.Dump(buf))
37-
//fmt.Println(string(buf.Bytes()))
38+
b1 := buf.Bytes()
39+
40+
fmt.Println(string(b1))
41+
3842
casecheck.NoError(t, bf.Restore(buf))
43+
buf = bytes.NewBuffer(nil)
44+
casecheck.NoError(t, bf.Dump(buf))
45+
b2 := buf.Bytes()
46+
47+
casecheck.Equal(t, b1, b2)
3948

4049
casecheck.False(t, bf.Contain("users"))
4150
casecheck.True(t, bf.Contain("user"))

0 commit comments

Comments
 (0)