/rust/registry/src/index.crates.io-1949cf8c6b5b557f/roaring-0.11.3/src/bitmap/iter.rs
Line | Count | Source |
1 | | use alloc::vec; |
2 | | use core::iter::FusedIterator; |
3 | | use core::ops::RangeBounds; |
4 | | use core::slice; |
5 | | |
6 | | use super::container::Container; |
7 | | use super::{container, util}; |
8 | | use crate::{NonSortedIntegers, RoaringBitmap}; |
9 | | |
10 | | #[cfg(not(feature = "std"))] |
11 | | use alloc::vec::Vec; |
12 | | |
13 | | /// An iterator for `RoaringBitmap`. |
14 | | #[derive(Clone)] |
15 | | pub struct Iter<'a> { |
16 | | front: Option<container::Iter<'a>>, |
17 | | containers: slice::Iter<'a, Container>, |
18 | | back: Option<container::Iter<'a>>, |
19 | | } |
20 | | |
21 | | /// An iterator for `RoaringBitmap`. |
22 | | #[derive(Clone)] |
23 | | pub struct IntoIter { |
24 | | front: Option<container::Iter<'static>>, |
25 | | containers: vec::IntoIter<Container>, |
26 | | back: Option<container::Iter<'static>>, |
27 | | } |
28 | | |
29 | | #[inline] |
30 | 0 | fn and_then_or_clear<T, U>(opt: &mut Option<T>, f: impl FnOnce(&mut T) -> Option<U>) -> Option<U> { |
31 | 0 | let x = f(opt.as_mut()?); |
32 | 0 | if x.is_none() { |
33 | 0 | *opt = None; |
34 | 0 | } |
35 | 0 | x |
36 | 0 | } Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, core::ops::range::RangeInclusive<u32>, <roaring::bitmap::container::Iter>::next_range> Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, core::ops::range::RangeInclusive<u32>, <roaring::bitmap::container::Iter>::next_range_back> Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, u32, <roaring::bitmap::iter::Iter as core::iter::traits::iterator::Iterator>::nth::{closure#0}>Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, u32, <roaring::bitmap::iter::Iter as core::iter::traits::iterator::Iterator>::nth::{closure#1}>Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, u32, <roaring::bitmap::iter::Iter as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back::{closure#0}>Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, u32, <roaring::bitmap::iter::Iter as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back::{closure#1}>Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, u32, <roaring::bitmap::iter::IntoIter as core::iter::traits::iterator::Iterator>::nth::{closure#0}>Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, u32, <roaring::bitmap::iter::IntoIter as core::iter::traits::iterator::Iterator>::nth::{closure#1}>Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, u32, <roaring::bitmap::iter::IntoIter as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back::{closure#0}>Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, u32, <roaring::bitmap::iter::IntoIter as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back::{closure#1}>Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, u32, <roaring::bitmap::container::Iter as core::iter::traits::double_ended::DoubleEndedIterator>::next_back> Unexecuted instantiation: roaring::bitmap::iter::and_then_or_clear::<roaring::bitmap::container::Iter, u32, <roaring::bitmap::container::Iter as core::iter::traits::iterator::Iterator>::next> |
37 | | |
38 | 0 | fn advance_to_impl<'a, It>( |
39 | 0 | n: u32, |
40 | 0 | front_iter: &mut Option<container::Iter<'a>>, |
41 | 0 | containers: &mut It, |
42 | 0 | back_iter: &mut Option<container::Iter<'a>>, |
43 | 0 | ) where |
44 | 0 | It: Iterator, |
45 | 0 | It: AsRef<[Container]>, |
46 | 0 | It::Item: IntoIterator<IntoIter = container::Iter<'a>>, |
47 | | { |
48 | 0 | let (key, index) = util::split(n); |
49 | 0 | if let Some(iter) = front_iter { |
50 | 0 | match key.cmp(&iter.key) { |
51 | 0 | core::cmp::Ordering::Less => return, |
52 | | core::cmp::Ordering::Equal => { |
53 | 0 | iter.advance_to(index); |
54 | 0 | return; |
55 | | } |
56 | 0 | core::cmp::Ordering::Greater => { |
57 | 0 | *front_iter = None; |
58 | 0 | } |
59 | | } |
60 | 0 | } |
61 | 0 | let containers_slice = containers.as_ref(); |
62 | 0 | let containers_len = containers_slice.len(); |
63 | 0 | let to_skip = match containers_slice.binary_search_by_key(&key, |c| c.key) { |
64 | 0 | Ok(n) => { |
65 | 0 | let container = containers.nth(n).expect("binary search returned a valid index"); |
66 | 0 | let mut container_iter = container.into_iter(); |
67 | 0 | container_iter.advance_to(index); |
68 | 0 | *front_iter = Some(container_iter); |
69 | 0 | return; |
70 | | } |
71 | 0 | Err(n) => n, |
72 | | }; |
73 | | |
74 | 0 | if let Some(n) = to_skip.checked_sub(1) { |
75 | 0 | containers.nth(n); |
76 | 0 | } |
77 | 0 | if to_skip != containers_len { |
78 | | // There are still containers with keys greater than the key we are looking for, |
79 | | // the key we're looking _can't_ be in the back iterator. |
80 | 0 | return; |
81 | 0 | } |
82 | 0 | if let Some(iter) = back_iter { |
83 | 0 | match key.cmp(&iter.key) { |
84 | 0 | core::cmp::Ordering::Less => {} |
85 | 0 | core::cmp::Ordering::Equal => { |
86 | 0 | iter.advance_to(index); |
87 | 0 | } |
88 | 0 | core::cmp::Ordering::Greater => { |
89 | 0 | *back_iter = None; |
90 | 0 | } |
91 | | } |
92 | 0 | } |
93 | 0 | } Unexecuted instantiation: roaring::bitmap::iter::advance_to_impl::<core::slice::iter::Iter<roaring::bitmap::container::Container>> Unexecuted instantiation: roaring::bitmap::iter::advance_to_impl::<alloc::vec::into_iter::IntoIter<roaring::bitmap::container::Container>> |
94 | | |
95 | 0 | fn next_range_impl<'a, It>( |
96 | 0 | front_iter: &mut Option<container::Iter<'a>>, |
97 | 0 | containers: &mut It, |
98 | 0 | back_iter: &mut Option<container::Iter<'a>>, |
99 | 0 | ) -> Option<core::ops::RangeInclusive<u32>> |
100 | 0 | where |
101 | 0 | It: Iterator + Clone, |
102 | 0 | It: AsRef<[Container]>, |
103 | 0 | It::Item: IntoIterator<IntoIter = container::Iter<'a>>, |
104 | | { |
105 | 0 | let range = loop { |
106 | 0 | if let Some(r) = and_then_or_clear(front_iter, container::Iter::next_range) { |
107 | 0 | break r; |
108 | 0 | } |
109 | 0 | *front_iter = match containers.next() { |
110 | 0 | Some(inner) => Some(inner.into_iter()), |
111 | 0 | None => return and_then_or_clear(back_iter, container::Iter::next_range), |
112 | | } |
113 | | }; |
114 | 0 | let (range_start, mut range_end) = (*range.start(), *range.end()); |
115 | 0 | while range_end & 0xFFFF == 0xFFFF { |
116 | 0 | let Some(after_end) = range_end.checked_add(1) else { |
117 | 0 | return Some(range_start..=range_end); |
118 | | }; |
119 | 0 | let (next_key, _) = util::split(after_end); |
120 | | |
121 | 0 | if containers.as_ref().first().is_some_and(|c| c.key == next_key && c.contains(0)) {Unexecuted instantiation: roaring::bitmap::iter::next_range_impl::<core::slice::iter::Iter<roaring::bitmap::container::Container>>::{closure#0}Unexecuted instantiation: roaring::bitmap::iter::next_range_impl::<alloc::vec::into_iter::IntoIter<roaring::bitmap::container::Container>>::{closure#0} |
122 | 0 | let mut iter = containers.next().unwrap().into_iter(); |
123 | 0 | let next_range = iter.next_range().unwrap(); |
124 | 0 | *front_iter = Some(iter); |
125 | 0 | debug_assert_eq!(*next_range.start(), after_end); |
126 | 0 | range_end = *next_range.end(); |
127 | | } else { |
128 | 0 | if let Some(iter) = back_iter { |
129 | 0 | if iter.peek() == Some(after_end) { |
130 | 0 | let next_range = iter.next_range().unwrap(); |
131 | 0 | debug_assert_eq!(*next_range.start(), after_end); |
132 | 0 | range_end = *next_range.end(); |
133 | 0 | } |
134 | 0 | } |
135 | 0 | break; |
136 | | } |
137 | | } |
138 | | |
139 | 0 | Some(range_start..=range_end) |
140 | 0 | } Unexecuted instantiation: roaring::bitmap::iter::next_range_impl::<core::slice::iter::Iter<roaring::bitmap::container::Container>> Unexecuted instantiation: roaring::bitmap::iter::next_range_impl::<alloc::vec::into_iter::IntoIter<roaring::bitmap::container::Container>> |
141 | | |
142 | 0 | fn next_range_back_impl<'a, It>( |
143 | 0 | front_iter: &mut Option<container::Iter<'a>>, |
144 | 0 | containers: &mut It, |
145 | 0 | back_iter: &mut Option<container::Iter<'a>>, |
146 | 0 | ) -> Option<core::ops::RangeInclusive<u32>> |
147 | 0 | where |
148 | 0 | It: DoubleEndedIterator, |
149 | 0 | It: AsRef<[Container]>, |
150 | 0 | It::Item: IntoIterator<IntoIter = container::Iter<'a>>, |
151 | | { |
152 | 0 | let range = loop { |
153 | 0 | if let Some(r) = and_then_or_clear(back_iter, container::Iter::next_range_back) { |
154 | 0 | break r; |
155 | 0 | } |
156 | 0 | *back_iter = match containers.next_back() { |
157 | 0 | Some(inner) => Some(inner.into_iter()), |
158 | 0 | None => return and_then_or_clear(front_iter, container::Iter::next_range_back), |
159 | | } |
160 | | }; |
161 | 0 | let (mut range_start, range_end) = (*range.start(), *range.end()); |
162 | 0 | while range_start & 0xFFFF == 0 { |
163 | 0 | let Some(before_start) = range_start.checked_sub(1) else { |
164 | 0 | return Some(range_start..=range_end); |
165 | | }; |
166 | 0 | let (prev_key, _) = util::split(before_start); |
167 | | |
168 | 0 | if containers.as_ref().last().is_some_and(|c| c.key == prev_key && c.contains(u16::MAX)) {Unexecuted instantiation: roaring::bitmap::iter::next_range_back_impl::<core::slice::iter::Iter<roaring::bitmap::container::Container>>::{closure#0}Unexecuted instantiation: roaring::bitmap::iter::next_range_back_impl::<alloc::vec::into_iter::IntoIter<roaring::bitmap::container::Container>>::{closure#0} |
169 | 0 | let mut iter = containers.next_back().unwrap().into_iter(); |
170 | 0 | let next_range = iter.next_range_back().unwrap(); |
171 | 0 | *back_iter = Some(iter); |
172 | 0 | debug_assert_eq!(*next_range.end(), before_start); |
173 | 0 | range_start = *next_range.start(); |
174 | | } else { |
175 | 0 | if let Some(iter) = front_iter { |
176 | 0 | if iter.key == prev_key && iter.peek_back() == Some(before_start) { |
177 | 0 | let next_range = iter.next_range_back().unwrap(); |
178 | 0 | debug_assert_eq!(*next_range.end(), before_start); |
179 | 0 | range_start = *next_range.start(); |
180 | 0 | } |
181 | 0 | } |
182 | 0 | break; |
183 | | } |
184 | | } |
185 | | |
186 | 0 | Some(range_start..=range_end) |
187 | 0 | } Unexecuted instantiation: roaring::bitmap::iter::next_range_back_impl::<core::slice::iter::Iter<roaring::bitmap::container::Container>> Unexecuted instantiation: roaring::bitmap::iter::next_range_back_impl::<alloc::vec::into_iter::IntoIter<roaring::bitmap::container::Container>> |
188 | | |
189 | 0 | fn advance_back_to_impl<'a, It>( |
190 | 0 | n: u32, |
191 | 0 | front_iter: &mut Option<container::Iter<'a>>, |
192 | 0 | containers: &mut It, |
193 | 0 | back_iter: &mut Option<container::Iter<'a>>, |
194 | 0 | ) where |
195 | 0 | It: DoubleEndedIterator, |
196 | 0 | It: AsRef<[Container]>, |
197 | 0 | It::Item: IntoIterator<IntoIter = container::Iter<'a>>, |
198 | | { |
199 | 0 | let (key, index) = util::split(n); |
200 | 0 | if let Some(iter) = back_iter { |
201 | 0 | match key.cmp(&iter.key) { |
202 | 0 | core::cmp::Ordering::Greater => return, |
203 | | core::cmp::Ordering::Equal => { |
204 | 0 | iter.advance_back_to(index); |
205 | 0 | return; |
206 | | } |
207 | 0 | core::cmp::Ordering::Less => { |
208 | 0 | *back_iter = None; |
209 | 0 | } |
210 | | } |
211 | 0 | } |
212 | 0 | let containers_slice = containers.as_ref(); |
213 | 0 | let containers_len = containers_slice.len(); |
214 | 0 | let to_skip = match containers_slice.binary_search_by_key(&key, |c| c.key) { |
215 | 0 | Ok(n) => { |
216 | | // n must be less than containers_len, so this can never underflow |
217 | 0 | let n = containers_len - n - 1; |
218 | 0 | let container = containers.nth_back(n).expect("binary search returned a valid index"); |
219 | 0 | let mut container_iter = container.into_iter(); |
220 | 0 | container_iter.advance_back_to(index); |
221 | 0 | *back_iter = Some(container_iter); |
222 | 0 | return; |
223 | | } |
224 | 0 | Err(n) => containers_len - n, |
225 | | }; |
226 | | |
227 | 0 | if let Some(n) = to_skip.checked_sub(1) { |
228 | 0 | containers.nth_back(n); |
229 | 0 | } |
230 | 0 | if to_skip != containers_len { |
231 | | // There are still containers with keys less than the key we are looking for, |
232 | | // the key we're looking _can't_ be in the front iterator. |
233 | 0 | return; |
234 | 0 | } |
235 | 0 | if let Some(iter) = front_iter { |
236 | 0 | match key.cmp(&iter.key) { |
237 | 0 | core::cmp::Ordering::Greater => {} |
238 | 0 | core::cmp::Ordering::Equal => { |
239 | 0 | iter.advance_back_to(index); |
240 | 0 | } |
241 | 0 | core::cmp::Ordering::Less => { |
242 | 0 | *front_iter = None; |
243 | 0 | } |
244 | | } |
245 | 0 | } |
246 | 0 | } Unexecuted instantiation: roaring::bitmap::iter::advance_back_to_impl::<core::slice::iter::Iter<roaring::bitmap::container::Container>> Unexecuted instantiation: roaring::bitmap::iter::advance_back_to_impl::<alloc::vec::into_iter::IntoIter<roaring::bitmap::container::Container>> |
247 | | |
248 | | impl Iter<'_> { |
249 | 0 | fn new(containers: &'_ [Container]) -> Iter<'_> { |
250 | 0 | Iter { front: None, containers: containers.iter(), back: None } |
251 | 0 | } |
252 | | |
253 | 0 | fn empty() -> Self { |
254 | 0 | Self::new(&[]) |
255 | 0 | } |
256 | | |
257 | | /// Advance the iterator to the first position where the item has a value >= `n` |
258 | | /// |
259 | | /// # Examples |
260 | | /// |
261 | | /// ```rust |
262 | | /// use roaring::RoaringBitmap; |
263 | | /// use core::iter::FromIterator; |
264 | | /// |
265 | | /// let bitmap = (1..3).collect::<RoaringBitmap>(); |
266 | | /// let mut iter = bitmap.iter(); |
267 | | /// iter.advance_to(2); |
268 | | /// |
269 | | /// assert_eq!(iter.next(), Some(2)); |
270 | | /// assert_eq!(iter.next(), None); |
271 | | /// ``` |
272 | 0 | pub fn advance_to(&mut self, n: u32) { |
273 | 0 | advance_to_impl(n, &mut self.front, &mut self.containers, &mut self.back); |
274 | 0 | } |
275 | | |
276 | | /// Advance the back of the iterator to the first position where the item has a value <= `n` |
277 | | /// |
278 | | /// # Examples |
279 | | /// |
280 | | /// ```rust |
281 | | /// use roaring::RoaringBitmap; |
282 | | /// use core::iter::FromIterator; |
283 | | /// |
284 | | /// let bitmap = (1..3).collect::<RoaringBitmap>(); |
285 | | /// let mut iter = bitmap.iter(); |
286 | | /// iter.advance_back_to(1); |
287 | | /// |
288 | | /// assert_eq!(iter.next_back(), Some(1)); |
289 | | /// assert_eq!(iter.next_back(), None); |
290 | | /// ``` |
291 | 0 | pub fn advance_back_to(&mut self, n: u32) { |
292 | 0 | advance_back_to_impl(n, &mut self.front, &mut self.containers, &mut self.back); |
293 | 0 | } |
294 | | |
295 | | /// Returns the range of consecutive set bits from the current position to the end of the current run |
296 | | /// |
297 | | /// After this call, the iterator will be positioned at the first item after the returned range. |
298 | | /// Returns `None` if the iterator is exhausted. |
299 | | /// |
300 | | /// # Examples |
301 | | /// |
302 | | /// ```rust |
303 | | /// use roaring::RoaringBitmap; |
304 | | /// |
305 | | /// let bm = RoaringBitmap::from([1, 2, 4, 5]); |
306 | | /// let mut iter = bm.iter(); |
307 | | /// assert_eq!(iter.next_range(), Some(1..=2)); |
308 | | /// assert_eq!(iter.next(), Some(4)); |
309 | | /// assert_eq!(iter.next_range(), Some(5..=5)); |
310 | | /// ``` |
311 | 0 | pub fn next_range(&mut self) -> Option<core::ops::RangeInclusive<u32>> { |
312 | 0 | next_range_impl(&mut self.front, &mut self.containers, &mut self.back) |
313 | 0 | } |
314 | | |
315 | | /// Returns the range of consecutive set bits from the start of the current run to the current back position |
316 | | /// |
317 | | /// After this call, the back of the iterator will be positioned at the last item before the returned range. |
318 | | /// Returns `None` if the iterator is exhausted. |
319 | | /// |
320 | | /// # Examples |
321 | | /// |
322 | | /// ```rust |
323 | | /// use roaring::RoaringBitmap; |
324 | | /// |
325 | | /// let bm = RoaringBitmap::from([1, 2, 4, 5]); |
326 | | /// let mut iter = bm.iter(); |
327 | | /// assert_eq!(iter.next_range_back(), Some(4..=5)); |
328 | | /// assert_eq!(iter.next_back(), Some(2)); |
329 | | /// assert_eq!(iter.next_range_back(), Some(1..=1)); |
330 | | /// ``` |
331 | 0 | pub fn next_range_back(&mut self) -> Option<core::ops::RangeInclusive<u32>> { |
332 | 0 | next_range_back_impl(&mut self.front, &mut self.containers, &mut self.back) |
333 | 0 | } |
334 | | } |
335 | | |
336 | | impl IntoIter { |
337 | 0 | fn new(containers: Vec<Container>) -> IntoIter { |
338 | 0 | IntoIter { front: None, containers: containers.into_iter(), back: None } |
339 | 0 | } |
340 | | |
341 | 0 | fn empty() -> Self { |
342 | 0 | Self::new(Vec::new()) |
343 | 0 | } |
344 | | |
345 | | /// Advance the iterator to the first position where the item has a value >= `n` |
346 | | /// |
347 | | /// # Examples |
348 | | /// |
349 | | /// ```rust |
350 | | /// use roaring::RoaringBitmap; |
351 | | /// use core::iter::FromIterator; |
352 | | /// |
353 | | /// let bitmap = (1..3).collect::<RoaringBitmap>(); |
354 | | /// let mut iter = bitmap.iter(); |
355 | | /// iter.advance_to(2); |
356 | | /// |
357 | | /// assert_eq!(iter.next(), Some(2)); |
358 | | /// assert_eq!(iter.next(), None); |
359 | | /// ``` |
360 | 0 | pub fn advance_to(&mut self, n: u32) { |
361 | 0 | advance_to_impl(n, &mut self.front, &mut self.containers, &mut self.back); |
362 | 0 | } |
363 | | |
364 | | /// Advance the back of the iterator to the first position where the item has a value <= `n` |
365 | | /// |
366 | | /// # Examples |
367 | | /// |
368 | | /// ```rust |
369 | | /// use roaring::RoaringBitmap; |
370 | | /// use core::iter::FromIterator; |
371 | | /// |
372 | | /// let bitmap = (1..3).collect::<RoaringBitmap>(); |
373 | | /// let mut iter = bitmap.into_iter(); |
374 | | /// iter.advance_back_to(1); |
375 | | /// |
376 | | /// assert_eq!(iter.next_back(), Some(1)); |
377 | | /// assert_eq!(iter.next_back(), None); |
378 | | /// ``` |
379 | 0 | pub fn advance_back_to(&mut self, n: u32) { |
380 | 0 | advance_back_to_impl(n, &mut self.front, &mut self.containers, &mut self.back); |
381 | 0 | } |
382 | | |
383 | | /// Returns the range of consecutive set bits from the current position to the end of the current run |
384 | | /// |
385 | | /// After this call, the iterator will be positioned at the first item after the returned range. |
386 | | /// Returns `None` if the iterator is exhausted. |
387 | | /// |
388 | | /// # Examples |
389 | | /// |
390 | | /// ```rust |
391 | | /// use roaring::RoaringBitmap; |
392 | | /// |
393 | | /// let bm = RoaringBitmap::from([1, 2, 4, 5]); |
394 | | /// let mut iter = bm.into_iter(); |
395 | | /// assert_eq!(iter.next_range(), Some(1..=2)); |
396 | | /// assert_eq!(iter.next(), Some(4)); |
397 | | /// assert_eq!(iter.next_range(), Some(5..=5)); |
398 | | /// ``` |
399 | 0 | pub fn next_range(&mut self) -> Option<core::ops::RangeInclusive<u32>> { |
400 | 0 | next_range_impl(&mut self.front, &mut self.containers, &mut self.back) |
401 | 0 | } |
402 | | |
403 | | /// Returns the range of consecutive set bits from the start of the current run to the current back position |
404 | | /// |
405 | | /// After this call, the back of the iterator will be positioned at the last item before the returned range. |
406 | | /// Returns `None` if the iterator is exhausted. |
407 | | /// |
408 | | /// # Examples |
409 | | /// |
410 | | /// ```rust |
411 | | /// use roaring::RoaringBitmap; |
412 | | /// |
413 | | /// let bm = RoaringBitmap::from([1, 2, 4, 5]); |
414 | | /// let mut iter = bm.into_iter(); |
415 | | /// assert_eq!(iter.next_range_back(), Some(4..=5)); |
416 | | /// assert_eq!(iter.next_back(), Some(2)); |
417 | | /// assert_eq!(iter.next_range_back(), Some(1..=1)); |
418 | | /// ``` |
419 | 0 | pub fn next_range_back(&mut self) -> Option<core::ops::RangeInclusive<u32>> { |
420 | 0 | next_range_back_impl(&mut self.front, &mut self.containers, &mut self.back) |
421 | 0 | } |
422 | | } |
423 | | |
424 | 0 | fn size_hint_impl( |
425 | 0 | front: &Option<container::Iter<'_>>, |
426 | 0 | containers: &impl AsRef<[Container]>, |
427 | 0 | back: &Option<container::Iter<'_>>, |
428 | 0 | ) -> (usize, Option<usize>) { |
429 | 0 | let first_size = front.as_ref().map_or(0, |it| it.len()); Unexecuted instantiation: roaring::bitmap::iter::size_hint_impl::<core::slice::iter::Iter<roaring::bitmap::container::Container>>::{closure#0}Unexecuted instantiation: roaring::bitmap::iter::size_hint_impl::<alloc::vec::into_iter::IntoIter<roaring::bitmap::container::Container>>::{closure#0} |
430 | 0 | let last_size = back.as_ref().map_or(0, |it| it.len()); Unexecuted instantiation: roaring::bitmap::iter::size_hint_impl::<core::slice::iter::Iter<roaring::bitmap::container::Container>>::{closure#1}Unexecuted instantiation: roaring::bitmap::iter::size_hint_impl::<alloc::vec::into_iter::IntoIter<roaring::bitmap::container::Container>>::{closure#1} |
431 | 0 | let mut size = first_size + last_size; |
432 | 0 | for container in containers.as_ref() { |
433 | 0 | match size.checked_add(container.len() as usize) { |
434 | 0 | Some(new_size) => size = new_size, |
435 | 0 | None => return (usize::MAX, None), |
436 | | } |
437 | | } |
438 | 0 | (size, Some(size)) |
439 | 0 | } Unexecuted instantiation: roaring::bitmap::iter::size_hint_impl::<core::slice::iter::Iter<roaring::bitmap::container::Container>> Unexecuted instantiation: roaring::bitmap::iter::size_hint_impl::<alloc::vec::into_iter::IntoIter<roaring::bitmap::container::Container>> |
440 | | |
441 | | impl Iterator for Iter<'_> { |
442 | | type Item = u32; |
443 | | |
444 | 0 | fn next(&mut self) -> Option<u32> { |
445 | | loop { |
446 | 0 | if let Some(x) = and_then_or_clear(&mut self.front, Iterator::next) { |
447 | 0 | return Some(x); |
448 | 0 | } |
449 | 0 | self.front = match self.containers.next() { |
450 | 0 | Some(inner) => Some(inner.into_iter()), |
451 | 0 | None => return and_then_or_clear(&mut self.back, Iterator::next), |
452 | | } |
453 | | } |
454 | 0 | } |
455 | | |
456 | 0 | fn size_hint(&self) -> (usize, Option<usize>) { |
457 | 0 | size_hint_impl(&self.front, &self.containers, &self.back) |
458 | 0 | } |
459 | | |
460 | | #[inline] |
461 | 0 | fn fold<B, F>(mut self, mut init: B, mut f: F) -> B |
462 | 0 | where |
463 | 0 | Self: Sized, |
464 | 0 | F: FnMut(B, Self::Item) -> B, |
465 | | { |
466 | 0 | if let Some(iter) = &mut self.front { |
467 | 0 | init = iter.fold(init, &mut f); |
468 | 0 | } |
469 | 0 | init = self.containers.fold(init, |acc, container| { |
470 | 0 | let iter = <&Container>::into_iter(container); |
471 | 0 | iter.fold(acc, &mut f) |
472 | 0 | }); |
473 | 0 | if let Some(iter) = &mut self.back { |
474 | 0 | init = iter.fold(init, &mut f); |
475 | 0 | }; |
476 | 0 | init |
477 | 0 | } |
478 | | |
479 | 0 | fn count(self) -> usize |
480 | 0 | where |
481 | 0 | Self: Sized, |
482 | | { |
483 | 0 | let mut count = self.front.map_or(0, Iterator::count); |
484 | 0 | count += self.containers.map(|container| container.len() as usize).sum::<usize>(); |
485 | 0 | count += self.back.map_or(0, Iterator::count); |
486 | 0 | count |
487 | 0 | } |
488 | | |
489 | 0 | fn nth(&mut self, n: usize) -> Option<Self::Item> { |
490 | 0 | let mut n = n; |
491 | 0 | let nth_advance = |it: &mut container::Iter| { |
492 | 0 | let len = it.len(); |
493 | 0 | if n < len { |
494 | 0 | it.nth(n) |
495 | | } else { |
496 | 0 | n -= len; |
497 | 0 | None |
498 | | } |
499 | 0 | }; |
500 | 0 | if let Some(x) = and_then_or_clear(&mut self.front, nth_advance) { |
501 | 0 | return Some(x); |
502 | 0 | } |
503 | 0 | for container in self.containers.by_ref() { |
504 | 0 | let len = container.len() as usize; |
505 | 0 | if n < len { |
506 | 0 | let mut front_iter = container.into_iter(); |
507 | 0 | let result = front_iter.nth(n); |
508 | 0 | self.front = Some(front_iter); |
509 | 0 | return result; |
510 | 0 | } |
511 | 0 | n -= len; |
512 | | } |
513 | 0 | and_then_or_clear(&mut self.back, |it| it.nth(n)) |
514 | 0 | } |
515 | | } |
516 | | |
517 | | impl DoubleEndedIterator for Iter<'_> { |
518 | 0 | fn next_back(&mut self) -> Option<Self::Item> { |
519 | | loop { |
520 | 0 | if let Some(x) = and_then_or_clear(&mut self.back, DoubleEndedIterator::next_back) { |
521 | 0 | return Some(x); |
522 | 0 | } |
523 | 0 | self.back = match self.containers.next_back() { |
524 | 0 | Some(inner) => Some(inner.into_iter()), |
525 | 0 | None => return and_then_or_clear(&mut self.front, DoubleEndedIterator::next_back), |
526 | | } |
527 | | } |
528 | 0 | } |
529 | | |
530 | | #[inline] |
531 | 0 | fn rfold<Acc, Fold>(mut self, mut init: Acc, mut fold: Fold) -> Acc |
532 | 0 | where |
533 | 0 | Fold: FnMut(Acc, Self::Item) -> Acc, |
534 | | { |
535 | 0 | if let Some(iter) = &mut self.back { |
536 | 0 | init = iter.rfold(init, &mut fold); |
537 | 0 | } |
538 | 0 | init = self.containers.rfold(init, |acc, container| { |
539 | 0 | let iter = container.into_iter(); |
540 | 0 | iter.rfold(acc, &mut fold) |
541 | 0 | }); |
542 | 0 | if let Some(iter) = &mut self.front { |
543 | 0 | init = iter.rfold(init, &mut fold); |
544 | 0 | }; |
545 | 0 | init |
546 | 0 | } |
547 | | |
548 | 0 | fn nth_back(&mut self, n: usize) -> Option<Self::Item> { |
549 | 0 | let mut n = n; |
550 | 0 | let nth_advance = |it: &mut container::Iter| { |
551 | 0 | let len = it.len(); |
552 | 0 | if n < len { |
553 | 0 | it.nth_back(n) |
554 | | } else { |
555 | 0 | n -= len; |
556 | 0 | None |
557 | | } |
558 | 0 | }; |
559 | 0 | if let Some(x) = and_then_or_clear(&mut self.back, nth_advance) { |
560 | 0 | return Some(x); |
561 | 0 | } |
562 | 0 | for container in self.containers.by_ref().rev() { |
563 | 0 | let len = container.len() as usize; |
564 | 0 | if n < len { |
565 | 0 | let mut front_iter = container.into_iter(); |
566 | 0 | let result = front_iter.nth_back(n); |
567 | 0 | self.back = Some(front_iter); |
568 | 0 | return result; |
569 | 0 | } |
570 | 0 | n -= len; |
571 | | } |
572 | 0 | and_then_or_clear(&mut self.front, |it| it.nth_back(n)) |
573 | 0 | } |
574 | | } |
575 | | |
576 | | #[cfg(target_pointer_width = "64")] |
577 | | impl ExactSizeIterator for Iter<'_> {} |
578 | | impl FusedIterator for Iter<'_> {} |
579 | | |
580 | | impl Iterator for IntoIter { |
581 | | type Item = u32; |
582 | | |
583 | 0 | fn next(&mut self) -> Option<u32> { |
584 | | loop { |
585 | 0 | if let Some(x) = and_then_or_clear(&mut self.front, Iterator::next) { |
586 | 0 | return Some(x); |
587 | 0 | } |
588 | 0 | match self.containers.next() { |
589 | 0 | Some(inner) => self.front = Some(inner.into_iter()), |
590 | 0 | None => return and_then_or_clear(&mut self.back, Iterator::next), |
591 | | } |
592 | | } |
593 | 0 | } |
594 | | |
595 | 0 | fn size_hint(&self) -> (usize, Option<usize>) { |
596 | 0 | size_hint_impl(&self.front, &self.containers, &self.back) |
597 | 0 | } |
598 | | |
599 | | #[inline] |
600 | 0 | fn fold<B, F>(mut self, mut init: B, mut f: F) -> B |
601 | 0 | where |
602 | 0 | Self: Sized, |
603 | 0 | F: FnMut(B, Self::Item) -> B, |
604 | | { |
605 | 0 | if let Some(iter) = &mut self.front { |
606 | 0 | init = iter.fold(init, &mut f); |
607 | 0 | } |
608 | 0 | init = self.containers.fold(init, |acc, container| { |
609 | 0 | let iter = <Container>::into_iter(container); |
610 | 0 | iter.fold(acc, &mut f) |
611 | 0 | }); |
612 | 0 | if let Some(iter) = &mut self.back { |
613 | 0 | init = iter.fold(init, &mut f); |
614 | 0 | }; |
615 | 0 | init |
616 | 0 | } |
617 | | |
618 | 0 | fn count(self) -> usize |
619 | 0 | where |
620 | 0 | Self: Sized, |
621 | | { |
622 | 0 | let mut count = self.front.map_or(0, Iterator::count); |
623 | 0 | count += self.containers.map(|container| container.len() as usize).sum::<usize>(); |
624 | 0 | count += self.back.map_or(0, Iterator::count); |
625 | 0 | count |
626 | 0 | } |
627 | | |
628 | 0 | fn nth(&mut self, n: usize) -> Option<Self::Item> { |
629 | 0 | let mut n = n; |
630 | 0 | let nth_advance = |it: &mut container::Iter| { |
631 | 0 | let len = it.len(); |
632 | 0 | if n < len { |
633 | 0 | it.nth(n) |
634 | | } else { |
635 | 0 | n -= len; |
636 | 0 | None |
637 | | } |
638 | 0 | }; |
639 | 0 | if let Some(x) = and_then_or_clear(&mut self.front, nth_advance) { |
640 | 0 | return Some(x); |
641 | 0 | } |
642 | 0 | for container in self.containers.by_ref() { |
643 | 0 | let len = container.len() as usize; |
644 | 0 | if n < len { |
645 | 0 | let mut front_iter = container.into_iter(); |
646 | 0 | let result = front_iter.nth(n); |
647 | 0 | self.front = Some(front_iter); |
648 | 0 | return result; |
649 | 0 | } |
650 | 0 | n -= len; |
651 | | } |
652 | 0 | and_then_or_clear(&mut self.back, |it| it.nth(n)) |
653 | 0 | } |
654 | | } |
655 | | |
656 | | impl DoubleEndedIterator for IntoIter { |
657 | 0 | fn next_back(&mut self) -> Option<Self::Item> { |
658 | | loop { |
659 | 0 | if let Some(x) = and_then_or_clear(&mut self.back, DoubleEndedIterator::next_back) { |
660 | 0 | return Some(x); |
661 | 0 | } |
662 | 0 | match self.containers.next_back() { |
663 | 0 | Some(inner) => self.back = Some(inner.into_iter()), |
664 | 0 | None => return and_then_or_clear(&mut self.front, DoubleEndedIterator::next_back), |
665 | | } |
666 | | } |
667 | 0 | } |
668 | | |
669 | | #[inline] |
670 | 0 | fn rfold<Acc, Fold>(mut self, mut init: Acc, mut fold: Fold) -> Acc |
671 | 0 | where |
672 | 0 | Fold: FnMut(Acc, Self::Item) -> Acc, |
673 | | { |
674 | 0 | if let Some(iter) = &mut self.back { |
675 | 0 | init = iter.rfold(init, &mut fold); |
676 | 0 | } |
677 | 0 | init = self.containers.rfold(init, |acc, container| { |
678 | 0 | let iter = container.into_iter(); |
679 | 0 | iter.rfold(acc, &mut fold) |
680 | 0 | }); |
681 | 0 | if let Some(iter) = &mut self.front { |
682 | 0 | init = iter.rfold(init, &mut fold); |
683 | 0 | }; |
684 | 0 | init |
685 | 0 | } |
686 | | |
687 | 0 | fn nth_back(&mut self, n: usize) -> Option<Self::Item> { |
688 | 0 | let mut n = n; |
689 | 0 | let nth_advance = |it: &mut container::Iter| { |
690 | 0 | let len = it.len(); |
691 | 0 | if n < len { |
692 | 0 | it.nth_back(n) |
693 | | } else { |
694 | 0 | n -= len; |
695 | 0 | None |
696 | | } |
697 | 0 | }; |
698 | 0 | if let Some(x) = and_then_or_clear(&mut self.back, nth_advance) { |
699 | 0 | return Some(x); |
700 | 0 | } |
701 | 0 | for container in self.containers.by_ref().rev() { |
702 | 0 | let len = container.len() as usize; |
703 | 0 | if n < len { |
704 | 0 | let mut front_iter = container.into_iter(); |
705 | 0 | let result = front_iter.nth_back(n); |
706 | 0 | self.back = Some(front_iter); |
707 | 0 | return result; |
708 | 0 | } |
709 | 0 | n -= len; |
710 | | } |
711 | 0 | and_then_or_clear(&mut self.front, |it| it.nth_back(n)) |
712 | 0 | } |
713 | | } |
714 | | |
715 | | #[cfg(target_pointer_width = "64")] |
716 | | impl ExactSizeIterator for IntoIter {} |
717 | | impl FusedIterator for IntoIter {} |
718 | | |
719 | | impl RoaringBitmap { |
720 | | /// Iterator over each value stored in the RoaringBitmap, guarantees values are ordered by value. |
721 | | /// |
722 | | /// # Examples |
723 | | /// |
724 | | /// ```rust |
725 | | /// use roaring::RoaringBitmap; |
726 | | /// use core::iter::FromIterator; |
727 | | /// |
728 | | /// let bitmap = (1..3).collect::<RoaringBitmap>(); |
729 | | /// let mut iter = bitmap.iter(); |
730 | | /// |
731 | | /// assert_eq!(iter.next(), Some(1)); |
732 | | /// assert_eq!(iter.next(), Some(2)); |
733 | | /// assert_eq!(iter.next(), None); |
734 | | /// ``` |
735 | 0 | pub fn iter(&'_ self) -> Iter<'_> { |
736 | 0 | Iter::new(&self.containers) |
737 | 0 | } |
738 | | |
739 | | /// Iterator over values within a range stored in the RoaringBitmap. |
740 | | /// |
741 | | /// # Examples |
742 | | /// |
743 | | /// ```rust |
744 | | /// use core::ops::Bound; |
745 | | /// use roaring::RoaringBitmap; |
746 | | /// |
747 | | /// let bitmap = RoaringBitmap::from([0, 1, 2, 3, 4, 5, 10, 11, 12, 20, 21, u32::MAX]); |
748 | | /// let mut iter = bitmap.range(10..20); |
749 | | /// |
750 | | /// assert_eq!(iter.next(), Some(10)); |
751 | | /// assert_eq!(iter.next(), Some(11)); |
752 | | /// assert_eq!(iter.next(), Some(12)); |
753 | | /// assert_eq!(iter.next(), None); |
754 | | /// |
755 | | /// let mut iter = bitmap.range(100..); |
756 | | /// assert_eq!(iter.next(), Some(u32::MAX)); |
757 | | /// assert_eq!(iter.next(), None); |
758 | | /// |
759 | | /// let mut iter = bitmap.range((Bound::Excluded(0), Bound::Included(10))); |
760 | | /// assert_eq!(iter.next(), Some(1)); |
761 | | /// assert_eq!(iter.next(), Some(2)); |
762 | | /// assert_eq!(iter.next(), Some(3)); |
763 | | /// assert_eq!(iter.next(), Some(4)); |
764 | | /// assert_eq!(iter.next(), Some(5)); |
765 | | /// assert_eq!(iter.next(), Some(10)); |
766 | | /// assert_eq!(iter.next(), None); |
767 | | /// ``` |
768 | 0 | pub fn range<R>(&self, range: R) -> Iter<'_> |
769 | 0 | where |
770 | 0 | R: RangeBounds<u32>, |
771 | | { |
772 | 0 | let range = match util::convert_range_to_inclusive(range) { |
773 | 0 | Ok(range) => range, |
774 | 0 | Err(util::ConvertRangeError::Empty) => return Iter::empty(), |
775 | | Err(util::ConvertRangeError::StartGreaterThanEnd) => { |
776 | 0 | panic!("range start is greater than range end") |
777 | | } |
778 | | Err(util::ConvertRangeError::StartAndEndEqualExcluded) => { |
779 | 0 | panic!("range start and end are equal and excluded") |
780 | | } |
781 | | }; |
782 | 0 | let (start, end) = (*range.start(), *range.end()); |
783 | 0 | let mut iter = self.iter(); |
784 | 0 | if start != 0 { |
785 | 0 | iter.advance_to(start); |
786 | 0 | } |
787 | 0 | if end != u32::MAX { |
788 | 0 | iter.advance_back_to(end); |
789 | 0 | } |
790 | 0 | iter |
791 | 0 | } |
792 | | |
793 | | /// Iterator over values within a range stored in the RoaringBitmap. |
794 | | /// |
795 | | /// # Examples |
796 | | /// |
797 | | /// ```rust |
798 | | /// use core::ops::Bound; |
799 | | /// use roaring::RoaringBitmap; |
800 | | /// |
801 | | /// fn bitmap() -> RoaringBitmap { |
802 | | /// RoaringBitmap::from([0, 1, 2, 3, 4, 5, 10, 11, 12, 20, 21, u32::MAX]) |
803 | | /// } |
804 | | /// |
805 | | /// let mut iter = bitmap().into_range(10..20); |
806 | | /// |
807 | | /// assert_eq!(iter.next(), Some(10)); |
808 | | /// assert_eq!(iter.next(), Some(11)); |
809 | | /// assert_eq!(iter.next(), Some(12)); |
810 | | /// assert_eq!(iter.next(), None); |
811 | | /// |
812 | | /// let mut iter = bitmap().into_range(100..); |
813 | | /// assert_eq!(iter.next(), Some(u32::MAX)); |
814 | | /// assert_eq!(iter.next(), None); |
815 | | /// |
816 | | /// let mut iter = bitmap().into_range((Bound::Excluded(0), Bound::Included(10))); |
817 | | /// assert_eq!(iter.next(), Some(1)); |
818 | | /// assert_eq!(iter.next(), Some(2)); |
819 | | /// assert_eq!(iter.next(), Some(3)); |
820 | | /// assert_eq!(iter.next(), Some(4)); |
821 | | /// assert_eq!(iter.next(), Some(5)); |
822 | | /// assert_eq!(iter.next(), Some(10)); |
823 | | /// assert_eq!(iter.next(), None); |
824 | | /// ``` |
825 | 0 | pub fn into_range<R>(self, range: R) -> IntoIter |
826 | 0 | where |
827 | 0 | R: RangeBounds<u32>, |
828 | | { |
829 | 0 | let range = match util::convert_range_to_inclusive(range) { |
830 | 0 | Ok(range) => range, |
831 | 0 | Err(util::ConvertRangeError::Empty) => return IntoIter::empty(), |
832 | | Err(util::ConvertRangeError::StartGreaterThanEnd) => { |
833 | 0 | panic!("range start is greater than range end") |
834 | | } |
835 | | Err(util::ConvertRangeError::StartAndEndEqualExcluded) => { |
836 | 0 | panic!("range start and end are equal and excluded") |
837 | | } |
838 | | }; |
839 | 0 | let (start, end) = (*range.start(), *range.end()); |
840 | 0 | let mut iter = self.into_iter(); |
841 | 0 | if start != 0 { |
842 | 0 | iter.advance_to(start); |
843 | 0 | } |
844 | 0 | if end != u32::MAX { |
845 | 0 | iter.advance_back_to(end); |
846 | 0 | } |
847 | 0 | iter |
848 | 0 | } |
849 | | } |
850 | | |
851 | | impl<'a> IntoIterator for &'a RoaringBitmap { |
852 | | type Item = u32; |
853 | | type IntoIter = Iter<'a>; |
854 | | |
855 | 0 | fn into_iter(self) -> Iter<'a> { |
856 | 0 | self.iter() |
857 | 0 | } |
858 | | } |
859 | | |
860 | | impl IntoIterator for RoaringBitmap { |
861 | | type Item = u32; |
862 | | type IntoIter = IntoIter; |
863 | | |
864 | 0 | fn into_iter(self) -> IntoIter { |
865 | 0 | IntoIter::new(self.containers) |
866 | 0 | } |
867 | | } |
868 | | |
869 | | impl<const N: usize> From<[u32; N]> for RoaringBitmap { |
870 | 0 | fn from(arr: [u32; N]) -> Self { |
871 | 0 | RoaringBitmap::from_iter(arr) |
872 | 0 | } |
873 | | } |
874 | | |
875 | | impl FromIterator<u32> for RoaringBitmap { |
876 | 0 | fn from_iter<I: IntoIterator<Item = u32>>(iterator: I) -> RoaringBitmap { |
877 | 0 | let mut rb = RoaringBitmap::new(); |
878 | 0 | rb.extend(iterator); |
879 | 0 | rb |
880 | 0 | } |
881 | | } |
882 | | |
883 | | impl<'a> FromIterator<&'a u32> for RoaringBitmap { |
884 | 0 | fn from_iter<I: IntoIterator<Item = &'a u32>>(iterator: I) -> RoaringBitmap { |
885 | 0 | let mut rb = RoaringBitmap::new(); |
886 | 0 | rb.extend(iterator); |
887 | 0 | rb |
888 | 0 | } |
889 | | } |
890 | | |
891 | | impl Extend<u32> for RoaringBitmap { |
892 | | /// Inserts multiple values and returns the count of new additions. |
893 | | /// This is expected to be faster than calling [`RoaringBitmap::insert`] on each value. |
894 | | /// |
895 | | /// The provided integers values don't have to be in sorted order, but it may be preferable |
896 | | /// to sort them from a performance point of view. |
897 | | /// |
898 | | /// # Examples |
899 | | /// |
900 | | /// ```rust |
901 | | /// use roaring::RoaringBitmap; |
902 | | /// |
903 | | /// let mut rb = RoaringBitmap::new(); |
904 | | /// rb.extend([1, 2, 3, 4, 1500, 1508, 1507, 1509]); |
905 | | /// assert!(rb.contains(2)); |
906 | | /// assert!(rb.contains(1508)); |
907 | | /// assert!(!rb.contains(5)); |
908 | | /// ``` |
909 | | #[inline] |
910 | 0 | fn extend<I: IntoIterator<Item = u32>>(&mut self, values: I) { |
911 | 0 | let mut values = values.into_iter(); |
912 | 0 | let value = match values.next() { |
913 | 0 | Some(value) => value, |
914 | 0 | None => return, |
915 | | }; |
916 | | |
917 | 0 | let (mut currenthb, lowbit) = util::split(value); |
918 | 0 | let mut current_container_index = self.find_container_by_key(currenthb); |
919 | 0 | let mut current_cont = &mut self.containers[current_container_index]; |
920 | 0 | current_cont.insert(lowbit); |
921 | | |
922 | 0 | for val in values { |
923 | 0 | let (newhb, lowbit) = util::split(val); |
924 | 0 | if currenthb == newhb { |
925 | 0 | // easy case, this could be quite frequent |
926 | 0 | current_cont.insert(lowbit); |
927 | 0 | } else { |
928 | 0 | currenthb = newhb; |
929 | 0 | current_container_index = self.find_container_by_key(currenthb); |
930 | 0 | current_cont = &mut self.containers[current_container_index]; |
931 | 0 | current_cont.insert(lowbit); |
932 | 0 | } |
933 | | } |
934 | 0 | } |
935 | | } |
936 | | |
937 | | impl<'a> Extend<&'a u32> for RoaringBitmap { |
938 | | /// Inserts multiple values and returns the count of new additions. |
939 | | /// This is expected to be faster than calling [`RoaringBitmap::insert`] on each value. |
940 | | /// |
941 | | /// The provided integers values don't have to be in sorted order, but it may be preferable |
942 | | /// to sort them from a performance point of view. |
943 | | /// |
944 | | /// # Examples |
945 | | /// |
946 | | /// ```rust |
947 | | /// use roaring::RoaringBitmap; |
948 | | /// |
949 | | /// let mut rb = RoaringBitmap::new(); |
950 | | /// rb.extend([1, 2, 3, 4, 1500, 1508, 1507, 1509]); |
951 | | /// assert!(rb.contains(2)); |
952 | | /// assert!(rb.contains(1508)); |
953 | | /// assert!(!rb.contains(5)); |
954 | | /// ``` |
955 | | #[inline] |
956 | 0 | fn extend<I: IntoIterator<Item = &'a u32>>(&mut self, values: I) { |
957 | 0 | self.extend(values.into_iter().copied()); |
958 | 0 | } |
959 | | } |
960 | | |
961 | | impl RoaringBitmap { |
962 | | /// Create the set from a sorted iterator. Values must be sorted and deduplicated. |
963 | | /// |
964 | | /// The values of the iterator must be ordered and strictly greater than the greatest value |
965 | | /// in the set. If a value in the iterator doesn't satisfy this requirement, it is not added |
966 | | /// and the append operation is stopped. |
967 | | /// |
968 | | /// Returns `Ok` with the requested `RoaringBitmap`, `Err` with the number of elements |
969 | | /// that were correctly appended before failure. |
970 | | /// |
971 | | /// # Example: Create a set from an ordered list of integers. |
972 | | /// |
973 | | /// ```rust |
974 | | /// use roaring::RoaringBitmap; |
975 | | /// |
976 | | /// let mut rb = RoaringBitmap::from_sorted_iter(0..10).unwrap(); |
977 | | /// |
978 | | /// assert!(rb.iter().eq(0..10)); |
979 | | /// ``` |
980 | | /// |
981 | | /// # Example: Try to create a set from a non-ordered list of integers. |
982 | | /// |
983 | | /// ```rust |
984 | | /// use roaring::RoaringBitmap; |
985 | | /// |
986 | | /// let integers = 0..10u32; |
987 | | /// let error = RoaringBitmap::from_sorted_iter(integers.rev()).unwrap_err(); |
988 | | /// |
989 | | /// assert_eq!(error.valid_until(), 1); |
990 | | /// ``` |
991 | 0 | pub fn from_sorted_iter<I: IntoIterator<Item = u32>>( |
992 | 0 | iterator: I, |
993 | 0 | ) -> Result<RoaringBitmap, NonSortedIntegers> { |
994 | 0 | let mut rb = RoaringBitmap::new(); |
995 | 0 | rb.append(iterator).map(|_| rb) |
996 | 0 | } |
997 | | |
998 | | /// Extend the set with a sorted iterator. |
999 | | /// |
1000 | | /// The values of the iterator must be ordered and strictly greater than the greatest value |
1001 | | /// in the set. If a value in the iterator doesn't satisfy this requirement, it is not added |
1002 | | /// and the append operation is stopped. |
1003 | | /// |
1004 | | /// Returns `Ok` with the number of elements appended to the set, `Err` with |
1005 | | /// the number of elements we effectively appended before an error occurred. |
1006 | | /// |
1007 | | /// # Examples |
1008 | | /// |
1009 | | /// ```rust |
1010 | | /// use roaring::RoaringBitmap; |
1011 | | /// |
1012 | | /// let mut rb = RoaringBitmap::new(); |
1013 | | /// assert_eq!(rb.append(0..10), Ok(10)); |
1014 | | /// |
1015 | | /// assert!(rb.iter().eq(0..10)); |
1016 | | /// ``` |
1017 | 0 | pub fn append<I: IntoIterator<Item = u32>>( |
1018 | 0 | &mut self, |
1019 | 0 | iterator: I, |
1020 | 0 | ) -> Result<u64, NonSortedIntegers> { |
1021 | | // Name shadowed to prevent accidentally referencing the param |
1022 | 0 | let mut iterator = iterator.into_iter(); |
1023 | | |
1024 | 0 | let mut prev = match (iterator.next(), self.max()) { |
1025 | 0 | (None, _) => return Ok(0), |
1026 | 0 | (Some(first), Some(max)) if first <= max => { |
1027 | 0 | return Err(NonSortedIntegers { valid_until: 0 }) |
1028 | | } |
1029 | 0 | (Some(first), _) => first, |
1030 | | }; |
1031 | | |
1032 | | // It is now guaranteed that so long as the values of the iterator are |
1033 | | // monotonically increasing they must also be the greatest in the set. |
1034 | | |
1035 | 0 | self.push_unchecked(prev); |
1036 | | |
1037 | 0 | let mut count = 1; |
1038 | | |
1039 | 0 | for value in iterator { |
1040 | 0 | if value <= prev { |
1041 | 0 | return Err(NonSortedIntegers { valid_until: count }); |
1042 | 0 | } else { |
1043 | 0 | self.push_unchecked(value); |
1044 | 0 | prev = value; |
1045 | 0 | count += 1; |
1046 | 0 | } |
1047 | | } |
1048 | | |
1049 | 0 | Ok(count) |
1050 | 0 | } |
1051 | | } |