read_fonts/collections/int_set/
bitset.rs

1//! A fast, efficient, sparse, & ordered unsigned integer (`u32`) bit set.
2//!
3//! There are a couple of differences with [`super::IntSet`]:
4//! - This set is not invertible and can only record the set of integers which are members.
5//! - This set works only with `u32` values, unlike [`super::IntSet`] which supports custom integer types.
6//!
7//! When dealing with only `u32`'s and invertibility is not needed then this set is slightly faster
8//! than the more generic [`super::IntSet`].
9//!
10//! The bitset is implemented using fixed size pages which allows it to compactly
11//! represent sparse membership. However, the set excels when set members are typically
12//! clustered together. For example when representing glyph id or unicode codepoint values
13//! in a font.
14//!
15//! When constructing a new [`U32Set`] from an existing list of integer values the most efficient
16//! way to create the set is to initialize it from a sorted list of values via the extend() method.
17
18use 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
27// log_2(PAGE_BITS)
28const PAGE_BITS_LOG_2: u32 = PAGE_BITS.ilog2();
29
30/// A fast, efficient, sparse, & ordered `u32` set.
31///
32/// For a higher-level API that supports inversion and generic int types, use [`super::IntSet`]
33#[derive(Debug)]
34#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
35pub struct U32Set {
36    // TODO(garretrieger): consider a "small array" type instead of Vec.
37    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 has no effect on the externally visible state of the set
68            // so it can just be reset to the default value.
69            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    /// Add val as a member of this set.
84    ///
85    /// If the set did not previously contain this value, returns `true`.
86    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    /// Add all values in range as members of this set.
94    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    /// An alternate version of [`extend()`] which is optimized for inserting an unsorted
119    /// iterator of values.
120    ///
121    /// [`extend()`]: Self::extend
122    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    /// Remove val from this set.
134    ///
135    /// Returns `true` if the value was present.
136    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    // Remove all values in iter from this set.
148    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    /// Removes all values in range as members of this set.
171    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    /// Returns true if val is a member of this set.
213    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                // Cached value needs an update, lookup the actual page map index.
229                let Some(page_map_index) = self.page_map_index_for_major(new_major) else {
230                    // No page exists for this value so it's not present and we don't need to update cached values.
231                    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    /// Remove all members from this set.
282    pub fn clear(&mut self) {
283        self.pages.clear();
284        self.page_map.clear();
285        self.length = 0;
286    }
287
288    /// Return true if there are no members in this set.
289    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    /// Returns the number of members in this set.
298    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    /// Sets the members of this set to the union of self and other.
307    pub fn union(&mut self, other: &U32Set) {
308        self.process(BitPage::union, other);
309    }
310
311    /// Sets the members of this set to the intersection of self and other.
312    pub fn intersect(&mut self, other: &U32Set) {
313        self.process(BitPage::intersect, other);
314    }
315
316    /// Sets the members of this set to self - other.
317    pub fn subtract(&mut self, other: &U32Set) {
318        self.process(BitPage::subtract, other);
319    }
320
321    /// Sets the members of this set to other - self.
322    pub fn reversed_subtract(&mut self, other: &U32Set) {
323        self.process(|a, b| BitPage::subtract(b, a), other);
324    }
325
326    /// Iterator over the members of this set. In sorted order (ascending).
327    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    /// Iterator over the members of this set starting from value.
335    ///
336    /// So value is included in the iterator if it's in the set.
337    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    /// Iterate over the ranges of contiguous values in this set.
388    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    /// Determine the passthrough behaviour of the operator.
405    ///
406    /// The passthrough behaviour is what happens to a page on one side of the operation if the other side is 0.
407    /// For example union passes through both left and right sides since it preserves the left or right side when
408    /// the other side is 0. Knowing this lets us optimize some cases when only one page is present on one side.
409    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        // Step 1: Estimate the new size of this set (in number of pages) after processing, and remove left side
437        //         pages that won't be needed.
438        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 we don't passthrough the left side, then the only case where we
446                        // keep a page from the left is when there is also a page at the same major
447                        // on the right side. In this case move page_map entries that we're keeping
448                        // on the left side set to the front of the page_map vector. Otherwise if
449                        // we do passthrough left, then we we keep all left hand side pages and this
450                        // isn't necessary.
451                        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        // Step 2: compact and resize for the new estimated left side size.
485        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        // Step 3: process and apply op in-place from the last to first page.
496        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        // Step 4: there are only pages left on one side now, finish processing them if the appropriate passthrough is
535        //         enabled.
536        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    /// Return the major value (top 23 bits) of the page associated with value.
603    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        // Note: (PAGE_BITS - 1) must be grouped to prevent overflow on addition for the largest page.
613        Self::major_start(major) + (PAGE_BITS - 1)
614    }
615
616    /// Returns the index in `self.pages` (if it exists) for the page with the same major as `major_value`.
617    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    /// Returns the index in `self.pages` for the page with the same major as `major_value`. Will create
629    /// the page if it does not yet exist.
630    #[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    /// Return a mutable reference to the page that `value` resides in.
651    ///
652    /// Insert a new page if it doesn't exist.
653    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    /// Return a mutable reference to the page with major value equal to `major_value`.
659    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    /// Return a mutable reference to the page that `value` resides in.
665    ///
666    /// Insert a new page if it doesn't exist.
667    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    /// Return a mutable reference to the page with major value equal to `major_value`.
672    /// Inserts a new page if it doesn't exist.
673    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    /// Return the mutable page at a given index
679    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
702/// This helper is used to construct [`U32Set`]'s from a stream of possibly sorted values.
703/// It remembers the last page index to reduce the amount of page lookups needed when inserting
704/// sorted data. If given unsorted values it will still work correctly, but may be slower then just
705/// repeatedly calling `insert()` on the bitset.
706pub(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        // TODO(garretrieger): additional optimization ideas:
723        // - Assuming data is sorted accumulate a single element mask and only commit it to the element
724        //   once the next value passes the end of the element.
725        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        // we used to do some finalization and bookkeeping here, and we will
737        // want to again if we optimize the impl more.
738    }
739}
740
741#[derive(Clone, Copy, Debug, PartialEq, Eq)]
742#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
743struct PageInfo {
744    // index into pages vector of this page
745    index: u32,
746    /// the top 23 bits of values covered by this page
747    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        // Note: normally we would prefer to use zip, but we also
762        //       need to check that both iters have the same length.
763        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        // all items in iter are the same: is one collection longer?
794        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        // TODO(garretrieger): don't recompute page start on each call.
833        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                // The current page has no more ranges, but there may be more pages.
854                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            // The range goes right to the end of the current page and may continue into it.
866            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            // Continuation range does not touch the current range, ignore it and return what we have.
878            // Since we consumed an item from the new page iterator, reset it.
879            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        // Remove all from one page
1185        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        // contains() internally uses a cache of last page index
1252        // ensure that outward contains() returns are unnaffected
1253        // by the ordering of calls.
1254        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        // Caching should also work correctly if the page map is modified between lookups
1275        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        // Modify the internal last page index cache to point at different pages.
1457        assert!(bitset1.contains(1027));
1458        assert!(bitset2.contains(5));
1459
1460        // Hash, eq, cmp should be unnaffected:
1461        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); // out of order
1489        assert_ord!([1, 2, 3], [1, 2, 3, 4], Ordering::Less); // out of order
1490        assert_ord!([2, 3, 4], [1, 2, 3, 4, 5], Ordering::Greater); // out of order
1491
1492        assert_ord!([1000, 2000, 3000], [1000, 2000, 3000, 4000], Ordering::Less); // out of order
1493        assert_ord!([1000, 1001,], [1000, 2000], Ordering::Less); // out of order
1494        assert_ord!(
1495            [2000, 3000, 4000],
1496            [1000, 2000, 3000, 4000, 5000],
1497            Ordering::Greater
1498        ); // out of order
1499    }
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        // Check that page map population orderdoes not impact the check
1525        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}