1use super::bitpage::BitPage;
19use super::bitpage::RangeIter;
20use super::bitpage::PAGE_BITS;
21use alloc::vec::Vec;
22use core::sync::atomic::AtomicUsize;
23use std::cmp::Ordering;
24use std::hash::Hash;
25use std::ops::RangeInclusive;
26
27const PAGE_BITS_LOG_2: u32 = PAGE_BITS.ilog2();
29
30#[derive(Debug)]
34#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
35pub struct U32Set {
36 pages: Vec<BitPage>,
38 page_map: Vec<PageInfo>,
39 length: u64,
40
41 #[cfg_attr(feature = "serde", serde(skip))]
42 #[cfg_attr(feature = "serde", serde(default = "default_last_page_map_index"))]
43 last_page_map_index: AtomicUsize,
44}
45
46const fn default_last_page_map_index() -> AtomicUsize {
47 AtomicUsize::new(usize::MAX)
48}
49
50impl Default for U32Set {
51 fn default() -> Self {
52 Self {
53 pages: Default::default(),
54 page_map: Default::default(),
55 length: Default::default(),
56 last_page_map_index: default_last_page_map_index(),
57 }
58 }
59}
60
61impl Clone for U32Set {
62 fn clone(&self) -> Self {
63 Self {
64 pages: self.pages.clone(),
65 page_map: self.page_map.clone(),
66 length: self.length,
67 last_page_map_index: default_last_page_map_index(),
70 }
71 }
72}
73
74impl FromIterator<u32> for U32Set {
75 fn from_iter<I: IntoIterator<Item = u32>>(iter: I) -> Self {
76 let mut s = U32Set::empty();
77 s.extend(iter);
78 s
79 }
80}
81
82impl U32Set {
83 #[inline]
87 pub fn insert(&mut self, val: u32) -> bool {
88 let page = self.ensure_page_for_mut(val);
89 let ret = page.insert(val);
90 self.length += ret as u64;
91 ret
92 }
93
94 pub fn insert_range(&mut self, range: RangeInclusive<u32>) {
96 let start = *range.start();
97 let end = *range.end();
98 if start > end {
99 return;
100 }
101
102 let major_start = Self::get_major_value(start);
103 let major_end = Self::get_major_value(end);
104
105 let mut total_added = 0;
106
107 for major in major_start..=major_end {
108 let page_start = start.max(Self::major_start(major));
109 let page_end = end.min(Self::major_start(major) + (PAGE_BITS - 1));
110 let page = self.ensure_page_for_major_mut(major);
111 let pre_len = page.len();
112 page.insert_range(page_start, page_end);
113 let delta_len = page.len() - pre_len;
114 total_added += delta_len as u64;
115 }
116 self.length += total_added;
117 }
118
119 #[inline]
124 pub fn extend_unsorted<U: IntoIterator<Item = u32>>(&mut self, iter: U) {
125 let mut last_major_value = u32::MAX;
131 let mut last_page_index = usize::MAX;
132 let mut added = 0u64;
133 for val in iter {
134 let major_value = Self::get_major_value(val);
135 if major_value != last_major_value {
136 last_page_index = self.ensure_page_index_for_major(major_value);
137 last_major_value = major_value;
138 }
139 if let Some(page) = self.pages.get_mut(last_page_index) {
140 added += page.insert(val) as u64;
141 }
142 }
143 self.length += added;
144 }
145
146 pub fn remove(&mut self, val: u32) -> bool {
150 let maybe_page = self.page_for_mut(val);
151 if let Some(page) = maybe_page {
152 let ret = page.remove(val);
153 self.length -= ret as u64;
154 ret
155 } else {
156 false
157 }
158 }
159
160 pub fn remove_all<U: IntoIterator<Item = u32>>(&mut self, iter: U) {
162 let mut last_page_index: Option<usize> = None;
163 let mut last_major_value = u32::MAX;
164 let mut total_removed = 0;
165 for val in iter {
166 let major_value = Self::get_major_value(val);
167 if major_value != last_major_value {
168 last_page_index = self.page_index_for_major(major_value);
169 last_major_value = major_value;
170 };
171
172 let Some(page_index) = last_page_index else {
173 continue;
174 };
175
176 if let Some(page) = self.pages.get_mut(page_index) {
177 total_removed += page.remove(val) as u64;
178 }
179 }
180 self.length -= total_removed;
181 }
182
183 pub fn remove_range(&mut self, range: RangeInclusive<u32>) {
185 let start = *(range.start());
186 let end = *(range.end());
187 if start > end {
188 return;
189 }
190
191 let start_major = Self::get_major_value(start);
192 let end_major = Self::get_major_value(end);
193 let mut info_index = match self
194 .page_map
195 .binary_search_by(|probe| probe.major_value.cmp(&start_major))
196 {
197 Ok(info_index) => info_index,
198 Err(info_index) => info_index,
199 };
200
201 loop {
202 let Some(info) = self.page_map.get(info_index) else {
203 break;
204 };
205 let Some(page) = self.pages.get_mut(info.index as usize) else {
206 break;
207 };
208
209 if info.major_value > end_major {
210 break;
211 } else if info.major_value == start_major {
212 page.remove_range(start, Self::major_end(start_major).min(end));
213 } else if info.major_value == end_major {
214 page.remove_range(Self::major_start(end_major), end);
215 break;
216 } else {
217 page.clear();
218 }
219 info_index += 1;
220 }
221
222 self.recompute_length();
223 }
224
225 pub fn contains(&self, val: u32) -> bool {
227 let new_major = U32Set::get_major_value(val);
228
229 let lookup_result = self
230 .page_map
231 .get(
232 self.last_page_map_index
233 .load(std::sync::atomic::Ordering::Relaxed),
234 )
235 .filter(|info| info.major_value == new_major)
236 .map(|info| Some(info.index as usize))
237 .unwrap_or(None);
238
239 let page_index = match lookup_result {
240 None => {
241 let Some(page_map_index) = self.page_map_index_for_major(new_major) else {
243 return false;
245 };
246
247 self.last_page_map_index
248 .store(page_map_index, std::sync::atomic::Ordering::Relaxed);
249 self.page_map[page_map_index].index as usize
250 }
251 Some(page_index) => page_index,
252 };
253
254 self.pages
255 .get(page_index)
256 .map(|page| page.contains(val))
257 .unwrap_or(false)
258 }
259
260 pub fn intersects_set(&self, other: &U32Set) -> bool {
261 let mut it_a = self.page_map.iter().peekable();
262 let mut it_b = other.page_map.iter().peekable();
263
264 while let (Some(a), Some(b)) = (it_a.peek(), it_b.peek()) {
265 match a.major_value.cmp(&b.major_value) {
266 Ordering::Equal => {
267 if self.pages[a.index as usize].intersects_set(&other.pages[b.index as usize]) {
268 return true;
269 }
270 it_a.next();
271 it_b.next();
272 }
273 Ordering::Less => {
274 it_a.next();
275 }
276 Ordering::Greater => {
277 it_b.next();
278 }
279 }
280 }
281
282 false
283 }
284
285 pub fn is_subset(&self, other: &U32Set) -> bool {
287 if self.len() > other.len() {
288 return false;
289 }
290 let mut it_b = other.page_map.iter().peekable();
291
292 for a_info in self.page_map.iter() {
293 let page_a = &self.pages[a_info.index as usize];
294 if page_a.is_empty() {
295 continue;
296 }
297
298 while let Some(b_info) = it_b.peek() {
299 if b_info.major_value < a_info.major_value {
300 it_b.next();
301 } else {
302 break;
303 }
304 }
305
306 match it_b.peek() {
307 Some(b_info) if b_info.major_value == a_info.major_value => {
308 let page_b = &other.pages[b_info.index as usize];
309 if !page_a.is_subset(page_b) {
310 return false;
311 }
312 it_b.next();
313 }
314 _ => return false,
315 }
316 }
317
318 true
319 }
320
321 pub fn intersection_len(&self, other: &U32Set) -> u64 {
323 let mut it_a = self.page_map.iter().peekable();
324 let mut it_b = other.page_map.iter().peekable();
325 let mut count = 0u64;
326
327 while let (Some(a), Some(b)) = (it_a.peek(), it_b.peek()) {
328 match a.major_value.cmp(&b.major_value) {
329 Ordering::Equal => {
330 count += self.pages[a.index as usize]
331 .intersection_len(&other.pages[b.index as usize])
332 as u64;
333 it_a.next();
334 it_b.next();
335 }
336 Ordering::Less => {
337 it_a.next();
338 }
339 Ordering::Greater => {
340 it_b.next();
341 }
342 }
343 }
344
345 count
346 }
347
348 pub const fn empty() -> U32Set {
349 U32Set {
350 pages: Vec::new(),
351 page_map: Vec::new(),
352 length: 0,
353 last_page_map_index: default_last_page_map_index(),
354 }
355 }
356
357 pub fn clear(&mut self) {
359 self.pages.clear();
360 self.page_map.clear();
361 self.length = 0;
362 }
363
364 pub fn is_empty(&self) -> bool {
366 self.len() == 0
367 }
368
369 fn recompute_length(&mut self) {
370 self.length = self.pages.iter().map(|page| page.len() as u64).sum();
371 }
372
373 pub fn len(&self) -> u64 {
375 self.length
376 }
377
378 pub(crate) fn num_pages(&self) -> usize {
379 self.pages.len()
380 }
381
382 pub fn union(&mut self, other: &U32Set) {
384 self.process(BitPage::union, other);
385 }
386
387 pub fn intersect(&mut self, other: &U32Set) {
389 self.process(BitPage::intersect, other);
390 }
391
392 pub fn subtract(&mut self, other: &U32Set) {
394 self.process(BitPage::subtract, other);
395 }
396
397 pub fn reversed_subtract(&mut self, other: &U32Set) {
399 self.process(|a, b| BitPage::subtract(b, a), other);
400 }
401
402 pub fn iter(&self) -> impl DoubleEndedIterator<Item = u32> + '_ {
404 self.iter_non_empty_pages().flat_map(|(major, page)| {
405 let base = Self::major_start(major);
406 page.iter().map(move |v| base + v)
407 })
408 }
409
410 pub fn iter_from(&self, value: u32) -> impl Iterator<Item = u32> + '_ {
414 let major_value = Self::get_major_value(value);
415 let result = self
416 .page_map
417 .binary_search_by(|probe| probe.major_value.cmp(&major_value));
418
419 let (page_map_index, partial_first_page) = match result {
420 Ok(page_map_index) => (page_map_index, true),
421 Err(page_map_index) => (page_map_index, false),
422 };
423
424 let page = self
425 .page_map
426 .get(page_map_index)
427 .and_then(move |page_info| {
428 self.pages
429 .get(page_info.index as usize)
430 .map(|page| (page, page_info.major_value))
431 });
432
433 let init_it =
434 page.filter(|_| partial_first_page)
435 .into_iter()
436 .flat_map(move |(page, major)| {
437 let base = Self::major_start(major);
438 page.iter_from(value).map(move |v| base + v)
439 });
440
441 let follow_on_page_map_index = if partial_first_page {
442 page_map_index + 1
443 } else {
444 page_map_index
445 };
446
447 let follow_on_it = self.page_map[follow_on_page_map_index..]
448 .iter()
449 .flat_map(|info| {
450 self.pages
451 .get(info.index as usize)
452 .map(|page| (info.major_value, page))
453 })
454 .filter(|(_, page)| !page.is_empty())
455 .flat_map(|(major, page)| {
456 let base = Self::major_start(major);
457 page.iter().map(move |v| base + v)
458 });
459
460 init_it.chain(follow_on_it)
461 }
462
463 pub fn iter_ranges(&self) -> impl Iterator<Item = RangeInclusive<u32>> + '_ {
465 U32SetRangeIter::new(self)
466 }
467
468 fn iter_pages(&self) -> impl DoubleEndedIterator<Item = (u32, &BitPage)> + '_ {
469 self.page_map.iter().flat_map(|info| {
470 self.pages
471 .get(info.index as usize)
472 .map(|page| (info.major_value, page))
473 })
474 }
475
476 fn iter_non_empty_pages(&self) -> impl DoubleEndedIterator<Item = (u32, &BitPage)> + '_ {
477 self.iter_pages().filter(|(_, page)| !page.is_empty())
478 }
479
480 fn passthrough_behavior<Op>(op: &Op) -> (bool, bool)
486 where
487 Op: Fn(&BitPage, &BitPage) -> BitPage,
488 {
489 let mut one: BitPage = BitPage::new_zeroes();
490 one.insert(0);
491 let zero: BitPage = BitPage::new_zeroes();
492
493 let passthrough_left: bool = op(&one, &zero).contains(0);
494 let passthrough_right: bool = op(&zero, &one).contains(0);
495
496 (passthrough_left, passthrough_right)
497 }
498
499 fn process<Op>(&mut self, op: Op, other: &U32Set)
500 where
501 Op: Fn(&BitPage, &BitPage) -> BitPage,
502 {
503 let (passthrough_left, passthrough_right) = U32Set::passthrough_behavior(&op);
504
505 let mut len_a = self.pages.len();
506 let len_b = other.pages.len();
507 let mut idx_a = 0;
508 let mut idx_b = 0;
509 let mut count = 0;
510 let mut write_idx = 0;
511
512 while idx_a < len_a && idx_b < len_b {
515 let a_major = self.page_map[idx_a].major_value;
516 let b_major = other.page_map[idx_b].major_value;
517
518 match a_major.cmp(&b_major) {
519 Ordering::Equal => {
520 if !passthrough_left {
521 if write_idx < idx_a {
528 self.page_map[write_idx] = self.page_map[idx_a];
529 }
530 write_idx += 1;
531 }
532
533 count += 1;
534 idx_a += 1;
535 idx_b += 1;
536 }
537 Ordering::Less => {
538 if passthrough_left {
539 count += 1;
540 }
541 idx_a += 1;
542 }
543 Ordering::Greater => {
544 if passthrough_right {
545 count += 1;
546 }
547 idx_b += 1;
548 }
549 }
550 }
551
552 if passthrough_left {
553 count += len_a - idx_a;
554 }
555
556 if passthrough_right {
557 count += len_b - idx_b;
558 }
559
560 let mut next_page = len_a;
562 if !passthrough_left {
563 len_a = write_idx;
564 next_page = write_idx;
565 self.compact(write_idx);
566 }
567
568 self.resize(count);
569 let new_count = count;
570
571 idx_a = len_a;
573 idx_b = len_b;
574 while idx_a > 0 && idx_b > 0 {
575 match self.page_map[idx_a - 1]
576 .major_value
577 .cmp(&other.page_map[idx_b - 1].major_value)
578 {
579 Ordering::Equal => {
580 idx_a -= 1;
581 idx_b -= 1;
582 count -= 1;
583 self.page_map[count] = self.page_map[idx_a];
584 *self.page_for_index_mut(count).unwrap() = op(
585 self.page_for_index(idx_a).unwrap(),
586 other.page_for_index(idx_b).unwrap(),
587 );
588 }
589 Ordering::Greater => {
590 idx_a -= 1;
591 if passthrough_left {
592 count -= 1;
593 self.page_map[count] = self.page_map[idx_a];
594 }
595 }
596 Ordering::Less => {
597 idx_b -= 1;
598 if passthrough_right {
599 count -= 1;
600 self.page_map[count].major_value = other.page_map[idx_b].major_value;
601 self.page_map[count].index = next_page as u32;
602 next_page += 1;
603 *self.page_for_index_mut(count).unwrap() =
604 other.page_for_index(idx_b).unwrap().clone();
605 }
606 }
607 }
608 }
609
610 if passthrough_left {
613 while idx_a > 0 {
614 idx_a -= 1;
615 count -= 1;
616 self.page_map[count] = self.page_map[idx_a];
617 }
618 }
619
620 if passthrough_right {
621 while idx_b > 0 {
622 idx_b -= 1;
623 count -= 1;
624 self.page_map[count].major_value = other.page_map[idx_b].major_value;
625 self.page_map[count].index = next_page as u32;
626 next_page += 1;
627 *self.page_for_index_mut(count).unwrap() =
628 other.page_for_index(idx_b).unwrap().clone();
629 }
630 }
631
632 self.resize(new_count);
633 self.recompute_length();
634 }
635
636 fn compact(&mut self, new_len: usize) {
637 let mut old_index_to_page_map_index = Vec::<usize>::with_capacity(self.pages.len());
638 old_index_to_page_map_index.resize(self.pages.len(), usize::MAX);
639
640 for i in 0usize..new_len {
641 old_index_to_page_map_index[self.page_map[i].index as usize] = i;
642 }
643
644 self.compact_pages(old_index_to_page_map_index);
645 }
646
647 fn compact_pages(&mut self, old_index_to_page_map_index: Vec<usize>) {
648 let mut write_index = 0;
649 for (i, page_map_index) in old_index_to_page_map_index
650 .iter()
651 .enumerate()
652 .take(self.pages.len())
653 {
654 if *page_map_index == usize::MAX {
655 continue;
656 }
657
658 if write_index < i {
659 self.pages[write_index] = self.pages[i].clone();
660 }
661
662 self.page_map[*page_map_index].index = write_index as u32;
663 write_index += 1;
664 }
665 }
666
667 fn resize(&mut self, new_len: usize) {
668 self.page_map.resize(
669 new_len,
670 PageInfo {
671 major_value: 0,
672 index: 0,
673 },
674 );
675 self.pages.resize(new_len, BitPage::new_zeroes());
676 }
677
678 const fn get_major_value(value: u32) -> u32 {
680 value >> PAGE_BITS_LOG_2
681 }
682
683 const fn major_start(major: u32) -> u32 {
684 major << PAGE_BITS_LOG_2
685 }
686
687 const fn major_end(major: u32) -> u32 {
688 Self::major_start(major) + (PAGE_BITS - 1)
690 }
691
692 fn page_index_for_major(&self, major_value: u32) -> Option<usize> {
694 self.page_map_index_for_major(major_value)
695 .map(|info_idx| self.page_map[info_idx].index as usize)
696 }
697
698 fn page_map_index_for_major(&self, major_value: u32) -> Option<usize> {
699 self.page_map
700 .binary_search_by(|probe| probe.major_value.cmp(&major_value))
701 .ok()
702 }
703
704 #[inline(always)]
707 fn ensure_page_index_for_major(&mut self, major_value: u32) -> usize {
708 match self
709 .page_map
710 .binary_search_by(|probe| probe.major_value.cmp(&major_value))
711 {
712 Ok(map_index) => self.page_map[map_index].index as usize,
713 Err(map_index_to_insert) => {
714 self.insert_page_for_major(map_index_to_insert, major_value)
715 }
716 }
717 }
718
719 #[cold]
723 #[inline(never)]
724 fn insert_page_for_major(&mut self, map_index_to_insert: usize, major_value: u32) -> usize {
725 let page_index = self.pages.len();
726 self.pages.push(BitPage::new_zeroes());
727 let new_info = PageInfo {
728 index: page_index as u32,
729 major_value,
730 };
731 self.page_map.insert(map_index_to_insert, new_info);
732 page_index
733 }
734
735 fn page_for_mut(&mut self, value: u32) -> Option<&mut BitPage> {
739 let major_value = Self::get_major_value(value);
740 self.page_for_major_mut(major_value)
741 }
742
743 fn page_for_major_mut(&mut self, major_value: u32) -> Option<&mut BitPage> {
745 let page_index = self.page_index_for_major(major_value)?;
746 self.pages.get_mut(page_index)
747 }
748
749 #[inline(always)]
753 fn ensure_page_for_mut(&mut self, value: u32) -> &mut BitPage {
754 self.ensure_page_for_major_mut(Self::get_major_value(value))
755 }
756
757 #[inline(always)]
760 fn ensure_page_for_major_mut(&mut self, major_value: u32) -> &mut BitPage {
761 let page_index = self.ensure_page_index_for_major(major_value);
762 self.pages.get_mut(page_index).unwrap()
763 }
764
765 fn page_for_index_mut(&mut self, index: usize) -> Option<&mut BitPage> {
767 self.page_map
768 .get(index)
769 .and_then(|info| self.pages.get_mut(info.index as usize))
770 }
771
772 fn page_for_index(&self, index: usize) -> Option<&BitPage> {
773 self.page_map
774 .get(index)
775 .and_then(|info| self.pages.get(info.index as usize))
776 }
777}
778
779impl Extend<u32> for U32Set {
780 fn extend<U: IntoIterator<Item = u32>>(&mut self, iter: U) {
781 let mut builder = U32SetBuilder::start(self);
782 for val in iter {
783 builder.insert(val);
784 }
785 builder.finish();
786 }
787}
788
789pub(crate) struct U32SetBuilder<'a> {
794 pub(crate) set: &'a mut U32Set,
795 last_page_index: usize,
796 last_major_value: u32,
797}
798
799impl<'a> U32SetBuilder<'a> {
800 pub(crate) fn start(set: &'a mut U32Set) -> Self {
801 Self {
802 set,
803 last_page_index: usize::MAX,
804 last_major_value: u32::MAX,
805 }
806 }
807
808 pub(crate) fn insert(&mut self, val: u32) {
809 let major_value = U32Set::get_major_value(val);
813 if major_value != self.last_major_value {
814 self.last_page_index = self.set.ensure_page_index_for_major(major_value);
815 self.last_major_value = major_value;
816 };
817 if let Some(page) = self.set.pages.get_mut(self.last_page_index) {
818 self.set.length += page.insert(val) as u64;
819 }
820 }
821
822 pub(crate) fn finish(self) {
823 }
826}
827
828#[derive(Clone, Copy, Debug, PartialEq, Eq)]
829#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
830struct PageInfo {
831 index: u32,
833 major_value: u32,
835}
836
837impl Hash for U32Set {
838 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
839 self.iter_non_empty_pages().for_each(|t| t.hash(state));
840 }
841}
842
843impl std::cmp::PartialEq for U32Set {
844 fn eq(&self, other: &Self) -> bool {
845 let mut this = self.iter_non_empty_pages();
846 let mut other = other.iter_non_empty_pages();
847
848 loop {
851 match (this.next(), other.next()) {
852 (Some(a), Some(b)) if a == b => continue,
853 (None, None) => return true,
854 _ => return false,
855 }
856 }
857 }
858}
859
860impl std::cmp::Eq for U32Set {}
861
862impl std::cmp::PartialOrd for U32Set {
863 fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
864 Some(self.cmp(other))
865 }
866}
867
868impl std::cmp::Ord for U32Set {
869 fn cmp(&self, other: &Self) -> core::cmp::Ordering {
870 let this_it = self.iter();
871 let other_it = other.iter();
872
873 for (us, them) in this_it.zip(other_it) {
874 match us.cmp(&them) {
875 core::cmp::Ordering::Equal => continue,
876 other => return other,
877 }
878 }
879
880 self.len().cmp(&other.len())
882 }
883}
884
885struct U32SetRangeIter<'a> {
886 set: &'a U32Set,
887 page_info_index: usize,
888 page_iter: Option<RangeIter<'a>>,
889}
890
891impl<'a> U32SetRangeIter<'a> {
892 fn new(set: &'a U32Set) -> U32SetRangeIter<'a> {
893 U32SetRangeIter {
894 set,
895 page_info_index: 0,
896 page_iter: U32SetRangeIter::<'a>::page_iter(set, 0),
897 }
898 }
899
900 fn move_to_next_page(&mut self) -> bool {
901 self.page_info_index += 1;
902 self.reset_page_iter();
903 self.page_iter.is_some()
904 }
905
906 fn reset_page_iter(&mut self) {
907 self.page_iter = U32SetRangeIter::<'a>::page_iter(self.set, self.page_info_index);
908 }
909
910 fn page_iter(set: &'a U32Set, page_info_index: usize) -> Option<RangeIter<'a>> {
911 set.page_map
912 .get(page_info_index)
913 .map(|pi| pi.index as usize)
914 .and_then(|index| set.pages.get(index))
915 .map(|p| p.iter_ranges())
916 }
917
918 fn next_range(&mut self) -> Option<RangeInclusive<u32>> {
919 let page = self.set.page_map.get(self.page_info_index)?;
921 let page_start = U32Set::major_start(page.major_value);
922 self.page_iter
923 .as_mut()?
924 .next()
925 .map(|r| (r.start() + page_start)..=(r.end() + page_start))
926 }
927}
928
929impl Iterator for U32SetRangeIter<'_> {
930 type Item = RangeInclusive<u32>;
931
932 fn next(&mut self) -> Option<Self::Item> {
933 self.page_iter.as_ref()?;
934 let mut current_range = self.next_range();
935 loop {
936 let page = self.set.page_map.get(self.page_info_index)?;
937 let page_end = U32Set::major_end(page.major_value);
938
939 let Some(range) = current_range.clone() else {
940 if !self.move_to_next_page() {
942 return None;
943 }
944 current_range = self.next_range();
945 continue;
946 };
947
948 if *range.end() != page_end {
949 break;
950 }
951
952 self.move_to_next_page();
954 let continuation = self.next_range();
955 let Some(continuation) = continuation else {
956 break;
957 };
958
959 if *continuation.start() == *range.end() + 1 {
960 current_range = Some(*range.start()..=*continuation.end());
961 continue;
962 }
963
964 self.reset_page_iter();
967 break;
968 }
969
970 current_range
971 }
972}
973
974#[cfg(test)]
975mod test {
976 use super::*;
977 use std::collections::HashSet;
978
979 #[test]
980 fn len() {
981 let bitset = U32Set::empty();
982 assert_eq!(bitset.len(), 0);
983 assert!(bitset.is_empty());
984 }
985
986 #[test]
987 fn from_iter() {
988 let mut expected = U32Set::empty();
989 expected.extend([2, 8, 13]);
990
991 assert_eq!(U32Set::from_iter([2, 8, 13]), expected);
992 assert_eq!(U32Set::from_iter([8, 2, 13]), expected);
993 }
994
995 #[test]
996 fn iter() {
997 let mut bitset = U32Set::empty();
998 bitset.insert(3);
999 bitset.insert(8);
1000 bitset.insert(534);
1001 bitset.insert(700);
1002 bitset.insert(10000);
1003 bitset.insert(10001);
1004 bitset.insert(10002);
1005
1006 let v: Vec<u32> = bitset.iter().collect();
1007 assert_eq!(v, vec![3, 8, 534, 700, 10000, 10001, 10002]);
1008 }
1009
1010 fn check_iter_ranges(ranges: Vec<RangeInclusive<u32>>) {
1011 let mut set = U32Set::empty();
1012 for range in ranges.iter() {
1013 set.insert_range(*range.start()..=*range.end());
1014 }
1015 let items: Vec<_> = set.iter_ranges().collect();
1016 assert_eq!(items, ranges);
1017 }
1018
1019 #[test]
1020 fn iter_ranges() {
1021 check_iter_ranges(vec![0..=0]);
1022 check_iter_ranges(vec![4578..=4578]);
1023 check_iter_ranges(vec![0..=10, 4578..=4583]);
1024 check_iter_ranges(vec![0..=700]);
1025 check_iter_ranges(vec![353..=737]);
1026
1027 check_iter_ranges(vec![u32::MAX..=u32::MAX]);
1028 check_iter_ranges(vec![(u32::MAX - 10)..=u32::MAX]);
1029 check_iter_ranges(vec![0..=5, (u32::MAX - 5)..=u32::MAX]);
1030
1031 check_iter_ranges(vec![0..=511, 513..=517]);
1032 check_iter_ranges(vec![512..=1023, 1025..=1027]);
1033
1034 check_iter_ranges(vec![1792..=2650]);
1035 }
1036
1037 #[test]
1038 fn iter_ranges_zero_pages() {
1039 let mut set = U32Set::empty();
1040
1041 set.insert(1000);
1042 set.insert_range(300..=511);
1043 set.remove(1000);
1044
1045 let items: Vec<_> = set.iter_ranges().collect();
1046 assert_eq!(items, vec![300..=511]);
1047 }
1048
1049 #[test]
1050 fn iter_backwards() {
1051 let mut bitset = U32Set::empty();
1052
1053 bitset.insert_range(1..=6);
1054 {
1055 let mut it = bitset.iter();
1056 assert_eq!(Some(1), it.next());
1057 assert_eq!(Some(6), it.next_back());
1058 assert_eq!(Some(5), it.next_back());
1059 assert_eq!(Some(2), it.next());
1060 assert_eq!(Some(3), it.next());
1061 assert_eq!(Some(4), it.next());
1062 assert_eq!(None, it.next());
1063 assert_eq!(None, it.next_back());
1064 }
1065
1066 bitset.insert_range(700..=701);
1067 {
1068 let mut it = bitset.iter();
1069 assert_eq!(Some(1), it.next());
1070 assert_eq!(Some(701), it.next_back());
1071 assert_eq!(Some(700), it.next_back());
1072 assert_eq!(Some(6), it.next_back());
1073 assert_eq!(Some(5), it.next_back());
1074 assert_eq!(Some(2), it.next());
1075 assert_eq!(Some(3), it.next());
1076 assert_eq!(Some(4), it.next());
1077 assert_eq!(None, it.next());
1078 assert_eq!(None, it.next_back());
1079 }
1080
1081 let v: Vec<u32> = bitset.iter().rev().collect();
1082 assert_eq!(vec![701, 700, 6, 5, 4, 3, 2, 1], v);
1083 }
1084
1085 #[test]
1086 fn iter_from() {
1087 let mut bitset = U32Set::empty();
1088 bitset.extend([5, 7, 10, 1250, 1300, 3001]);
1089
1090 assert_eq!(
1091 bitset.iter_from(0).collect::<Vec<u32>>(),
1092 vec![5, 7, 10, 1250, 1300, 3001]
1093 );
1094
1095 assert_eq!(
1096 bitset.iter_from(4).collect::<Vec<u32>>(),
1097 vec![5, 7, 10, 1250, 1300, 3001]
1098 );
1099 assert_eq!(
1100 bitset.iter_from(5).collect::<Vec<u32>>(),
1101 vec![5, 7, 10, 1250, 1300, 3001]
1102 );
1103 assert_eq!(
1104 bitset.iter_from(6).collect::<Vec<u32>>(),
1105 vec![7, 10, 1250, 1300, 3001]
1106 );
1107
1108 assert_eq!(
1109 bitset.iter_from(10).collect::<Vec<u32>>(),
1110 vec![10, 1250, 1300, 3001]
1111 );
1112
1113 assert_eq!(
1114 bitset.iter_from(700).collect::<Vec<u32>>(),
1115 vec![1250, 1300, 3001]
1116 );
1117
1118 assert_eq!(
1119 bitset.iter_from(1250).collect::<Vec<u32>>(),
1120 vec![1250, 1300, 3001]
1121 );
1122 assert_eq!(
1123 bitset.iter_from(1251).collect::<Vec<u32>>(),
1124 vec![1300, 3001]
1125 );
1126
1127 assert_eq!(bitset.iter_from(3000).collect::<Vec<u32>>(), vec![3001]);
1128 assert_eq!(bitset.iter_from(3001).collect::<Vec<u32>>(), vec![3001]);
1129 assert_eq!(bitset.iter_from(3002).count(), 0);
1130 assert_eq!(bitset.iter_from(5000).count(), 0);
1131 assert_eq!(bitset.iter_from(u32::MAX).count(), 0);
1132
1133 bitset.insert(u32::MAX);
1134 assert_eq!(
1135 bitset.iter_from(u32::MAX).collect::<Vec<u32>>(),
1136 vec![u32::MAX]
1137 );
1138 assert_eq!(
1139 bitset.iter_from(u32::MAX - 1).collect::<Vec<u32>>(),
1140 vec![u32::MAX]
1141 );
1142
1143 let mut bitset = U32Set::empty();
1144 bitset.extend([510, 511, 512]);
1145
1146 assert_eq!(
1147 bitset.iter_from(509).collect::<Vec<u32>>(),
1148 vec![510, 511, 512]
1149 );
1150 assert_eq!(
1151 bitset.iter_from(510).collect::<Vec<u32>>(),
1152 vec![510, 511, 512]
1153 );
1154 assert_eq!(bitset.iter_from(511).collect::<Vec<u32>>(), vec![511, 512]);
1155 assert_eq!(bitset.iter_from(512).collect::<Vec<u32>>(), vec![512]);
1156 assert!(bitset.iter_from(513).collect::<Vec<u32>>().is_empty());
1157 }
1158
1159 #[test]
1160 fn extend() {
1161 let values = [3, 8, 534, 700, 10000, 10001, 10002];
1162 let values_unsorted = [10000, 3, 534, 700, 8, 10001, 10002];
1163
1164 let mut s1 = U32Set::empty();
1165 let mut s2 = U32Set::empty();
1166 let mut s3 = U32Set::empty();
1167 let mut s4 = U32Set::empty();
1168 assert_eq!(s1.len(), 0);
1169
1170 s1.extend(values.iter().copied());
1171 s2.extend_unsorted(values.iter().copied());
1172 s3.extend(values_unsorted.iter().copied());
1173 s4.extend_unsorted(values_unsorted.iter().copied());
1174
1175 assert_eq!(s1.iter().collect::<Vec<u32>>(), values);
1176 assert_eq!(s2.iter().collect::<Vec<u32>>(), values);
1177 assert_eq!(s3.iter().collect::<Vec<u32>>(), values);
1178 assert_eq!(s4.iter().collect::<Vec<u32>>(), values);
1179
1180 assert_eq!(s1.len(), 7);
1181 assert_eq!(s2.len(), 7);
1182 assert_eq!(s3.len(), 7);
1183 assert_eq!(s4.len(), 7);
1184 }
1185
1186 #[test]
1187 fn insert_unordered() {
1188 let mut bitset = U32Set::empty();
1189
1190 assert!(!bitset.contains(0));
1191 assert!(!bitset.contains(768));
1192 assert!(!bitset.contains(1678));
1193
1194 assert!(bitset.insert(0));
1195 assert!(bitset.insert(1678));
1196 assert!(bitset.insert(768));
1197
1198 assert!(bitset.contains(0));
1199 assert!(bitset.contains(768));
1200 assert!(bitset.contains(1678));
1201
1202 assert!(!bitset.contains(1));
1203 assert!(!bitset.contains(769));
1204 assert!(!bitset.contains(1679));
1205
1206 assert_eq!(bitset.len(), 3);
1207 }
1208
1209 #[test]
1210 fn remove() {
1211 let mut bitset = U32Set::empty();
1212
1213 assert!(bitset.insert(0));
1214 assert!(bitset.insert(511));
1215 assert!(bitset.insert(512));
1216 assert!(bitset.insert(1678));
1217 assert!(bitset.insert(768));
1218
1219 assert_eq!(bitset.len(), 5);
1220
1221 assert!(!bitset.remove(12));
1222 assert!(bitset.remove(511));
1223 assert!(bitset.remove(512));
1224 assert!(!bitset.remove(512));
1225
1226 assert_eq!(bitset.len(), 3);
1227 assert!(bitset.contains(0));
1228 assert!(!bitset.contains(511));
1229 assert!(!bitset.contains(512));
1230 }
1231
1232 #[test]
1233 fn remove_all() {
1234 let mut bitset = U32Set::empty();
1235 bitset.extend([5, 7, 11, 18, 620, 2000]);
1236
1237 assert_eq!(bitset.len(), 6);
1238
1239 bitset.remove_all([7, 11, 13, 18, 620]);
1240 assert_eq!(bitset.len(), 2);
1241 assert_eq!(bitset.iter().collect::<Vec<u32>>(), vec![5, 2000]);
1242 }
1243
1244 #[test]
1245 fn remove_range() {
1246 let mut bitset = U32Set::empty();
1247 bitset.extend([5, 7, 11, 18, 511, 620, 1023, 1024, 1200]);
1248 assert_eq!(bitset.len(), 9);
1249 bitset.remove_range(7..=620);
1250 assert_eq!(bitset.len(), 4);
1251 assert_eq!(
1252 bitset.iter().collect::<Vec<u32>>(),
1253 vec![5, 1023, 1024, 1200]
1254 );
1255
1256 let mut bitset = U32Set::empty();
1257 bitset.extend([5, 7, 11, 18, 511, 620, 1023, 1024, 1200]);
1258 bitset.remove_range(7..=1024);
1259 assert_eq!(bitset.len(), 2);
1260 assert_eq!(bitset.iter().collect::<Vec<u32>>(), vec![5, 1200]);
1261
1262 let mut bitset = U32Set::empty();
1263 bitset.extend([5, 7, 11, 18, 511, 620, 1023, 1024, 1200]);
1264 bitset.remove_range(2000..=2100);
1265 assert_eq!(bitset.len(), 9);
1266 assert_eq!(
1267 bitset.iter().collect::<Vec<u32>>(),
1268 vec![5, 7, 11, 18, 511, 620, 1023, 1024, 1200]
1269 );
1270
1271 let mut bitset = U32Set::empty();
1273 bitset.extend([1001, 1002, 1003, 1004]);
1274 bitset.remove_range(1002..=1003);
1275 assert!(bitset.contains(1001));
1276 assert!(!bitset.contains(1002));
1277 assert!(!bitset.contains(1003));
1278 assert!(bitset.contains(1004));
1279
1280 bitset.remove_range(100..=200);
1281 assert!(bitset.contains(1001));
1282 assert!(!bitset.contains(1002));
1283 assert!(!bitset.contains(1003));
1284 assert!(bitset.contains(1004));
1285
1286 bitset.remove_range(100..=1001);
1287 assert!(!bitset.contains(1001));
1288 assert!(!bitset.contains(1002));
1289 assert!(!bitset.contains(1003));
1290 assert!(bitset.contains(1004));
1291 }
1292
1293 #[test]
1294 fn remove_range_boundary() {
1295 let mut set = U32Set::empty();
1296
1297 set.remove_range(u32::MAX - 10..=u32::MAX);
1298 assert!(!set.contains(u32::MAX));
1299 set.insert_range(u32::MAX - 10..=u32::MAX);
1300 assert!(set.contains(u32::MAX));
1301 set.remove_range(u32::MAX - 10..=u32::MAX);
1302 assert!(!set.contains(u32::MAX));
1303
1304 set.remove_range(0..=10);
1305 assert!(!set.contains(0));
1306 set.insert_range(0..=10);
1307 assert!(set.contains(0));
1308 set.remove_range(0..=10);
1309 assert!(!set.contains(0));
1310 }
1311
1312 #[test]
1313 fn remove_to_empty_page() {
1314 let mut bitset = U32Set::empty();
1315
1316 bitset.insert(793);
1317 bitset.insert(43);
1318 bitset.remove(793);
1319
1320 assert!(bitset.contains(43));
1321 assert!(!bitset.contains(793));
1322 assert_eq!(bitset.len(), 1);
1323 }
1324
1325 #[test]
1326 fn insert_max_value() {
1327 let mut bitset = U32Set::empty();
1328 assert!(!bitset.contains(u32::MAX));
1329 assert!(bitset.insert(u32::MAX));
1330 assert!(bitset.contains(u32::MAX));
1331 assert!(!bitset.contains(u32::MAX - 1));
1332 assert_eq!(bitset.len(), 1);
1333 }
1334
1335 #[test]
1336 fn contains_index_cache() {
1337 let mut bitset = U32Set::from_iter([10, 11, 12, 2023]);
1338 assert!(!bitset.contains(9));
1342 assert!(bitset.contains(10));
1343 assert!(bitset.contains(11));
1344 assert!(bitset.contains(12));
1345
1346 assert!(!bitset.contains(1200));
1347 assert!(!bitset.contains(2022));
1348 assert!(bitset.contains(2023));
1349 assert!(!bitset.contains(2024));
1350
1351 assert!(bitset.contains(2023));
1352 assert!(bitset.contains(11));
1353
1354 assert!(!bitset.contains(5000));
1355 assert!(bitset.contains(11));
1356 assert!(bitset.contains(2023));
1357 assert!(bitset.contains(12));
1358 assert!(!bitset.contains(2024));
1359 assert!(!bitset.contains(13));
1360
1361 bitset.clear();
1363 bitset.insert(2024);
1364 bitset.insert(13);
1365
1366 assert!(bitset.contains(13));
1367 assert!(!bitset.contains(12));
1368
1369 assert!(bitset.contains(2024));
1370 assert!(!bitset.contains(2023));
1371 }
1372
1373 fn check_process<A, B, C, Op>(a: A, b: B, expected: C, op: Op)
1374 where
1375 A: IntoIterator<Item = u32>,
1376 B: IntoIterator<Item = u32>,
1377 C: IntoIterator<Item = u32>,
1378 Op: Fn(&mut U32Set, &U32Set),
1379 {
1380 let mut result = U32Set::from_iter(a);
1381 let b_set = U32Set::from_iter(b);
1382 let expected_set = U32Set::from_iter(expected);
1383 result.len();
1384
1385 op(&mut result, &b_set);
1386 assert_eq!(result, expected_set);
1387 assert_eq!(result.len(), expected_set.len());
1388 }
1389
1390 #[test]
1391 fn union() {
1392 check_process([], [5], [5], |a, b| a.union(b));
1393 check_process([128], [5], [128, 5], |a, b| a.union(b));
1394 check_process([128], [], [128], |a, b| a.union(b));
1395 check_process([1280], [5], [5, 1280], |a, b| a.union(b));
1396 check_process([5], [1280], [5, 1280], |a, b| a.union(b));
1397 }
1398
1399 #[test]
1400 fn intersect() {
1401 check_process([], [5], [], |a, b| a.intersect(b));
1402 check_process([5], [], [], |a, b| a.intersect(b));
1403 check_process([1, 5, 9], [5, 7], [5], |a, b| a.intersect(b));
1404 check_process([1, 1000, 2000], [1000], [1000], |a, b| a.intersect(b));
1405 check_process([1000], [1, 1000, 2000], [1000], |a, b| a.intersect(b));
1406 check_process([1, 1000, 2000], [1000, 5000], [1000], |a, b| a.intersect(b));
1407 }
1408
1409 #[test]
1410 fn subtract() {
1411 check_process([], [5], [], |a, b| a.subtract(b));
1412 check_process([5], [], [5], |a, b| a.subtract(b));
1413 check_process([5, 1000], [1000], [5], |a, b| a.subtract(b));
1414 check_process([5, 1000], [5], [1000], |a, b| a.subtract(b));
1415 }
1416
1417 #[test]
1418 fn reversed_subtract() {
1419 check_process([], [5], [5], |a, b| a.reversed_subtract(b));
1420 check_process([5], [], [], |a, b| a.reversed_subtract(b));
1421 check_process([1000], [5, 1000], [5], |a, b| a.reversed_subtract(b));
1422 check_process([5], [5, 1000], [1000], |a, b| a.reversed_subtract(b));
1423 }
1424
1425 fn set_for_range(first: u32, last: u32) -> U32Set {
1426 let mut set = U32Set::empty();
1427 for i in first..=last {
1428 set.insert(i);
1429 }
1430 set
1431 }
1432
1433 #[test]
1434 fn insert_range() {
1435 for range in [
1436 (0, 0),
1437 (0, 364),
1438 (0, 511),
1439 (512, 1023),
1440 (0, 1023),
1441 (364, 700),
1442 (364, 6000),
1443 ] {
1444 let mut set = U32Set::empty();
1445 set.len();
1446 set.insert_range(range.0..=range.1);
1447 assert_eq!(set, set_for_range(range.0, range.1), "{range:?}");
1448 assert_eq!(set.len(), (range.1 - range.0 + 1) as u64, "{range:?}");
1449 }
1450 }
1451
1452 #[test]
1453 fn insert_range_on_existing() {
1454 let mut set = U32Set::empty();
1455 set.insert(700);
1456 set.insert(2000);
1457 set.insert_range(32..=4000);
1458 assert_eq!(set, set_for_range(32, 4000));
1459 assert_eq!(set.len(), 4000 - 32 + 1);
1460 }
1461
1462 #[test]
1463 fn insert_range_max() {
1464 let mut set = U32Set::empty();
1465 set.insert_range(u32::MAX..=u32::MAX);
1466 assert!(set.contains(u32::MAX));
1467 assert_eq!(set.len(), 1);
1468 }
1469
1470 #[test]
1471 fn clear() {
1472 let mut bitset = U32Set::empty();
1473
1474 bitset.insert(13);
1475 bitset.insert(670);
1476 assert!(bitset.contains(13));
1477 assert!(bitset.contains(670));
1478
1479 bitset.clear();
1480 assert!(!bitset.contains(13));
1481 assert!(!bitset.contains(670));
1482 assert_eq!(bitset.len(), 0);
1483 }
1484
1485 #[test]
1486 fn hash_and_eq() {
1487 let mut bitset1 = U32Set::empty();
1488 let mut bitset2 = U32Set::empty();
1489 let mut bitset3 = U32Set::empty();
1490 let mut bitset4 = U32Set::empty();
1491
1492 bitset1.insert(43);
1493 bitset1.insert(793);
1494
1495 bitset2.insert(793);
1496 bitset2.insert(43);
1497 bitset2.len();
1498
1499 bitset3.insert(43);
1500 bitset3.insert(793);
1501 bitset3.insert(794);
1502
1503 bitset4.insert(0);
1504
1505 assert_eq!(U32Set::empty(), U32Set::empty());
1506 assert_eq!(bitset1, bitset2);
1507 assert_ne!(bitset1, bitset3);
1508 assert_ne!(bitset2, bitset3);
1509 assert_eq!(bitset4, bitset4);
1510
1511 let set = HashSet::from([bitset1]);
1512 assert!(set.contains(&bitset2));
1513 assert!(!set.contains(&bitset3));
1514 }
1515
1516 #[test]
1517 fn hash_and_eq_with_empty_pages() {
1518 let mut bitset1 = U32Set::empty();
1519 let mut bitset2 = U32Set::empty();
1520 let mut bitset3 = U32Set::empty();
1521
1522 bitset1.insert(43);
1523
1524 bitset2.insert(793);
1525 bitset2.insert(43);
1526 bitset2.remove(793);
1527
1528 bitset3.insert(43);
1529 bitset3.insert(793);
1530
1531 assert_eq!(bitset1, bitset2);
1532 assert_ne!(bitset1, bitset3);
1533
1534 let set = HashSet::from([bitset1]);
1535 assert!(set.contains(&bitset2));
1536 }
1537
1538 #[test]
1539 fn hash_and_eq_ignore_cache() {
1540 let bitset1 = U32Set::from_iter([5, 1027]);
1541 let bitset2 = U32Set::from_iter([5, 1027]);
1542
1543 assert!(bitset1.contains(1027));
1545 assert!(bitset2.contains(5));
1546
1547 assert_eq!(bitset1, bitset2);
1549 assert!(matches!(bitset1.cmp(&bitset2), Ordering::Equal));
1550 let set = HashSet::from([bitset1]);
1551 assert!(set.contains(&bitset2));
1552 }
1553
1554 #[test]
1555 fn ordering() {
1556 macro_rules! assert_ord {
1557 ($lhs:expr, $rhs:expr, $ord:path) => {
1558 assert_eq!(
1559 U32Set::from_iter($lhs).cmp(&U32Set::from_iter($rhs)),
1560 $ord,
1561 "{:?}, {:?}",
1562 $lhs,
1563 $rhs
1564 )
1565 };
1566 }
1567
1568 const EMPTY: [u32; 0] = [];
1569 assert_ord!(EMPTY, EMPTY, Ordering::Equal);
1570 assert_ord!(EMPTY, [0], Ordering::Less);
1571 assert_ord!([0], [0], Ordering::Equal);
1572 assert_ord!([0, 1, 2], [1, 2, 3], Ordering::Less);
1573 assert_ord!([0, 1, 4], [1, 2, 3], Ordering::Less);
1574 assert_ord!([1, 2, 3], [0, 2, 4], Ordering::Greater);
1575 assert_ord!([5, 4, 0], [1, 2, 3], Ordering::Less); assert_ord!([1, 2, 3], [1, 2, 3, 4], Ordering::Less); assert_ord!([2, 3, 4], [1, 2, 3, 4, 5], Ordering::Greater); assert_ord!([1000, 2000, 3000], [1000, 2000, 3000, 4000], Ordering::Less); assert_ord!([1000, 1001,], [1000, 2000], Ordering::Less); assert_ord!(
1582 [2000, 3000, 4000],
1583 [1000, 2000, 3000, 4000, 5000],
1584 Ordering::Greater
1585 ); }
1587
1588 #[test]
1589 fn intersects() {
1590 macro_rules! assert_intersects {
1591 ($lhs:path, $rhs:path, $expected:expr) => {
1592 assert_eq!($lhs.intersects_set(&$rhs), $expected);
1593 assert_eq!($rhs.intersects_set(&$lhs), $expected);
1594 };
1595 }
1596
1597 let a = U32Set::from_iter([2, 4, 5, 2057, 7000]);
1598 let b = U32Set::from_iter([3]);
1599 let c = U32Set::from_iter([2058]);
1600 let d = U32Set::from_iter([2057, 3000]);
1601 let e = U32Set::from_iter([3, 7000]);
1602
1603 assert_intersects!(a, b, false);
1604 assert_intersects!(a, c, false);
1605 assert_intersects!(e, d, false);
1606
1607 assert_intersects!(a, d, true);
1608 assert_intersects!(a, e, true);
1609 assert_intersects!(b, e, true);
1610
1611 let mut a = U32Set::empty();
1613 a.insert(4000);
1614 a.insert(0);
1615
1616 let b = U32Set::from_iter([4000]);
1617
1618 assert_intersects!(a, b, true);
1619 }
1620
1621 #[test]
1622 fn is_subset() {
1623 let empty = U32Set::empty();
1624 let a = U32Set::from_iter([2, 4, 5, 2057, 7000]);
1625 let b = U32Set::from_iter([2, 4, 5, 2057, 7000, 8000]);
1626 let c = U32Set::from_iter([2, 4, 5]);
1627 let d = U32Set::from_iter([2, 4, 6, 2057, 7000]); let e = U32Set::from_iter([2, 4, 5, 3000, 7000]); assert!(empty.is_subset(&empty));
1631 assert!(empty.is_subset(&a));
1632 assert!(a.is_subset(&a));
1633 assert!(a.is_subset(&b));
1634 assert!(c.is_subset(&a));
1635 assert!(c.is_subset(&b));
1636
1637 assert!(!b.is_subset(&a));
1639 assert!(!a.is_subset(&c));
1640 assert!(!a.is_subset(&empty));
1641
1642 assert!(!a.is_subset(&d));
1644 assert!(!d.is_subset(&a));
1645
1646 assert!(!a.is_subset(&e));
1648 assert!(!e.is_subset(&a));
1649
1650 let mut a_with_empty_page = U32Set::empty();
1652 a_with_empty_page.insert(100);
1653 a_with_empty_page.insert(2057);
1654 a_with_empty_page.remove(100); assert!(a_with_empty_page.is_subset(&b));
1656 }
1657
1658 #[test]
1659 fn intersection_len() {
1660 let empty = U32Set::empty();
1661 let a = U32Set::from_iter([2, 4, 5, 2057, 7000]);
1662 let b = U32Set::from_iter([4, 5, 2057, 9000]);
1663 let c = U32Set::from_iter([1, 3, 10000]);
1664
1665 assert_eq!(empty.intersection_len(&a), 0);
1666 assert_eq!(a.intersection_len(&empty), 0);
1667 assert_eq!(a.intersection_len(&a), 5);
1668
1669 assert_eq!(a.intersection_len(&b), 3);
1670 assert_eq!(b.intersection_len(&a), 3);
1671
1672 assert_eq!(a.intersection_len(&c), 0);
1673 assert_eq!(c.intersection_len(&a), 0);
1674 }
1675}