Skip to content

Commit 5294909

Browse files
Support 1.23 iterator in a backward-compatible way
1 parent fb67118 commit 5294909

3 files changed

Lines changed: 267 additions & 0 deletions

File tree

iter.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package roaring
2+
3+
func Values(b *Bitmap) func(func(uint32) bool) {
4+
it := b.Iterator()
5+
return func(yield func(uint32) bool) {
6+
for it.HasNext() {
7+
if !yield(it.Next()) {
8+
return
9+
}
10+
}
11+
}
12+
}
13+
14+
func Backward(b *Bitmap) func(func(uint32) bool) {
15+
it := b.ReverseIterator()
16+
return func(yield func(uint32) bool) {
17+
for it.HasNext() {
18+
if !yield(it.Next()) {
19+
return
20+
}
21+
}
22+
}
23+
}

iter123_test.go

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
//go:build go1.23
2+
// +build go1.23
3+
4+
package roaring
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func TestBackwardCount123(t *testing.T) {
13+
array := []int{2, 63, 64, 65, 4095, 4096, 4097, 4159, 4160, 4161, 5000, 20000, 66666}
14+
for _, testSize := range array {
15+
b := New()
16+
for i := uint32(0); i < uint32(testSize); i++ {
17+
b.Add(i)
18+
}
19+
20+
count := 0
21+
for range Values(b) {
22+
count++
23+
}
24+
25+
assert.Equal(t, testSize, count)
26+
}
27+
}
28+
29+
func TestBackward123(t *testing.T) {
30+
t.Run("#1", func(t *testing.T) {
31+
values := []uint32{0, 2, 15, 16, 31, 32, 33, 9999, MaxUint16, MaxUint32}
32+
b := New()
33+
for n := 0; n < len(values); n++ {
34+
b.Add(values[n])
35+
}
36+
n := len(values) - 1
37+
for val := range Backward(b) {
38+
assert.EqualValues(t, val, values[n])
39+
n--
40+
}
41+
})
42+
43+
t.Run("#2", func(t *testing.T) {
44+
b := New()
45+
46+
count := 0
47+
for range Backward(b) {
48+
count++
49+
}
50+
51+
assert.Equal(t, 0, count)
52+
})
53+
54+
t.Run("#3", func(t *testing.T) {
55+
b := New()
56+
b.AddInt(0)
57+
58+
// only one value zero
59+
for val := range Backward(b) {
60+
assert.EqualValues(t, 0, val)
61+
}
62+
})
63+
64+
t.Run("#4", func(t *testing.T) {
65+
b := New()
66+
b.AddInt(9999)
67+
68+
// only one value 9999
69+
for val := range Backward(b) {
70+
assert.EqualValues(t, 9999, val)
71+
}
72+
})
73+
74+
t.Run("#5", func(t *testing.T) {
75+
b := New()
76+
b.AddInt(MaxUint16)
77+
78+
// only one value MaxUint16
79+
for val := range Backward(b) {
80+
assert.EqualValues(t, MaxUint16, val)
81+
}
82+
})
83+
84+
t.Run("#6", func(t *testing.T) {
85+
b := New()
86+
b.AddInt(MaxUint32)
87+
88+
// only one value MaxUint32
89+
for val := range Backward(b) {
90+
assert.EqualValues(t, MaxUint32, val)
91+
}
92+
})
93+
}
94+
95+
func TestValues123(t *testing.T) {
96+
b := New()
97+
98+
testSize := 5000
99+
for i := 0; i < testSize; i++ {
100+
b.AddInt(i)
101+
}
102+
103+
n := 0
104+
for val := range Values(b) {
105+
assert.Equal(t, uint32(n), val)
106+
n++
107+
108+
}
109+
110+
assert.Equal(t, testSize, n)
111+
}

iter_test.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package roaring
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestBackwardCount(t *testing.T) {
10+
array := []int{2, 63, 64, 65, 4095, 4096, 4097, 4159, 4160, 4161, 5000, 20000, 66666}
11+
for _, testSize := range array {
12+
b := New()
13+
for i := uint32(0); i < uint32(testSize); i++ {
14+
b.Add(i)
15+
}
16+
it := Values(b)
17+
18+
count := 0
19+
it(func(_ uint32) bool {
20+
count++
21+
return true
22+
})
23+
24+
assert.Equal(t, testSize, count)
25+
}
26+
}
27+
28+
func TestBackward(t *testing.T) {
29+
t.Run("#1", func(t *testing.T) {
30+
values := []uint32{0, 2, 15, 16, 31, 32, 33, 9999, MaxUint16, MaxUint32}
31+
b := New()
32+
for n := 0; n < len(values); n++ {
33+
b.Add(values[n])
34+
}
35+
it := Backward(b)
36+
n := len(values) - 1
37+
38+
it(func(val uint32) bool {
39+
assert.EqualValues(t, val, values[n])
40+
n--
41+
return true
42+
})
43+
44+
it = Backward(b)
45+
n = len(values) - 1
46+
it(func(val uint32) bool {
47+
assert.EqualValues(t, val, values[n])
48+
assert.True(t, n >= 0)
49+
n--
50+
return true
51+
})
52+
})
53+
54+
t.Run("#2", func(t *testing.T) {
55+
b := New()
56+
it := Backward(b)
57+
58+
count := 0
59+
it(func(_ uint32) bool {
60+
count++
61+
return true
62+
})
63+
64+
assert.Equal(t, 0, count)
65+
})
66+
67+
t.Run("#3", func(t *testing.T) {
68+
b := New()
69+
b.AddInt(0)
70+
it := Backward(b)
71+
72+
// only one value zero
73+
it(func(val uint32) bool {
74+
assert.EqualValues(t, 0, val)
75+
return true
76+
})
77+
})
78+
79+
t.Run("#4", func(t *testing.T) {
80+
b := New()
81+
b.AddInt(9999)
82+
it := Backward(b)
83+
84+
// only one value 9999
85+
it(func(val uint32) bool {
86+
assert.EqualValues(t, 9999, val)
87+
return true
88+
})
89+
})
90+
91+
t.Run("#5", func(t *testing.T) {
92+
b := New()
93+
b.AddInt(MaxUint16)
94+
it := Values(b)
95+
96+
// only one value MaxUint16
97+
it(func(val uint32) bool {
98+
assert.EqualValues(t, MaxUint16, val)
99+
return true
100+
})
101+
})
102+
103+
t.Run("#6", func(t *testing.T) {
104+
b := New()
105+
b.AddInt(MaxUint32)
106+
it := Values(b)
107+
108+
// only one value MaxUint16
109+
it(func(val uint32) bool {
110+
assert.EqualValues(t, MaxUint32, val)
111+
return true
112+
})
113+
})
114+
}
115+
116+
func TestValues(t *testing.T) {
117+
b := New()
118+
119+
testSize := 5000
120+
for i := 0; i < testSize; i++ {
121+
b.AddInt(i)
122+
}
123+
124+
it := Values(b)
125+
n := 0
126+
it(func(val uint32) bool {
127+
assert.Equal(t, uint32(n), val)
128+
n++
129+
return true
130+
})
131+
132+
assert.Equal(t, testSize, n)
133+
}

0 commit comments

Comments
 (0)