Coverage Report

Created: 2026-03-23 07:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}