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 next_range_impl<'a, It>(
96 front_iter: &mut Option<container::Iter<'a>>,
97 containers: &mut It,
98 back_iter: &mut Option<container::Iter<'a>>,
99) -> Option<core::ops::RangeInclusive<u32>>
100where
101 It: Iterator + Clone,
102 It: AsRef<[Container]>,
103 It::Item: IntoIterator<IntoIter = container::Iter<'a>>,
104{
105 let range = loop {
106 if let Some(r) = and_then_or_clear(front_iter, container::Iter::next_range) {
107 break r;
108 }
109 *front_iter = match containers.next() {
110 Some(inner) => Some(inner.into_iter()),
111 None => return and_then_or_clear(back_iter, container::Iter::next_range),
112 }
113 };
114 let (range_start, mut range_end) = (*range.start(), *range.end());
115 while range_end & 0xFFFF == 0xFFFF {
116 let Some(after_end) = range_end.checked_add(1) else {
117 return Some(range_start..=range_end);
118 };
119 let (next_key, _) = util::split(after_end);
120
121 if containers.as_ref().first().is_some_and(|c| c.key == next_key && c.contains(0)) {
122 let mut iter = containers.next().unwrap().into_iter();
123 let next_range = iter.next_range().unwrap();
124 *front_iter = Some(iter);
125 debug_assert_eq!(*next_range.start(), after_end);
126 range_end = *next_range.end();
127 } else {
128 if let Some(iter) = back_iter {
129 if iter.peek() == Some(after_end) {
130 let next_range = iter.next_range().unwrap();
131 debug_assert_eq!(*next_range.start(), after_end);
132 range_end = *next_range.end();
133 }
134 }
135 break;
136 }
137 }
138
139 Some(range_start..=range_end)
140}
141
142fn next_range_back_impl<'a, It>(
143 front_iter: &mut Option<container::Iter<'a>>,
144 containers: &mut It,
145 back_iter: &mut Option<container::Iter<'a>>,
146) -> Option<core::ops::RangeInclusive<u32>>
147where
148 It: DoubleEndedIterator,
149 It: AsRef<[Container]>,
150 It::Item: IntoIterator<IntoIter = container::Iter<'a>>,
151{
152 let range = loop {
153 if let Some(r) = and_then_or_clear(back_iter, container::Iter::next_range_back) {
154 break r;
155 }
156 *back_iter = match containers.next_back() {
157 Some(inner) => Some(inner.into_iter()),
158 None => return and_then_or_clear(front_iter, container::Iter::next_range_back),
159 }
160 };
161 let (mut range_start, range_end) = (*range.start(), *range.end());
162 while range_start & 0xFFFF == 0 {
163 let Some(before_start) = range_start.checked_sub(1) else {
164 return Some(range_start..=range_end);
165 };
166 let (prev_key, _) = util::split(before_start);
167
168 if containers.as_ref().last().is_some_and(|c| c.key == prev_key && c.contains(u16::MAX)) {
169 let mut iter = containers.next_back().unwrap().into_iter();
170 let next_range = iter.next_range_back().unwrap();
171 *back_iter = Some(iter);
172 debug_assert_eq!(*next_range.end(), before_start);
173 range_start = *next_range.start();
174 } else {
175 if let Some(iter) = front_iter {
176 if iter.key == prev_key && iter.peek_back() == Some(before_start) {
177 let next_range = iter.next_range_back().unwrap();
178 debug_assert_eq!(*next_range.end(), before_start);
179 range_start = *next_range.start();
180 }
181 }
182 break;
183 }
184 }
185
186 Some(range_start..=range_end)
187}
188
189fn advance_back_to_impl<'a, It>(
190 n: u32,
191 front_iter: &mut Option<container::Iter<'a>>,
192 containers: &mut It,
193 back_iter: &mut Option<container::Iter<'a>>,
194) where
195 It: DoubleEndedIterator,
196 It: AsRef<[Container]>,
197 It::Item: IntoIterator<IntoIter = container::Iter<'a>>,
198{
199 let (key, index) = util::split(n);
200 if let Some(iter) = back_iter {
201 match key.cmp(&iter.key) {
202 core::cmp::Ordering::Greater => return,
203 core::cmp::Ordering::Equal => {
204 iter.advance_back_to(index);
205 return;
206 }
207 core::cmp::Ordering::Less => {
208 *back_iter = None;
209 }
210 }
211 }
212 let containers_slice = containers.as_ref();
213 let containers_len = containers_slice.len();
214 let to_skip = match containers_slice.binary_search_by_key(&key, |c| c.key) {
215 Ok(n) => {
216 let n = containers_len - n - 1;
218 let container = containers.nth_back(n).expect("binary search returned a valid index");
219 let mut container_iter = container.into_iter();
220 container_iter.advance_back_to(index);
221 *back_iter = Some(container_iter);
222 return;
223 }
224 Err(n) => containers_len - n,
225 };
226
227 if let Some(n) = to_skip.checked_sub(1) {
228 containers.nth_back(n);
229 }
230 if to_skip != containers_len {
231 return;
234 }
235 if let Some(iter) = front_iter {
236 match key.cmp(&iter.key) {
237 core::cmp::Ordering::Greater => {}
238 core::cmp::Ordering::Equal => {
239 iter.advance_back_to(index);
240 }
241 core::cmp::Ordering::Less => {
242 *front_iter = None;
243 }
244 }
245 }
246}
247
248impl Iter<'_> {
249 fn new(containers: &'_ [Container]) -> Iter<'_> {
250 Iter { front: None, containers: containers.iter(), back: None }
251 }
252
253 fn empty() -> Self {
254 Self::new(&[])
255 }
256
257 pub fn advance_to(&mut self, n: u32) {
273 advance_to_impl(n, &mut self.front, &mut self.containers, &mut self.back);
274 }
275
276 pub fn advance_back_to(&mut self, n: u32) {
292 advance_back_to_impl(n, &mut self.front, &mut self.containers, &mut self.back);
293 }
294
295 pub fn next_range(&mut self) -> Option<core::ops::RangeInclusive<u32>> {
312 next_range_impl(&mut self.front, &mut self.containers, &mut self.back)
313 }
314
315 pub fn next_range_back(&mut self) -> Option<core::ops::RangeInclusive<u32>> {
332 next_range_back_impl(&mut self.front, &mut self.containers, &mut self.back)
333 }
334}
335
336impl IntoIter {
337 fn new(containers: Vec<Container>) -> IntoIter {
338 IntoIter { front: None, containers: containers.into_iter(), back: None }
339 }
340
341 fn empty() -> Self {
342 Self::new(Vec::new())
343 }
344
345 pub fn advance_to(&mut self, n: u32) {
361 advance_to_impl(n, &mut self.front, &mut self.containers, &mut self.back);
362 }
363
364 pub fn advance_back_to(&mut self, n: u32) {
380 advance_back_to_impl(n, &mut self.front, &mut self.containers, &mut self.back);
381 }
382
383 pub fn next_range(&mut self) -> Option<core::ops::RangeInclusive<u32>> {
400 next_range_impl(&mut self.front, &mut self.containers, &mut self.back)
401 }
402
403 pub fn next_range_back(&mut self) -> Option<core::ops::RangeInclusive<u32>> {
420 next_range_back_impl(&mut self.front, &mut self.containers, &mut self.back)
421 }
422}
423
424fn size_hint_impl(
425 front: &Option<container::Iter<'_>>,
426 containers: &impl AsRef<[Container]>,
427 back: &Option<container::Iter<'_>>,
428) -> (usize, Option<usize>) {
429 let first_size = front.as_ref().map_or(0, |it| it.len());
430 let last_size = back.as_ref().map_or(0, |it| it.len());
431 let mut size = first_size + last_size;
432 for container in containers.as_ref() {
433 match size.checked_add(container.len() as usize) {
434 Some(new_size) => size = new_size,
435 None => return (usize::MAX, None),
436 }
437 }
438 (size, Some(size))
439}
440
441impl Iterator for Iter<'_> {
442 type Item = u32;
443
444 fn next(&mut self) -> Option<u32> {
445 loop {
446 if let Some(x) = and_then_or_clear(&mut self.front, Iterator::next) {
447 return Some(x);
448 }
449 self.front = match self.containers.next() {
450 Some(inner) => Some(inner.into_iter()),
451 None => return and_then_or_clear(&mut self.back, Iterator::next),
452 }
453 }
454 }
455
456 fn size_hint(&self) -> (usize, Option<usize>) {
457 size_hint_impl(&self.front, &self.containers, &self.back)
458 }
459
460 #[inline]
461 fn fold<B, F>(mut self, mut init: B, mut f: F) -> B
462 where
463 Self: Sized,
464 F: FnMut(B, Self::Item) -> B,
465 {
466 if let Some(iter) = &mut self.front {
467 init = iter.fold(init, &mut f);
468 }
469 init = self.containers.fold(init, |acc, container| {
470 let iter = <&Container>::into_iter(container);
471 iter.fold(acc, &mut f)
472 });
473 if let Some(iter) = &mut self.back {
474 init = iter.fold(init, &mut f);
475 };
476 init
477 }
478
479 fn count(self) -> usize
480 where
481 Self: Sized,
482 {
483 let mut count = self.front.map_or(0, Iterator::count);
484 count += self.containers.map(|container| container.len() as usize).sum::<usize>();
485 count += self.back.map_or(0, Iterator::count);
486 count
487 }
488
489 fn nth(&mut self, n: usize) -> Option<Self::Item> {
490 let mut n = n;
491 let nth_advance = |it: &mut container::Iter| {
492 let len = it.len();
493 if n < len {
494 it.nth(n)
495 } else {
496 n -= len;
497 None
498 }
499 };
500 if let Some(x) = and_then_or_clear(&mut self.front, nth_advance) {
501 return Some(x);
502 }
503 for container in self.containers.by_ref() {
504 let len = container.len() as usize;
505 if n < len {
506 let mut front_iter = container.into_iter();
507 let result = front_iter.nth(n);
508 self.front = Some(front_iter);
509 return result;
510 }
511 n -= len;
512 }
513 and_then_or_clear(&mut self.back, |it| it.nth(n))
514 }
515}
516
517impl DoubleEndedIterator for Iter<'_> {
518 fn next_back(&mut self) -> Option<Self::Item> {
519 loop {
520 if let Some(x) = and_then_or_clear(&mut self.back, DoubleEndedIterator::next_back) {
521 return Some(x);
522 }
523 self.back = match self.containers.next_back() {
524 Some(inner) => Some(inner.into_iter()),
525 None => return and_then_or_clear(&mut self.front, DoubleEndedIterator::next_back),
526 }
527 }
528 }
529
530 #[inline]
531 fn rfold<Acc, Fold>(mut self, mut init: Acc, mut fold: Fold) -> Acc
532 where
533 Fold: FnMut(Acc, Self::Item) -> Acc,
534 {
535 if let Some(iter) = &mut self.back {
536 init = iter.rfold(init, &mut fold);
537 }
538 init = self.containers.rfold(init, |acc, container| {
539 let iter = container.into_iter();
540 iter.rfold(acc, &mut fold)
541 });
542 if let Some(iter) = &mut self.front {
543 init = iter.rfold(init, &mut fold);
544 };
545 init
546 }
547
548 fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
549 let mut n = n;
550 let nth_advance = |it: &mut container::Iter| {
551 let len = it.len();
552 if n < len {
553 it.nth_back(n)
554 } else {
555 n -= len;
556 None
557 }
558 };
559 if let Some(x) = and_then_or_clear(&mut self.back, nth_advance) {
560 return Some(x);
561 }
562 for container in self.containers.by_ref().rev() {
563 let len = container.len() as usize;
564 if n < len {
565 let mut front_iter = container.into_iter();
566 let result = front_iter.nth_back(n);
567 self.back = Some(front_iter);
568 return result;
569 }
570 n -= len;
571 }
572 and_then_or_clear(&mut self.front, |it| it.nth_back(n))
573 }
574}
575
576#[cfg(target_pointer_width = "64")]
577impl ExactSizeIterator for Iter<'_> {}
578impl FusedIterator for Iter<'_> {}
579
580impl Iterator for IntoIter {
581 type Item = u32;
582
583 fn next(&mut self) -> Option<u32> {
584 loop {
585 if let Some(x) = and_then_or_clear(&mut self.front, Iterator::next) {
586 return Some(x);
587 }
588 match self.containers.next() {
589 Some(inner) => self.front = Some(inner.into_iter()),
590 None => return and_then_or_clear(&mut self.back, Iterator::next),
591 }
592 }
593 }
594
595 fn size_hint(&self) -> (usize, Option<usize>) {
596 size_hint_impl(&self.front, &self.containers, &self.back)
597 }
598
599 #[inline]
600 fn fold<B, F>(mut self, mut init: B, mut f: F) -> B
601 where
602 Self: Sized,
603 F: FnMut(B, Self::Item) -> B,
604 {
605 if let Some(iter) = &mut self.front {
606 init = iter.fold(init, &mut f);
607 }
608 init = self.containers.fold(init, |acc, container| {
609 let iter = <Container>::into_iter(container);
610 iter.fold(acc, &mut f)
611 });
612 if let Some(iter) = &mut self.back {
613 init = iter.fold(init, &mut f);
614 };
615 init
616 }
617
618 fn count(self) -> usize
619 where
620 Self: Sized,
621 {
622 let mut count = self.front.map_or(0, Iterator::count);
623 count += self.containers.map(|container| container.len() as usize).sum::<usize>();
624 count += self.back.map_or(0, Iterator::count);
625 count
626 }
627
628 fn nth(&mut self, n: usize) -> Option<Self::Item> {
629 let mut n = n;
630 let nth_advance = |it: &mut container::Iter| {
631 let len = it.len();
632 if n < len {
633 it.nth(n)
634 } else {
635 n -= len;
636 None
637 }
638 };
639 if let Some(x) = and_then_or_clear(&mut self.front, nth_advance) {
640 return Some(x);
641 }
642 for container in self.containers.by_ref() {
643 let len = container.len() as usize;
644 if n < len {
645 let mut front_iter = container.into_iter();
646 let result = front_iter.nth(n);
647 self.front = Some(front_iter);
648 return result;
649 }
650 n -= len;
651 }
652 and_then_or_clear(&mut self.back, |it| it.nth(n))
653 }
654}
655
656impl DoubleEndedIterator for IntoIter {
657 fn next_back(&mut self) -> Option<Self::Item> {
658 loop {
659 if let Some(x) = and_then_or_clear(&mut self.back, DoubleEndedIterator::next_back) {
660 return Some(x);
661 }
662 match self.containers.next_back() {
663 Some(inner) => self.back = Some(inner.into_iter()),
664 None => return and_then_or_clear(&mut self.front, DoubleEndedIterator::next_back),
665 }
666 }
667 }
668
669 #[inline]
670 fn rfold<Acc, Fold>(mut self, mut init: Acc, mut fold: Fold) -> Acc
671 where
672 Fold: FnMut(Acc, Self::Item) -> Acc,
673 {
674 if let Some(iter) = &mut self.back {
675 init = iter.rfold(init, &mut fold);
676 }
677 init = self.containers.rfold(init, |acc, container| {
678 let iter = container.into_iter();
679 iter.rfold(acc, &mut fold)
680 });
681 if let Some(iter) = &mut self.front {
682 init = iter.rfold(init, &mut fold);
683 };
684 init
685 }
686
687 fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
688 let mut n = n;
689 let nth_advance = |it: &mut container::Iter| {
690 let len = it.len();
691 if n < len {
692 it.nth_back(n)
693 } else {
694 n -= len;
695 None
696 }
697 };
698 if let Some(x) = and_then_or_clear(&mut self.back, nth_advance) {
699 return Some(x);
700 }
701 for container in self.containers.by_ref().rev() {
702 let len = container.len() as usize;
703 if n < len {
704 let mut front_iter = container.into_iter();
705 let result = front_iter.nth_back(n);
706 self.back = Some(front_iter);
707 return result;
708 }
709 n -= len;
710 }
711 and_then_or_clear(&mut self.front, |it| it.nth_back(n))
712 }
713}
714
715#[cfg(target_pointer_width = "64")]
716impl ExactSizeIterator for IntoIter {}
717impl FusedIterator for IntoIter {}
718
719impl RoaringBitmap {
720 pub fn iter(&'_ self) -> Iter<'_> {
736 Iter::new(&self.containers)
737 }
738
739 pub fn range<R>(&self, range: R) -> Iter<'_>
769 where
770 R: RangeBounds<u32>,
771 {
772 let range = match util::convert_range_to_inclusive(range) {
773 Ok(range) => range,
774 Err(util::ConvertRangeError::Empty) => return Iter::empty(),
775 Err(util::ConvertRangeError::StartGreaterThanEnd) => {
776 panic!("range start is greater than range end")
777 }
778 Err(util::ConvertRangeError::StartAndEndEqualExcluded) => {
779 panic!("range start and end are equal and excluded")
780 }
781 };
782 let (start, end) = (*range.start(), *range.end());
783 let mut iter = self.iter();
784 if start != 0 {
785 iter.advance_to(start);
786 }
787 if end != u32::MAX {
788 iter.advance_back_to(end);
789 }
790 iter
791 }
792
793 pub fn into_range<R>(self, range: R) -> IntoIter
826 where
827 R: RangeBounds<u32>,
828 {
829 let range = match util::convert_range_to_inclusive(range) {
830 Ok(range) => range,
831 Err(util::ConvertRangeError::Empty) => return IntoIter::empty(),
832 Err(util::ConvertRangeError::StartGreaterThanEnd) => {
833 panic!("range start is greater than range end")
834 }
835 Err(util::ConvertRangeError::StartAndEndEqualExcluded) => {
836 panic!("range start and end are equal and excluded")
837 }
838 };
839 let (start, end) = (*range.start(), *range.end());
840 let mut iter = self.into_iter();
841 if start != 0 {
842 iter.advance_to(start);
843 }
844 if end != u32::MAX {
845 iter.advance_back_to(end);
846 }
847 iter
848 }
849}
850
851impl<'a> IntoIterator for &'a RoaringBitmap {
852 type Item = u32;
853 type IntoIter = Iter<'a>;
854
855 fn into_iter(self) -> Iter<'a> {
856 self.iter()
857 }
858}
859
860impl IntoIterator for RoaringBitmap {
861 type Item = u32;
862 type IntoIter = IntoIter;
863
864 fn into_iter(self) -> IntoIter {
865 IntoIter::new(self.containers)
866 }
867}
868
869impl<const N: usize> From<[u32; N]> for RoaringBitmap {
870 fn from(arr: [u32; N]) -> Self {
871 RoaringBitmap::from_iter(arr)
872 }
873}
874
875impl FromIterator<u32> for RoaringBitmap {
876 fn from_iter<I: IntoIterator<Item = u32>>(iterator: I) -> RoaringBitmap {
877 let mut rb = RoaringBitmap::new();
878 rb.extend(iterator);
879 rb
880 }
881}
882
883impl<'a> FromIterator<&'a u32> for RoaringBitmap {
884 fn from_iter<I: IntoIterator<Item = &'a u32>>(iterator: I) -> RoaringBitmap {
885 let mut rb = RoaringBitmap::new();
886 rb.extend(iterator);
887 rb
888 }
889}
890
891impl Extend<u32> for RoaringBitmap {
892 #[inline]
910 fn extend<I: IntoIterator<Item = u32>>(&mut self, values: I) {
911 let mut values = values.into_iter();
912 let value = match values.next() {
913 Some(value) => value,
914 None => return,
915 };
916
917 let (mut currenthb, lowbit) = util::split(value);
918 let mut current_container_index = self.find_container_by_key(currenthb);
919 let mut current_cont = &mut self.containers[current_container_index];
920 current_cont.insert(lowbit);
921
922 for val in values {
923 let (newhb, lowbit) = util::split(val);
924 if currenthb == newhb {
925 current_cont.insert(lowbit);
927 } else {
928 currenthb = newhb;
929 current_container_index = self.find_container_by_key(currenthb);
930 current_cont = &mut self.containers[current_container_index];
931 current_cont.insert(lowbit);
932 }
933 }
934 }
935}
936
937impl<'a> Extend<&'a u32> for RoaringBitmap {
938 #[inline]
956 fn extend<I: IntoIterator<Item = &'a u32>>(&mut self, values: I) {
957 self.extend(values.into_iter().copied());
958 }
959}
960
961impl RoaringBitmap {
962 pub fn from_sorted_iter<I: IntoIterator<Item = u32>>(
992 iterator: I,
993 ) -> Result<RoaringBitmap, NonSortedIntegers> {
994 let mut rb = RoaringBitmap::new();
995 rb.append(iterator).map(|_| rb)
996 }
997
998 pub fn append<I: IntoIterator<Item = u32>>(
1018 &mut self,
1019 iterator: I,
1020 ) -> Result<u64, NonSortedIntegers> {
1021 let mut iterator = iterator.into_iter();
1023
1024 let mut prev = match (iterator.next(), self.max()) {
1025 (None, _) => return Ok(0),
1026 (Some(first), Some(max)) if first <= max => {
1027 return Err(NonSortedIntegers { valid_until: 0 })
1028 }
1029 (Some(first), _) => first,
1030 };
1031
1032 self.push_unchecked(prev);
1036
1037 let mut count = 1;
1038
1039 for value in iterator {
1040 if value <= prev {
1041 return Err(NonSortedIntegers { valid_until: count });
1042 } else {
1043 self.push_unchecked(value);
1044 prev = value;
1045 count += 1;
1046 }
1047 }
1048
1049 Ok(count)
1050 }
1051}