1use alloc::vec;
2use core::iter::FusedIterator;
3use core::ops::RangeBounds;
4use core::slice;
5
6use super::container::Container;
7use super::{container, util};
8use crate::{NonSortedIntegers, RoaringBitmap};
9
10#[cfg(not(feature = "std"))]
11use alloc::vec::Vec;
12
13#[derive(Clone)]
15pub struct Iter<'a> {
16 front: Option<container::Iter<'a>>,
17 containers: slice::Iter<'a, Container>,
18 back: Option<container::Iter<'a>>,
19}
20
21#[derive(Clone)]
23pub struct IntoIter {
24 front: Option<container::Iter<'static>>,
25 containers: vec::IntoIter<Container>,
26 back: Option<container::Iter<'static>>,
27}
28
29#[inline]
30fn and_then_or_clear<T, U>(opt: &mut Option<T>, f: impl FnOnce(&mut T) -> Option<U>) -> Option<U> {
31 let x = f(opt.as_mut()?);
32 if x.is_none() {
33 *opt = None;
34 }
35 x
36}
37
38fn advance_to_impl<'a, It>(
39 n: u32,
40 front_iter: &mut Option<container::Iter<'a>>,
41 containers: &mut It,
42 back_iter: &mut Option<container::Iter<'a>>,
43) where
44 It: Iterator,
45 It: AsRef<[Container]>,
46 It::Item: IntoIterator<IntoIter = container::Iter<'a>>,
47{
48 let (key, index) = util::split(n);
49 if let Some(iter) = front_iter {
50 match key.cmp(&iter.key) {
51 core::cmp::Ordering::Less => return,
52 core::cmp::Ordering::Equal => {
53 iter.advance_to(index);
54 return;
55 }
56 core::cmp::Ordering::Greater => {
57 *front_iter = None;
58 }
59 }
60 }
61 let containers_slice = containers.as_ref();
62 let containers_len = containers_slice.len();
63 let to_skip = match containers_slice.binary_search_by_key(&key, |c| c.key) {
64 Ok(n) => {
65 let container = containers.nth(n).expect("binary search returned a valid index");
66 let mut container_iter = container.into_iter();
67 container_iter.advance_to(index);
68 *front_iter = Some(container_iter);
69 return;
70 }
71 Err(n) => n,
72 };
73
74 if let Some(n) = to_skip.checked_sub(1) {
75 containers.nth(n);
76 }
77 if to_skip != containers_len {
78 return;
81 }
82 if let Some(iter) = back_iter {
83 match key.cmp(&iter.key) {
84 core::cmp::Ordering::Less => {}
85 core::cmp::Ordering::Equal => {
86 iter.advance_to(index);
87 }
88 core::cmp::Ordering::Greater => {
89 *back_iter = None;
90 }
91 }
92 }
93}
94
95fn advance_back_to_impl<'a, It>(
96 n: u32,
97 front_iter: &mut Option<container::Iter<'a>>,
98 containers: &mut It,
99 back_iter: &mut Option<container::Iter<'a>>,
100) where
101 It: DoubleEndedIterator,
102 It: AsRef<[Container]>,
103 It::Item: IntoIterator<IntoIter = container::Iter<'a>>,
104{
105 let (key, index) = util::split(n);
106 if let Some(iter) = back_iter {
107 match key.cmp(&iter.key) {
108 core::cmp::Ordering::Greater => return,
109 core::cmp::Ordering::Equal => {
110 iter.advance_back_to(index);
111 return;
112 }
113 core::cmp::Ordering::Less => {
114 *back_iter = None;
115 }
116 }
117 }
118 let containers_slice = containers.as_ref();
119 let containers_len = containers_slice.len();
120 let to_skip = match containers_slice.binary_search_by_key(&key, |c| c.key) {
121 Ok(n) => {
122 let n = containers_len - n - 1;
124 let container = containers.nth_back(n).expect("binary search returned a valid index");
125 let mut container_iter = container.into_iter();
126 container_iter.advance_back_to(index);
127 *back_iter = Some(container_iter);
128 return;
129 }
130 Err(n) => containers_len - n,
131 };
132
133 if let Some(n) = to_skip.checked_sub(1) {
134 containers.nth_back(n);
135 }
136 if to_skip != containers_len {
137 return;
140 }
141 if let Some(iter) = front_iter {
142 match key.cmp(&iter.key) {
143 core::cmp::Ordering::Greater => {}
144 core::cmp::Ordering::Equal => {
145 iter.advance_back_to(index);
146 }
147 core::cmp::Ordering::Less => {
148 *front_iter = None;
149 }
150 }
151 }
152}
153
154impl Iter<'_> {
155 fn new(containers: &'_ [Container]) -> Iter<'_> {
156 Iter { front: None, containers: containers.iter(), back: None }
157 }
158
159 fn empty() -> Self {
160 Self::new(&[])
161 }
162
163 pub fn advance_to(&mut self, n: u32) {
179 advance_to_impl(n, &mut self.front, &mut self.containers, &mut self.back);
180 }
181
182 pub fn advance_back_to(&mut self, n: u32) {
198 advance_back_to_impl(n, &mut self.front, &mut self.containers, &mut self.back);
199 }
200}
201
202impl IntoIter {
203 fn new(containers: Vec<Container>) -> IntoIter {
204 IntoIter { front: None, containers: containers.into_iter(), back: None }
205 }
206
207 fn empty() -> Self {
208 Self::new(Vec::new())
209 }
210
211 pub fn advance_to(&mut self, n: u32) {
227 advance_to_impl(n, &mut self.front, &mut self.containers, &mut self.back);
228 }
229
230 pub fn advance_back_to(&mut self, n: u32) {
246 advance_back_to_impl(n, &mut self.front, &mut self.containers, &mut self.back);
247 }
248}
249
250fn size_hint_impl(
251 front: &Option<container::Iter<'_>>,
252 containers: &impl AsRef<[Container]>,
253 back: &Option<container::Iter<'_>>,
254) -> (usize, Option<usize>) {
255 let first_size = front.as_ref().map_or(0, |it| it.len());
256 let last_size = back.as_ref().map_or(0, |it| it.len());
257 let mut size = first_size + last_size;
258 for container in containers.as_ref() {
259 match size.checked_add(container.len() as usize) {
260 Some(new_size) => size = new_size,
261 None => return (usize::MAX, None),
262 }
263 }
264 (size, Some(size))
265}
266
267impl Iterator for Iter<'_> {
268 type Item = u32;
269
270 fn next(&mut self) -> Option<u32> {
271 loop {
272 if let Some(x) = and_then_or_clear(&mut self.front, Iterator::next) {
273 return Some(x);
274 }
275 self.front = match self.containers.next() {
276 Some(inner) => Some(inner.into_iter()),
277 None => return and_then_or_clear(&mut self.back, Iterator::next),
278 }
279 }
280 }
281
282 fn size_hint(&self) -> (usize, Option<usize>) {
283 size_hint_impl(&self.front, &self.containers, &self.back)
284 }
285
286 #[inline]
287 fn fold<B, F>(mut self, mut init: B, mut f: F) -> B
288 where
289 Self: Sized,
290 F: FnMut(B, Self::Item) -> B,
291 {
292 if let Some(iter) = &mut self.front {
293 init = iter.fold(init, &mut f);
294 }
295 init = self.containers.fold(init, |acc, container| {
296 let iter = <&Container>::into_iter(container);
297 iter.fold(acc, &mut f)
298 });
299 if let Some(iter) = &mut self.back {
300 init = iter.fold(init, &mut f);
301 };
302 init
303 }
304
305 fn count(self) -> usize
306 where
307 Self: Sized,
308 {
309 let mut count = self.front.map_or(0, Iterator::count);
310 count += self.containers.map(|container| container.len() as usize).sum::<usize>();
311 count += self.back.map_or(0, Iterator::count);
312 count
313 }
314
315 fn nth(&mut self, n: usize) -> Option<Self::Item> {
316 let mut n = n;
317 let nth_advance = |it: &mut container::Iter| {
318 let len = it.len();
319 if n < len {
320 it.nth(n)
321 } else {
322 n -= len;
323 None
324 }
325 };
326 if let Some(x) = and_then_or_clear(&mut self.front, nth_advance) {
327 return Some(x);
328 }
329 for container in self.containers.by_ref() {
330 let len = container.len() as usize;
331 if n < len {
332 let mut front_iter = container.into_iter();
333 let result = front_iter.nth(n);
334 self.front = Some(front_iter);
335 return result;
336 }
337 n -= len;
338 }
339 and_then_or_clear(&mut self.back, |it| it.nth(n))
340 }
341}
342
343impl DoubleEndedIterator for Iter<'_> {
344 fn next_back(&mut self) -> Option<Self::Item> {
345 loop {
346 if let Some(x) = and_then_or_clear(&mut self.back, DoubleEndedIterator::next_back) {
347 return Some(x);
348 }
349 self.back = match self.containers.next_back() {
350 Some(inner) => Some(inner.into_iter()),
351 None => return and_then_or_clear(&mut self.front, DoubleEndedIterator::next_back),
352 }
353 }
354 }
355
356 #[inline]
357 fn rfold<Acc, Fold>(mut self, mut init: Acc, mut fold: Fold) -> Acc
358 where
359 Fold: FnMut(Acc, Self::Item) -> Acc,
360 {
361 if let Some(iter) = &mut self.back {
362 init = iter.rfold(init, &mut fold);
363 }
364 init = self.containers.rfold(init, |acc, container| {
365 let iter = container.into_iter();
366 iter.rfold(acc, &mut fold)
367 });
368 if let Some(iter) = &mut self.front {
369 init = iter.rfold(init, &mut fold);
370 };
371 init
372 }
373
374 fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
375 let mut n = n;
376 let nth_advance = |it: &mut container::Iter| {
377 let len = it.len();
378 if n < len {
379 it.nth_back(n)
380 } else {
381 n -= len;
382 None
383 }
384 };
385 if let Some(x) = and_then_or_clear(&mut self.back, nth_advance) {
386 return Some(x);
387 }
388 for container in self.containers.by_ref().rev() {
389 let len = container.len() as usize;
390 if n < len {
391 let mut front_iter = container.into_iter();
392 let result = front_iter.nth_back(n);
393 self.back = Some(front_iter);
394 return result;
395 }
396 n -= len;
397 }
398 and_then_or_clear(&mut self.front, |it| it.nth_back(n))
399 }
400}
401
402#[cfg(target_pointer_width = "64")]
403impl ExactSizeIterator for Iter<'_> {}
404impl FusedIterator for Iter<'_> {}
405
406impl Iterator for IntoIter {
407 type Item = u32;
408
409 fn next(&mut self) -> Option<u32> {
410 loop {
411 if let Some(x) = and_then_or_clear(&mut self.front, Iterator::next) {
412 return Some(x);
413 }
414 match self.containers.next() {
415 Some(inner) => self.front = Some(inner.into_iter()),
416 None => return and_then_or_clear(&mut self.back, Iterator::next),
417 }
418 }
419 }
420
421 fn size_hint(&self) -> (usize, Option<usize>) {
422 size_hint_impl(&self.front, &self.containers, &self.back)
423 }
424
425 #[inline]
426 fn fold<B, F>(mut self, mut init: B, mut f: F) -> B
427 where
428 Self: Sized,
429 F: FnMut(B, Self::Item) -> B,
430 {
431 if let Some(iter) = &mut self.front {
432 init = iter.fold(init, &mut f);
433 }
434 init = self.containers.fold(init, |acc, container| {
435 let iter = <Container>::into_iter(container);
436 iter.fold(acc, &mut f)
437 });
438 if let Some(iter) = &mut self.back {
439 init = iter.fold(init, &mut f);
440 };
441 init
442 }
443
444 fn count(self) -> usize
445 where
446 Self: Sized,
447 {
448 let mut count = self.front.map_or(0, Iterator::count);
449 count += self.containers.map(|container| container.len() as usize).sum::<usize>();
450 count += self.back.map_or(0, Iterator::count);
451 count
452 }
453
454 fn nth(&mut self, n: usize) -> Option<Self::Item> {
455 let mut n = n;
456 let nth_advance = |it: &mut container::Iter| {
457 let len = it.len();
458 if n < len {
459 it.nth(n)
460 } else {
461 n -= len;
462 None
463 }
464 };
465 if let Some(x) = and_then_or_clear(&mut self.front, nth_advance) {
466 return Some(x);
467 }
468 for container in self.containers.by_ref() {
469 let len = container.len() as usize;
470 if n < len {
471 let mut front_iter = container.into_iter();
472 let result = front_iter.nth(n);
473 self.front = Some(front_iter);
474 return result;
475 }
476 n -= len;
477 }
478 and_then_or_clear(&mut self.back, |it| it.nth(n))
479 }
480}
481
482impl DoubleEndedIterator for IntoIter {
483 fn next_back(&mut self) -> Option<Self::Item> {
484 loop {
485 if let Some(x) = and_then_or_clear(&mut self.back, DoubleEndedIterator::next_back) {
486 return Some(x);
487 }
488 match self.containers.next_back() {
489 Some(inner) => self.back = Some(inner.into_iter()),
490 None => return and_then_or_clear(&mut self.front, DoubleEndedIterator::next_back),
491 }
492 }
493 }
494
495 #[inline]
496 fn rfold<Acc, Fold>(mut self, mut init: Acc, mut fold: Fold) -> Acc
497 where
498 Fold: FnMut(Acc, Self::Item) -> Acc,
499 {
500 if let Some(iter) = &mut self.back {
501 init = iter.rfold(init, &mut fold);
502 }
503 init = self.containers.rfold(init, |acc, container| {
504 let iter = container.into_iter();
505 iter.rfold(acc, &mut fold)
506 });
507 if let Some(iter) = &mut self.front {
508 init = iter.rfold(init, &mut fold);
509 };
510 init
511 }
512
513 fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
514 let mut n = n;
515 let nth_advance = |it: &mut container::Iter| {
516 let len = it.len();
517 if n < len {
518 it.nth_back(n)
519 } else {
520 n -= len;
521 None
522 }
523 };
524 if let Some(x) = and_then_or_clear(&mut self.back, nth_advance) {
525 return Some(x);
526 }
527 for container in self.containers.by_ref().rev() {
528 let len = container.len() as usize;
529 if n < len {
530 let mut front_iter = container.into_iter();
531 let result = front_iter.nth_back(n);
532 self.back = Some(front_iter);
533 return result;
534 }
535 n -= len;
536 }
537 and_then_or_clear(&mut self.front, |it| it.nth_back(n))
538 }
539}
540
541#[cfg(target_pointer_width = "64")]
542impl ExactSizeIterator for IntoIter {}
543impl FusedIterator for IntoIter {}
544
545impl RoaringBitmap {
546 pub fn iter(&'_ self) -> Iter<'_> {
562 Iter::new(&self.containers)
563 }
564
565 pub fn range<R>(&self, range: R) -> Iter<'_>
595 where
596 R: RangeBounds<u32>,
597 {
598 let range = match util::convert_range_to_inclusive(range) {
599 Ok(range) => range,
600 Err(util::ConvertRangeError::Empty) => return Iter::empty(),
601 Err(util::ConvertRangeError::StartGreaterThanEnd) => {
602 panic!("range start is greater than range end")
603 }
604 Err(util::ConvertRangeError::StartAndEndEqualExcluded) => {
605 panic!("range start and end are equal and excluded")
606 }
607 };
608 let (start, end) = (*range.start(), *range.end());
609 let mut iter = self.iter();
610 if start != 0 {
611 iter.advance_to(start);
612 }
613 if end != u32::MAX {
614 iter.advance_back_to(end);
615 }
616 iter
617 }
618
619 pub fn into_range<R>(self, range: R) -> IntoIter
652 where
653 R: RangeBounds<u32>,
654 {
655 let range = match util::convert_range_to_inclusive(range) {
656 Ok(range) => range,
657 Err(util::ConvertRangeError::Empty) => return IntoIter::empty(),
658 Err(util::ConvertRangeError::StartGreaterThanEnd) => {
659 panic!("range start is greater than range end")
660 }
661 Err(util::ConvertRangeError::StartAndEndEqualExcluded) => {
662 panic!("range start and end are equal and excluded")
663 }
664 };
665 let (start, end) = (*range.start(), *range.end());
666 let mut iter = self.into_iter();
667 if start != 0 {
668 iter.advance_to(start);
669 }
670 if end != u32::MAX {
671 iter.advance_back_to(end);
672 }
673 iter
674 }
675}
676
677impl<'a> IntoIterator for &'a RoaringBitmap {
678 type Item = u32;
679 type IntoIter = Iter<'a>;
680
681 fn into_iter(self) -> Iter<'a> {
682 self.iter()
683 }
684}
685
686impl IntoIterator for RoaringBitmap {
687 type Item = u32;
688 type IntoIter = IntoIter;
689
690 fn into_iter(self) -> IntoIter {
691 IntoIter::new(self.containers)
692 }
693}
694
695impl<const N: usize> From<[u32; N]> for RoaringBitmap {
696 fn from(arr: [u32; N]) -> Self {
697 RoaringBitmap::from_iter(arr)
698 }
699}
700
701impl FromIterator<u32> for RoaringBitmap {
702 fn from_iter<I: IntoIterator<Item = u32>>(iterator: I) -> RoaringBitmap {
703 let mut rb = RoaringBitmap::new();
704 rb.extend(iterator);
705 rb
706 }
707}
708
709impl<'a> FromIterator<&'a u32> for RoaringBitmap {
710 fn from_iter<I: IntoIterator<Item = &'a u32>>(iterator: I) -> RoaringBitmap {
711 let mut rb = RoaringBitmap::new();
712 rb.extend(iterator);
713 rb
714 }
715}
716
717impl Extend<u32> for RoaringBitmap {
718 #[inline]
736 fn extend<I: IntoIterator<Item = u32>>(&mut self, values: I) {
737 let mut values = values.into_iter();
738 let value = match values.next() {
739 Some(value) => value,
740 None => return,
741 };
742
743 let (mut currenthb, lowbit) = util::split(value);
744 let mut current_container_index = self.find_container_by_key(currenthb);
745 let mut current_cont = &mut self.containers[current_container_index];
746 current_cont.insert(lowbit);
747
748 for val in values {
749 let (newhb, lowbit) = util::split(val);
750 if currenthb == newhb {
751 current_cont.insert(lowbit);
753 } else {
754 currenthb = newhb;
755 current_container_index = self.find_container_by_key(currenthb);
756 current_cont = &mut self.containers[current_container_index];
757 current_cont.insert(lowbit);
758 }
759 }
760 }
761}
762
763impl<'a> Extend<&'a u32> for RoaringBitmap {
764 #[inline]
782 fn extend<I: IntoIterator<Item = &'a u32>>(&mut self, values: I) {
783 self.extend(values.into_iter().copied());
784 }
785}
786
787impl RoaringBitmap {
788 pub fn from_sorted_iter<I: IntoIterator<Item = u32>>(
818 iterator: I,
819 ) -> Result<RoaringBitmap, NonSortedIntegers> {
820 let mut rb = RoaringBitmap::new();
821 rb.append(iterator).map(|_| rb)
822 }
823
824 pub fn append<I: IntoIterator<Item = u32>>(
844 &mut self,
845 iterator: I,
846 ) -> Result<u64, NonSortedIntegers> {
847 let mut iterator = iterator.into_iter();
849
850 let mut prev = match (iterator.next(), self.max()) {
851 (None, _) => return Ok(0),
852 (Some(first), Some(max)) if first <= max => {
853 return Err(NonSortedIntegers { valid_until: 0 })
854 }
855 (Some(first), _) => first,
856 };
857
858 self.push_unchecked(prev);
862
863 let mut count = 1;
864
865 for value in iterator {
866 if value <= prev {
867 return Err(NonSortedIntegers { valid_until: count });
868 } else {
869 self.push_unchecked(value);
870 prev = value;
871 count += 1;
872 }
873 }
874
875 Ok(count)
876 }
877}