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