@@ -39,5 +39,234 @@ SCENARIO("BitmapRangeIterator")
3939 REQUIRE (!iterator.next ());
4040 }
4141 }
42+
43+ WHEN (" set bitmap to [1,0,1,0,1,0,0,0,0,0]" )
44+ {
45+ bitmap.setBits (0 , 1 );
46+ bitmap.setBits (2 , 1 );
47+ bitmap.setBits (4 , 1 );
48+
49+ THEN (" iterator returns ranges: {0,1}, {2,1}, {4,1}" )
50+ {
51+ REQUIRE (*iterator.next () == std::make_pair (0UL , 1UL ));
52+ REQUIRE (*iterator.next () == std::make_pair (2UL , 1UL ));
53+ REQUIRE (*iterator.next () == std::make_pair (4UL , 1UL ));
54+ REQUIRE (!iterator.next ());
55+ }
56+ }
57+
58+ WHEN (" set bitmap to [0,0,0,0,0,0,0,1,1,1]" )
59+ {
60+ bitmap.setBits (7 , 3 );
61+
62+ THEN (" iterator returns ranges: {7,3}" )
63+ {
64+ REQUIRE (*iterator.next () == std::make_pair (7UL , 3UL ));
65+ REQUIRE (!iterator.next ());
66+ }
67+ }
68+
69+ WHEN (" set bitmap to [1,1,1,1,1,1,1,1,1,1]" )
70+ {
71+ bitmap.setBits (0 , 10 );
72+
73+ THEN (" iterator returns ranges: {0,10}" )
74+ {
75+ REQUIRE (*iterator.next () == std::make_pair (0UL , 10UL ));
76+ REQUIRE (!iterator.next ());
77+ }
78+ }
79+
80+ WHEN (" set bitmap to [1,1,0,0,1,1,1,0,0,1]" )
81+ {
82+ bitmap.setBits (0 , 2 );
83+ bitmap.setBits (4 , 3 );
84+ bitmap.setBits (9 , 1 );
85+
86+ THEN (" iterator returns ranges: {0,2}, {4,3}, {9,1}" )
87+ {
88+ REQUIRE (*iterator.next () == std::make_pair (0UL , 2UL ));
89+ REQUIRE (*iterator.next () == std::make_pair (4UL , 3UL ));
90+ REQUIRE (*iterator.next () == std::make_pair (9UL , 1UL ));
91+ REQUIRE (!iterator.next ());
92+ }
93+ }
94+
95+ WHEN (" set bitmap to [0,0,0,0,0,0,0,0,0,1]" )
96+ {
97+ bitmap.setBits (9 , 1 );
98+
99+ THEN (" iterator returns ranges: {9,1}" )
100+ {
101+ REQUIRE (*iterator.next () == std::make_pair (9UL , 1UL ));
102+ REQUIRE (!iterator.next ());
103+ }
104+ }
105+ }
106+
107+ GIVEN (" initialized Bitmap with size 32" )
108+ {
109+ kf::Bitmap<PagedPool> bitmap;
110+ REQUIRE_NT_SUCCESS (bitmap.initialize (32 ));
111+
112+ auto iterator = bitmap.rangeIterator ();
113+
114+ WHEN (" set alternating bits [1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0]" )
115+ {
116+ for (ULONG i = 0 ; i < 32 ; i += 2 )
117+ {
118+ bitmap.setBits (i, 1 );
119+ }
120+
121+ THEN (" iterator returns 16 ranges of single bits" )
122+ {
123+ for (ULONG i = 0 ; i < 32 ; i += 2 )
124+ {
125+ REQUIRE (*iterator.next () == std::make_pair (i, 1UL ));
126+ }
127+ REQUIRE (!iterator.next ());
128+ }
129+ }
130+
131+ WHEN (" set large contiguous range [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0]" )
132+ {
133+ bitmap.setBits (4 , 24 );
134+
135+ THEN (" iterator returns ranges: {4,24}" )
136+ {
137+ REQUIRE (*iterator.next () == std::make_pair (4UL , 24UL ));
138+ REQUIRE (!iterator.next ());
139+ }
140+ }
141+
142+ WHEN (" set bits with large gaps [1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1]" )
143+ {
144+ bitmap.setBits (0 , 1 );
145+ bitmap.setBits (10 , 1 );
146+ bitmap.setBits (20 , 1 );
147+ bitmap.setBits (31 , 1 );
148+
149+ THEN (" iterator returns ranges: {0,1}, {10,1}, {20,1}, {31,1}" )
150+ {
151+ REQUIRE (*iterator.next () == std::make_pair (0UL , 1UL ));
152+ REQUIRE (*iterator.next () == std::make_pair (10UL , 1UL ));
153+ REQUIRE (*iterator.next () == std::make_pair (20UL , 1UL ));
154+ REQUIRE (*iterator.next () == std::make_pair (31UL , 1UL ));
155+ REQUIRE (!iterator.next ());
156+ }
157+ }
158+ }
159+
160+ GIVEN (" initialized Bitmap with size 10 and iterator with custom starting position" )
161+ {
162+ kf::Bitmap<PagedPool> bitmap;
163+ REQUIRE_NT_SUCCESS (bitmap.initialize (10 ));
164+
165+ WHEN (" set bitmap to [1,1,0,1,1,0,1,1,1,0] and start iterator from index 3" )
166+ {
167+ bitmap.setBits (0 , 2 );
168+ bitmap.setBits (3 , 2 );
169+ bitmap.setBits (6 , 3 );
170+
171+ auto iterator = bitmap.rangeIterator (3 );
172+
173+ THEN (" iterator returns ranges starting from index 3: {3,2}, {6,3}" )
174+ {
175+ REQUIRE (*iterator.next () == std::make_pair (3UL , 2UL ));
176+ REQUIRE (*iterator.next () == std::make_pair (6UL , 3UL ));
177+ REQUIRE (!iterator.next ());
178+ }
179+ }
180+
181+ WHEN (" set bitmap to [1,1,1,1,1,1,1,1,1,1] and start iterator from index 5" )
182+ {
183+ bitmap.setBits (0 , 10 );
184+
185+ auto iterator = bitmap.rangeIterator (5 );
186+
187+ THEN (" iterator returns ranges starting from index 5: {5,5}" )
188+ {
189+ REQUIRE (*iterator.next () == std::make_pair (5UL , 5UL ));
190+ REQUIRE (!iterator.next ());
191+ }
192+ }
193+
194+ WHEN (" start iterator from index beyond bitmap size" )
195+ {
196+ bitmap.setBits (0 , 10 );
197+
198+ auto iterator = bitmap.rangeIterator (15 );
199+
200+ THEN (" iterator returns no ranges" )
201+ {
202+ REQUIRE (!iterator.next ());
203+ }
204+ }
205+
206+ WHEN (" start iterator from last index with bit set" )
207+ {
208+ bitmap.setBits (9 , 1 );
209+
210+ auto iterator = bitmap.rangeIterator (9 );
211+
212+ THEN (" iterator returns ranges: {9,1}" )
213+ {
214+ REQUIRE (*iterator.next () == std::make_pair (9UL , 1UL ));
215+ REQUIRE (!iterator.next ());
216+ }
217+ }
218+ }
219+
220+ GIVEN (" edge cases with different bitmap patterns" )
221+ {
222+ kf::Bitmap<PagedPool> bitmap;
223+ REQUIRE_NT_SUCCESS (bitmap.initialize (16 ));
224+
225+ WHEN (" set only first and last bits [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]" )
226+ {
227+ bitmap.setBits (0 , 1 );
228+ bitmap.setBits (15 , 1 );
229+
230+ auto iterator = bitmap.rangeIterator ();
231+
232+ THEN (" iterator returns ranges: {0,1}, {15,1}" )
233+ {
234+ REQUIRE (*iterator.next () == std::make_pair (0UL , 1UL ));
235+ REQUIRE (*iterator.next () == std::make_pair (15UL , 1UL ));
236+ REQUIRE (!iterator.next ());
237+ }
238+ }
239+
240+ WHEN (" set bits creating two adjacent ranges [0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0]" )
241+ {
242+ bitmap.setBits (2 , 4 );
243+
244+ auto iterator = bitmap.rangeIterator ();
245+
246+ THEN (" iterator returns single range: {2,4}" )
247+ {
248+ REQUIRE (*iterator.next () == std::make_pair (2UL , 4UL ));
249+ REQUIRE (!iterator.next ());
250+ }
251+ }
252+
253+ WHEN (" set complex pattern [0,1,1,0,0,1,0,1,1,1,0,0,1,1,0,0]" )
254+ {
255+ bitmap.setBits (1 , 2 );
256+ bitmap.setBits (5 , 1 );
257+ bitmap.setBits (7 , 3 );
258+ bitmap.setBits (12 , 2 );
259+
260+ auto iterator = bitmap.rangeIterator ();
261+
262+ THEN (" iterator returns ranges: {1,2}, {5,1}, {7,3}, {12,2}" )
263+ {
264+ REQUIRE (*iterator.next () == std::make_pair (1UL , 2UL ));
265+ REQUIRE (*iterator.next () == std::make_pair (5UL , 1UL ));
266+ REQUIRE (*iterator.next () == std::make_pair (7UL , 3UL ));
267+ REQUIRE (*iterator.next () == std::make_pair (12UL , 2UL ));
268+ REQUIRE (!iterator.next ());
269+ }
270+ }
42271 }
43272}
0 commit comments