read_fonts/collections/int_set/
mod.rs

1//! A fast, efficient, sparse, & ordered unsigned integer (u32) bit set which is invertible.
2//!
3//! The bitset is implemented using fixed size pages which allows it to compactly
4//! represent sparse membership. However, the set excels when set members are typically
5//! clustered together. For example when representing glyph id or unicode codepoint values
6//! in a font.
7//!
8//! The set can have inclusive (the set of integers which are members) or
9//! exclusive (the set of integers which are not members) membership. The
10//! exclusive/inverted version of the set is useful for patterns such as
11//! "keep all codepoints except for {x, y, z, ...}".
12//!
13//! When constructing a new [`IntSet`] from an existing lists of integer values the most efficient
14//! way to create the set is to initialize it from a sorted (ascending) iterator of the values.
15//!
16//! For a type to be stored in the [`IntSet`] it must implement the [`Domain`] trait, and all
17//! unique values of that type must be able to be mapped to and from a unique `u32` value.
18//! See the [`Domain`] trait for more information.
19
20mod bitpage;
21mod bitset;
22mod input_bit_stream;
23mod output_bit_stream;
24pub mod sparse_bit_set;
25
26use bitset::BitSet;
27use core::{cmp::Ordering, fmt::Display};
28use font_types::{GlyphId, GlyphId16};
29use std::hash::Hash;
30use std::marker::PhantomData;
31use std::ops::RangeInclusive;
32use types::{NameId, Tag};
33
34/// A fast & efficient invertible ordered set for small (up to 32-bit) unsigned integer types.
35#[derive(Clone, Debug)]
36pub struct IntSet<T>(Membership, PhantomData<T>);
37
38/// Defines the domain of `IntSet` member types.
39///
40/// Members of `IntSet` must implement this trait. Members of `IntSet`'s must meet the following
41/// conditions to be used in an `IntSet`:
42///
43/// 1. Every possible unique value of `T` must be able map to and from a unique `u32`
44///    integer.
45///
46/// 2. The mapped `u32` values must retain the same ordering as the values in `T`.
47///
48/// 3. `ordered_values`() must iterate over all values in `T` in sorted order (ascending).
49///
50/// `from_u32`() will only ever be called with u32 values that are part of the domain of T as defined
51/// by an implementation of this trait. So it doesn't need to correctly handle values
52/// that are outside the domain of `T`.
53pub trait Domain: Sized {
54    /// Converts this value of `T` to a value in u32.
55    ///
56    /// The mapped value must maintain the same ordering as `T`.
57    fn to_u32(&self) -> u32;
58
59    /// Converts a mapped u32 value back to T.
60    ///
61    /// Will only ever be called with values produced by `to_u32`.
62    fn from_u32(member: InDomain) -> Self;
63
64    /// Returns true if all u32 values between the mapped u32 min and mapped u32 max value of T are used.
65    fn is_continuous() -> bool;
66
67    /// Returns an iterator which iterates over all values in the domain of `T`
68    ///
69    /// Values should be converted to `u32`'s according to the mapping defined in
70    /// `to_u32`/`from_u32`.
71    fn ordered_values() -> impl DoubleEndedIterator<Item = u32>;
72
73    /// Return an iterator which iterates over all values of T in the given range.
74    ///
75    /// Values should be converted to `u32`'s according to the mapping defined in
76    /// `to_u32`/`from_u32`.
77    fn ordered_values_range(range: RangeInclusive<Self>) -> impl DoubleEndedIterator<Item = u32>;
78
79    /// Returns the number of members in the domain.
80    fn count() -> u64;
81}
82
83/// Marks a mapped value as being in the domain of `T` for [`Domain`].
84///
85/// See [`Domain`] for more information.
86pub struct InDomain(u32);
87
88#[derive(Clone, Debug, Hash, PartialEq, Eq)]
89enum Membership {
90    /// Records a set of integers which are members of the set.
91    Inclusive(BitSet),
92
93    /// Records the set of integers which are not members of the set.
94    Exclusive(BitSet),
95}
96
97impl InDomain {
98    pub fn value(&self) -> u32 {
99        self.0
100    }
101}
102
103impl<T> Default for IntSet<T> {
104    fn default() -> IntSet<T> {
105        IntSet::empty()
106    }
107}
108
109impl<T: Domain> IntSet<T> {
110    /// Returns an iterator over all members of the set in sorted ascending order.
111    ///
112    /// Note: iteration of inverted sets can be extremely slow due to the very large number of members in the set
113    /// care should be taken when using `.iter()` in combination with an inverted set.
114    pub fn iter(&self) -> impl DoubleEndedIterator<Item = T> + '_ {
115        let u32_iter = match &self.0 {
116            Membership::Inclusive(s) => Iter::new_bidirectional(s.iter(), None),
117            Membership::Exclusive(s) => {
118                Iter::new_bidirectional(s.iter(), Some(T::ordered_values()))
119            }
120        };
121        u32_iter.map(|v| T::from_u32(InDomain(v)))
122    }
123
124    /// If this is an inclusive membership set then returns an iterator over the members, otherwise returns `None`.
125    pub fn inclusive_iter(&self) -> Option<impl DoubleEndedIterator<Item = T> + '_> {
126        match &self.0 {
127            Membership::Inclusive(s) => Some(s.iter().map(|v| T::from_u32(InDomain(v)))),
128            Membership::Exclusive(_) => None,
129        }
130    }
131
132    /// Returns an iterator over the members of this set that come after `value` in ascending order.
133    ///
134    /// Note: iteration of inverted sets can be extremely slow due to the very large number of members in the set
135    /// care should be taken when using `.iter()` in combination with an inverted set.
136    pub fn iter_after(&self, value: T) -> impl Iterator<Item = T> + '_ {
137        let u32_iter = match &self.0 {
138            Membership::Inclusive(s) => Iter::new(s.iter_after(value.to_u32()), None),
139            Membership::Exclusive(s) => {
140                let value_u32 = value.to_u32();
141                let max = T::ordered_values().next_back();
142                let it = max.map(|max| {
143                    let mut it = T::ordered_values_range(value..=T::from_u32(InDomain(max)));
144                    it.next(); // skip ahead one value.
145                    it
146                });
147                let min = it.and_then(|mut it| it.next());
148
149                if let (Some(min), Some(max)) = (min, max) {
150                    Iter::new(
151                        s.iter_after(value_u32),
152                        Some(T::ordered_values_range(
153                            T::from_u32(InDomain(min))..=T::from_u32(InDomain(max)),
154                        )),
155                    )
156                } else {
157                    // either min or max doesn't exist, so just return an iterator that has no values.
158                    Iter::new(s.iter_after(u32::MAX), None)
159                }
160            }
161        };
162        u32_iter.map(|v| T::from_u32(InDomain(v)))
163    }
164
165    /// Returns an iterator over all disjoint ranges of values within the set in sorted ascending order.
166    pub fn iter_ranges(&self) -> impl Iterator<Item = RangeInclusive<T>> + '_ {
167        self.iter_ranges_invertible(false)
168    }
169
170    /// Returns an iterator over all disjoint ranges of values not within the set in sorted ascending order.
171    pub fn iter_excluded_ranges(&self) -> impl Iterator<Item = RangeInclusive<T>> + '_ {
172        self.iter_ranges_invertible(true)
173    }
174
175    fn iter_ranges_invertible(
176        &self,
177        inverted: bool,
178    ) -> impl Iterator<Item = RangeInclusive<T>> + '_ {
179        let u32_iter = match (&self.0, inverted) {
180            (Membership::Inclusive(s), false) | (Membership::Exclusive(s), true)
181                if T::is_continuous() =>
182            {
183                RangeIter::Inclusive::<_, _, T> {
184                    ranges: s.iter_ranges(),
185                }
186            }
187            (Membership::Inclusive(s), false) | (Membership::Exclusive(s), true) => {
188                RangeIter::InclusiveDiscontinuous::<_, _, T> {
189                    ranges: s.iter_ranges(),
190                    current_range: None,
191                    phantom: PhantomData::<T>,
192                }
193            }
194            (Membership::Exclusive(s), false) | (Membership::Inclusive(s), true)
195                if T::is_continuous() =>
196            {
197                RangeIter::Exclusive::<_, _, T> {
198                    ranges: s.iter_ranges(),
199                    min: T::ordered_values().next().unwrap(),
200                    max: T::ordered_values().next_back().unwrap(),
201                    done: false,
202                }
203            }
204            (Membership::Exclusive(s), false) | (Membership::Inclusive(s), true) => {
205                RangeIter::ExclusiveDiscontinuous::<_, _, T> {
206                    all_values: Some(T::ordered_values()),
207                    set: s,
208                    next_value: None,
209                }
210            }
211        };
212
213        u32_iter.map(|r| T::from_u32(InDomain(*r.start()))..=T::from_u32(InDomain(*r.end())))
214    }
215
216    /// Adds a value to the set.
217    ///
218    /// Returns `true` if the value was newly inserted.
219    pub fn insert(&mut self, val: T) -> bool {
220        let val = val.to_u32();
221        match &mut self.0 {
222            Membership::Inclusive(s) => s.insert(val),
223            Membership::Exclusive(s) => s.remove(val),
224        }
225    }
226
227    /// Add all values in range as members of this set.
228    pub fn insert_range(&mut self, range: RangeInclusive<T>) {
229        if T::is_continuous() {
230            let range = range.start().to_u32()..=range.end().to_u32();
231            match &mut self.0 {
232                Membership::Inclusive(s) => s.insert_range(range),
233                Membership::Exclusive(s) => s.remove_range(range),
234            }
235        } else {
236            let range = T::ordered_values_range(range);
237            match &mut self.0 {
238                Membership::Inclusive(s) => s.extend(range),
239                Membership::Exclusive(s) => s.remove_all(range),
240            }
241        }
242    }
243
244    /// An alternate version of [`extend()`] which is optimized for inserting an unsorted iterator of values.
245    ///
246    /// [`extend()`]: Self::extend
247    pub fn extend_unsorted<U: IntoIterator<Item = T>>(&mut self, iter: U) {
248        let iter = iter.into_iter().map(|v| v.to_u32());
249        match &mut self.0 {
250            Membership::Inclusive(s) => s.extend_unsorted(iter),
251            Membership::Exclusive(s) => s.remove_all(iter),
252        }
253    }
254
255    /// Removes a value from the set. Returns whether the value was present in the set.
256    pub fn remove(&mut self, val: T) -> bool {
257        let val = val.to_u32();
258        match &mut self.0 {
259            Membership::Inclusive(s) => s.remove(val),
260            Membership::Exclusive(s) => s.insert(val),
261        }
262    }
263
264    // Removes all values in iter from the set.
265    pub fn remove_all<U: IntoIterator<Item = T>>(&mut self, iter: U) {
266        let iter = iter.into_iter().map(|v| v.to_u32());
267        match &mut self.0 {
268            Membership::Inclusive(s) => s.remove_all(iter),
269            Membership::Exclusive(s) => s.extend(iter),
270        }
271    }
272
273    /// Removes all values in range as members of this set.
274    pub fn remove_range(&mut self, range: RangeInclusive<T>) {
275        if T::is_continuous() {
276            let range = range.start().to_u32()..=range.end().to_u32();
277            match &mut self.0 {
278                Membership::Inclusive(s) => s.remove_range(range),
279                Membership::Exclusive(s) => s.insert_range(range),
280            }
281        } else {
282            let range = T::ordered_values_range(range);
283            match &mut self.0 {
284                Membership::Inclusive(s) => s.remove_all(range),
285                Membership::Exclusive(s) => s.extend(range),
286            }
287        }
288    }
289
290    /// Sets the members of this set to the union of self and other.
291    pub fn union(&mut self, other: &IntSet<T>) {
292        match (&mut self.0, &other.0) {
293            (Membership::Inclusive(a), Membership::Inclusive(b)) => a.union(b),
294            (Membership::Inclusive(a), Membership::Exclusive(b)) => {
295                a.reversed_subtract(b);
296                self.invert();
297            }
298            (Membership::Exclusive(a), Membership::Inclusive(b)) => a.subtract(b),
299            (Membership::Exclusive(a), Membership::Exclusive(b)) => a.intersect(b),
300        }
301    }
302
303    /// Sets the members of this set to the intersection of self and other.
304    pub fn intersect(&mut self, other: &IntSet<T>) {
305        match (&mut self.0, &other.0) {
306            (Membership::Inclusive(a), Membership::Inclusive(b)) => a.intersect(b),
307            (Membership::Inclusive(a), Membership::Exclusive(b)) => a.subtract(b),
308            (Membership::Exclusive(a), Membership::Inclusive(b)) => {
309                a.reversed_subtract(b);
310                self.invert();
311            }
312            (Membership::Exclusive(a), Membership::Exclusive(b)) => a.union(b),
313        }
314    }
315
316    /// Returns true if this set contains at least one element in 'range'.
317    pub fn intersects_range(&self, range: RangeInclusive<T>) -> bool {
318        let domain_min = T::ordered_values()
319            .next()
320            .map(|v_u32| T::from_u32(InDomain(v_u32)));
321        let Some(domain_min) = domain_min else {
322            return false;
323        };
324
325        let start_u32 = range.start().to_u32();
326        let mut it = T::ordered_values_range(domain_min..=T::from_u32(InDomain(start_u32)));
327        it.next_back();
328        let before_start = it.next_back();
329
330        let next = if let Some(before_start) = before_start {
331            self.iter_after(T::from_u32(InDomain(before_start))).next()
332        } else {
333            self.iter().next()
334        };
335
336        let Some(next) = next else {
337            return false;
338        };
339
340        // If next is <= end then there is at least one value in the input range.
341        next.to_u32() <= range.end().to_u32()
342    }
343
344    /// Returns true if this set contains at least one element in 'other'.
345    pub fn intersects_set(&self, other: &IntSet<T>) -> bool {
346        // Iterate the smaller set and check for member ship in the larger set
347        // Estimate the true size as the number of pages.
348        let (a, b) = match (&self.0, &other.0) {
349            (
350                Membership::Inclusive(us) | Membership::Exclusive(us),
351                Membership::Inclusive(them) | Membership::Exclusive(them),
352            ) => {
353                if us.num_pages() > them.num_pages() {
354                    (self, other)
355                } else {
356                    (other, self)
357                }
358            }
359        };
360
361        for range in b.iter_ranges() {
362            if a.intersects_range(range) {
363                return true;
364            }
365        }
366        false
367    }
368
369    /// Returns first element in the set, if any. This element is always the minimum of all elements in the set.
370    pub fn first(&self) -> Option<T> {
371        return self.iter().next();
372    }
373
374    /// Returns the last element in the set, if any. This element is always the maximum of all elements in the set.
375    pub fn last(&self) -> Option<T> {
376        return self.iter().next_back();
377    }
378
379    /// Returns `true` if the set contains a value.
380    pub fn contains(&self, val: T) -> bool {
381        let val = val.to_u32();
382        match &self.0 {
383            Membership::Inclusive(s) => s.contains(val),
384            Membership::Exclusive(s) => !s.contains(val),
385        }
386    }
387
388    /// Returns the number of members in this set.
389    pub fn len(&self) -> u64 {
390        match &self.0 {
391            Membership::Inclusive(s) => s.len(),
392            Membership::Exclusive(s) => T::count() - s.len(),
393        }
394    }
395
396    /// Return true if there are no members in this set.
397    pub fn is_empty(&self) -> bool {
398        self.len() == 0
399    }
400}
401
402impl IntSet<u32> {
403    pub(crate) fn from_bitset(set: BitSet) -> IntSet<u32> {
404        IntSet(Membership::Inclusive(set), PhantomData::<u32>)
405    }
406}
407
408impl<T> IntSet<T> {
409    /// Create a new empty set (inclusive).
410    pub fn empty() -> IntSet<T> {
411        IntSet(Membership::Inclusive(BitSet::empty()), PhantomData::<T>)
412    }
413
414    /// Create a new set which contains all integers (exclusive).
415    pub fn all() -> IntSet<T> {
416        IntSet(Membership::Exclusive(BitSet::empty()), PhantomData::<T>)
417    }
418
419    /// Returns true if this set is inverted (has exclusive membership).
420    pub fn is_inverted(&self) -> bool {
421        match &self.0 {
422            Membership::Inclusive(_) => false,
423            Membership::Exclusive(_) => true,
424        }
425    }
426
427    /// Return the inverted version of this set.
428    pub fn invert(&mut self) {
429        let reuse_storage = match &mut self.0 {
430            // take the existing storage to reuse in a new set of the oppposite
431            // type.
432            Membership::Inclusive(s) | Membership::Exclusive(s) => {
433                std::mem::replace(s, BitSet::empty())
434            }
435        };
436
437        // reuse the storage with a membership of the opposite type.
438        self.0 = match &mut self.0 {
439            Membership::Inclusive(_) => Membership::Exclusive(reuse_storage),
440            Membership::Exclusive(_) => Membership::Inclusive(reuse_storage),
441        };
442    }
443
444    /// Clears the set, removing all values.
445    pub fn clear(&mut self) {
446        let mut reuse_storage = match &mut self.0 {
447            // if we're inclusive, we just clear the storage
448            Membership::Inclusive(s) => {
449                s.clear();
450                return;
451            }
452            // otherwise take the existing storage to reuse in a new
453            // inclusive set:
454            Membership::Exclusive(s) => std::mem::replace(s, BitSet::empty()),
455        };
456        // reuse the now empty storage and mark us as inclusive
457        reuse_storage.clear();
458        self.0 = Membership::Inclusive(reuse_storage);
459    }
460}
461
462impl<T: Domain> FromIterator<T> for IntSet<T> {
463    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
464        let mut s = IntSet::empty();
465        s.extend(iter);
466        s
467    }
468}
469
470impl<T: Domain> Extend<T> for IntSet<T> {
471    /// Extends a collection with the contents of an iterator.
472    ///
473    /// This implementation is optimized to provide the best performance when the iterator contains sorted values.
474    /// Consider using [`extend_unsorted()`] if the iterator is known to contain unsorted values.
475    ///
476    /// [`extend_unsorted()`]: IntSet::extend_unsorted
477    fn extend<U: IntoIterator<Item = T>>(&mut self, iter: U) {
478        let iter = iter.into_iter().map(|v| v.to_u32());
479        match &mut self.0 {
480            Membership::Inclusive(s) => s.extend(iter),
481            Membership::Exclusive(s) => s.remove_all(iter),
482        }
483    }
484}
485
486impl<T: Domain> PartialEq for IntSet<T> {
487    fn eq(&self, other: &Self) -> bool {
488        match (&self.0, &other.0) {
489            (Membership::Inclusive(a), Membership::Inclusive(b)) => a == b,
490            (Membership::Exclusive(a), Membership::Exclusive(b)) => a == b,
491            (Membership::Inclusive(_), Membership::Exclusive(_))
492            | (Membership::Exclusive(_), Membership::Inclusive(_)) => {
493                // while these sets have different membership modes, they can still be equal if they happen to have
494                // the same effective set of members. In this case fallback to checking via iterator equality.
495                // iter_ranges() is used instead of iter() because for exclusive sets it's likely to be significantly
496                // faster and have far less items.
497                if self.len() == other.len() {
498                    let r = self
499                        .iter_ranges()
500                        .map(|r| r.start().to_u32()..=r.end().to_u32())
501                        .eq(other
502                            .iter_ranges()
503                            .map(|r| r.start().to_u32()..=r.end().to_u32()));
504                    r
505                } else {
506                    // Shortcut iteration equality check if lengths aren't the same.
507                    false
508                }
509            }
510        }
511    }
512}
513
514impl<T: Domain> Hash for IntSet<T> {
515    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
516        // Because equality considers two sets with the same effective members (but different membership modes) as
517        // equal, hash must be based on the effective member set as well. Exclusive sets may have extremely large numbers
518        // of effective members, so here we use iter_ranges() to produce the hash, which should typically produce a more
519        // reasonable numbers elements.
520        self.iter_ranges()
521            .map(|r| r.start().to_u32()..=r.end().to_u32())
522            .for_each(|r| r.hash(state));
523    }
524}
525
526impl<T: Domain + Ord> Ord for IntSet<T> {
527    fn cmp(&self, other: &Self) -> core::cmp::Ordering {
528        match (&self.0, &other.0) {
529            (Membership::Inclusive(a), Membership::Inclusive(b)) => a.cmp(b),
530            _ => {
531                let mut this = self
532                    .iter_ranges()
533                    .map(|r| r.start().to_u32()..=r.end().to_u32());
534                let mut other = other
535                    .iter_ranges()
536                    .map(|r| r.start().to_u32()..=r.end().to_u32());
537                loop {
538                    match (this.next(), other.next()) {
539                        (Some(a), Some(b)) => {
540                            let cmp = a.start().cmp(b.start());
541                            if cmp != Ordering::Equal {
542                                return cmp;
543                            }
544
545                            match a.end().cmp(b.end()) {
546                                Ordering::Equal => continue,
547                                // If a range isn't equal then there are two possible scenarios:
548                                // 1. The set with the shorter range has at least one more range.
549                                //    In this case the set with the shorter range's next element will always be bigger
550                                //    then the other set's next element and should be considered greater.
551                                // 2. The set with the shorter range does not have anymore ranges, in that case we
552                                //    know the other set has at least one more element and thus should be considered greater.
553                                Ordering::Less => {
554                                    return if this.next().is_some() {
555                                        Ordering::Greater
556                                    } else {
557                                        Ordering::Less
558                                    };
559                                }
560                                Ordering::Greater => {
561                                    return if other.next().is_some() {
562                                        Ordering::Less
563                                    } else {
564                                        Ordering::Greater
565                                    };
566                                }
567                            }
568                        }
569                        (None, None) => return Ordering::Equal,
570                        (None, Some(_)) => return Ordering::Less,
571                        (Some(_), None) => return Ordering::Greater,
572                    }
573                }
574            }
575        }
576    }
577}
578
579impl<T: Domain + Ord> PartialOrd for IntSet<T> {
580    fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
581        Some(self.cmp(other))
582    }
583}
584
585impl<T: Domain> Eq for IntSet<T> {}
586
587impl<T: Domain, const N: usize> From<[T; N]> for IntSet<T> {
588    fn from(value: [T; N]) -> Self {
589        value.into_iter().collect()
590    }
591}
592
593impl<T> Display for IntSet<T>
594where
595    T: Domain + Display,
596{
597    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
598        let mut ranges = self.iter_ranges().peekable();
599        write!(f, "{{ ")?;
600        while let Some(range) = ranges.next() {
601            write!(f, "{}..={}", range.start(), range.end())?;
602            if ranges.peek().is_some() {
603                write!(f, ", ")?;
604            }
605        }
606        write!(f, "}}")
607    }
608}
609
610struct Iter<SetIter, AllValuesIter> {
611    set_values: SetIter,
612    all_values: Option<AllValuesIter>,
613    next_skipped_forward: Option<u32>,
614    next_skipped_backward: Option<u32>,
615}
616
617impl<SetIter, AllValuesIter> Iter<SetIter, AllValuesIter>
618where
619    SetIter: Iterator<Item = u32>,
620    AllValuesIter: Iterator<Item = u32>,
621{
622    fn new(
623        mut set_values: SetIter,
624        all_values: Option<AllValuesIter>,
625    ) -> Iter<SetIter, AllValuesIter> {
626        match all_values {
627            Some(_) => Iter {
628                next_skipped_forward: set_values.next(),
629                next_skipped_backward: None,
630                set_values,
631                all_values,
632            },
633            None => Iter {
634                next_skipped_forward: None,
635                next_skipped_backward: None,
636                set_values,
637                all_values,
638            },
639        }
640    }
641}
642
643impl<SetIter, AllValuesIter> Iter<SetIter, AllValuesIter>
644where
645    SetIter: DoubleEndedIterator<Item = u32>,
646    AllValuesIter: DoubleEndedIterator<Item = u32>,
647{
648    fn new_bidirectional(
649        mut set_values: SetIter,
650        all_values: Option<AllValuesIter>,
651    ) -> Iter<SetIter, AllValuesIter> {
652        match all_values {
653            Some(_) => Iter {
654                next_skipped_forward: set_values.next(),
655                next_skipped_backward: set_values.next_back(),
656                set_values,
657                all_values,
658            },
659            None => Iter {
660                set_values,
661                all_values,
662                next_skipped_forward: None,
663                next_skipped_backward: None,
664            },
665        }
666    }
667}
668
669impl<SetIter, AllValuesIter> Iterator for Iter<SetIter, AllValuesIter>
670where
671    SetIter: Iterator<Item = u32>,
672    AllValuesIter: Iterator<Item = u32>,
673{
674    type Item = u32;
675
676    fn next(&mut self) -> Option<u32> {
677        let Some(all_values_it) = &mut self.all_values else {
678            return self.set_values.next();
679        };
680
681        for index in all_values_it.by_ref() {
682            let index = index.to_u32();
683            loop {
684                let Some(skip) = self.next_skipped_forward else {
685                    // There are no skips left in the iterator, but there may still be a skipped
686                    // number on the backwards iteration, so check that.
687                    if let Some(skip) = self.next_skipped_backward {
688                        if skip == index {
689                            // this index should be skipped, go to the next one.
690                            break;
691                        }
692                    }
693                    // No-longer any values to skip, can freely return index
694                    return Some(index);
695                };
696
697                if index < skip {
698                    // Not a skipped value
699                    return Some(index);
700                }
701
702                self.next_skipped_forward = self.set_values.next();
703                if index > skip {
704                    // We've passed the skip value, need to check the next one.
705                    continue;
706                }
707
708                // index == skip, so we need to skip this index.
709                break;
710            }
711        }
712        None
713    }
714}
715
716impl<SetIter, AllValuesIter> DoubleEndedIterator for Iter<SetIter, AllValuesIter>
717where
718    SetIter: DoubleEndedIterator<Item = u32>,
719    AllValuesIter: DoubleEndedIterator<Item = u32>,
720{
721    fn next_back(&mut self) -> Option<Self::Item> {
722        let Some(all_values_it) = &mut self.all_values else {
723            return self.set_values.next_back();
724        };
725
726        for index in all_values_it.by_ref().rev() {
727            let index = index.to_u32();
728            loop {
729                let Some(skip) = self.next_skipped_backward else {
730                    // There are no skips left in the iterator, but there may still be a skipped
731                    // number on the backwards iteration, so check that.
732                    if let Some(skip) = self.next_skipped_forward {
733                        if skip == index {
734                            // this index should be skipped, go to the next one.
735                            break;
736                        }
737                    }
738                    // No-longer any values to skip, can freely return index
739                    return Some(index);
740                };
741
742                if index > skip {
743                    // Not a skipped value
744                    return Some(index);
745                }
746
747                self.next_skipped_backward = self.set_values.next_back();
748                if index < skip {
749                    // We've passed the skip value, need to check the next one.
750                    continue;
751                }
752
753                // index == skip, so we need to skip this index.
754                break;
755            }
756        }
757        None
758    }
759}
760
761enum RangeIter<'a, InclusiveRangeIter, AllValuesIter, T>
762where
763    InclusiveRangeIter: Iterator<Item = RangeInclusive<u32>>,
764    AllValuesIter: Iterator<Item = u32>,
765    T: Domain,
766{
767    Inclusive {
768        ranges: InclusiveRangeIter,
769    },
770    InclusiveDiscontinuous {
771        ranges: InclusiveRangeIter,
772        current_range: Option<RangeInclusive<u32>>,
773        phantom: PhantomData<T>,
774    },
775    Exclusive {
776        ranges: InclusiveRangeIter,
777        min: u32,
778        max: u32,
779        done: bool,
780    },
781    ExclusiveDiscontinuous {
782        all_values: Option<AllValuesIter>,
783        set: &'a BitSet,
784        next_value: Option<u32>,
785    },
786}
787
788impl<InclusiveRangeIter, AllValuesIter, T> Iterator
789    for RangeIter<'_, InclusiveRangeIter, AllValuesIter, T>
790where
791    InclusiveRangeIter: Iterator<Item = RangeInclusive<u32>>,
792    AllValuesIter: Iterator<Item = u32>,
793    T: Domain,
794{
795    type Item = RangeInclusive<u32>;
796
797    fn next(&mut self) -> Option<Self::Item> {
798        match self {
799            RangeIter::Inclusive { ranges } => ranges.next(),
800            RangeIter::InclusiveDiscontinuous {
801                ranges,
802                current_range,
803                phantom: _,
804            } => loop {
805                // Discontinuous domains need special handling since members of the domain may be adjacent
806                // while their u32 representations may not be. So this iterator implementation compares successive
807                // ranges from the underlying u32 range iterator and merges any ranges that are found to be adjacent
808                // in the domain of type T.
809                let Some(next_range) = ranges.next() else {
810                    // No more ranges, commit the one we've got.
811                    return current_range.take();
812                };
813
814                let Some(range) = current_range.clone() else {
815                    // Populate current range, then move to the next so we can check if it's adjacent.
816                    *current_range = Some(next_range);
817                    continue;
818                };
819
820                // Check if next_range can merge into current_range
821                if RangeIter::<InclusiveRangeIter, AllValuesIter, T>::are_values_adjacent(
822                    *range.end(),
823                    *next_range.start(),
824                ) {
825                    // Do the merge, and check next
826                    *current_range = Some(*range.start()..=*next_range.end());
827                    continue;
828                }
829
830                // No merge is possible, return current range and replace it with next
831                *current_range = Some(next_range);
832                return Some(range);
833            },
834            RangeIter::Exclusive {
835                ranges,
836                min,
837                max,
838                done,
839            } => RangeIter::<InclusiveRangeIter, AllValuesIter, T>::next_exclusive(
840                ranges, min, max, done,
841            ),
842            RangeIter::ExclusiveDiscontinuous {
843                all_values,
844                set,
845                next_value,
846            } => RangeIter::<InclusiveRangeIter, AllValuesIter, T>::next_discontinuous(
847                all_values, set, next_value,
848            ),
849        }
850    }
851}
852
853impl<'a, InclusiveRangeIter, AllValuesIter, T> RangeIter<'a, InclusiveRangeIter, AllValuesIter, T>
854where
855    InclusiveRangeIter: Iterator<Item = RangeInclusive<u32>>,
856    AllValuesIter: Iterator<Item = u32>,
857    T: Domain,
858{
859    /// Iterate the ranges of an exclusive set where the domain is continuous.
860    fn next_exclusive(
861        ranges: &mut InclusiveRangeIter,
862        min: &mut u32,
863        max: &mut u32,
864        done: &mut bool,
865    ) -> Option<RangeInclusive<u32>> {
866        if *done {
867            return None;
868        }
869
870        loop {
871            let next_range = ranges.next();
872
873            let Some(next_range) = next_range else {
874                *done = true;
875                return Some(*min..=*max);
876            };
877
878            if next_range.contains(min) {
879                if *next_range.end() >= *max {
880                    break;
881                }
882                *min = next_range.end() + 1;
883                continue;
884            }
885
886            let result = *min..=(next_range.start() - 1);
887            if *next_range.end() < *max {
888                *min = next_range.end() + 1;
889            } else {
890                *done = true;
891            }
892            return Some(result);
893        }
894
895        *done = true;
896        None
897    }
898
899    /// Iterate the ranges of an exclusive set where the domain is discontinuous.
900    fn next_discontinuous(
901        all_values: &mut Option<AllValuesIter>,
902        set: &'a BitSet,
903        next_value: &mut Option<u32>,
904    ) -> Option<RangeInclusive<u32>> {
905        let all_values_iter = all_values.as_mut().unwrap();
906
907        let mut current_range: Option<RangeInclusive<u32>> = None;
908        loop {
909            let next = next_value.take().or_else(|| all_values_iter.next());
910            let Some(next) = next else {
911                // No more values, so the current range is over, return it.
912                return current_range;
913            };
914
915            if set.contains(next) {
916                if let Some(range) = current_range {
917                    // current range has ended, return it. No need to save 'next' as it's not in the set.
918                    return Some(range);
919                }
920                continue;
921            }
922
923            let Some(range) = current_range.as_ref() else {
924                current_range = Some(next..=next);
925                continue;
926            };
927
928            current_range = Some(*range.start()..=next);
929        }
930    }
931
932    fn are_values_adjacent(a: u32, b: u32) -> bool {
933        let mut it = T::ordered_values_range(T::from_u32(InDomain(a))..=T::from_u32(InDomain(b)));
934        it.next(); // skip 'a'
935        if let Some(second) = it.next() {
936            // if a and b are adject then the second value in the iterator should be 'b'
937            return second.to_u32() == b.to_u32();
938        }
939        false
940    }
941}
942
943impl Domain for u32 {
944    fn to_u32(&self) -> u32 {
945        *self
946    }
947
948    fn from_u32(member: InDomain) -> u32 {
949        member.value()
950    }
951
952    fn is_continuous() -> bool {
953        true
954    }
955
956    fn ordered_values() -> impl DoubleEndedIterator<Item = u32> {
957        u32::MIN..=u32::MAX
958    }
959
960    fn ordered_values_range(range: RangeInclusive<u32>) -> impl DoubleEndedIterator<Item = u32> {
961        range
962    }
963
964    fn count() -> u64 {
965        (u32::MAX as u64) - (u32::MIN as u64) + 1
966    }
967}
968
969impl Domain for u16 {
970    fn to_u32(&self) -> u32 {
971        *self as u32
972    }
973
974    fn from_u32(member: InDomain) -> u16 {
975        member.value() as u16
976    }
977
978    fn is_continuous() -> bool {
979        true
980    }
981
982    fn ordered_values() -> impl DoubleEndedIterator<Item = u32> {
983        (u16::MIN as u32)..=(u16::MAX as u32)
984    }
985
986    fn ordered_values_range(range: RangeInclusive<u16>) -> impl DoubleEndedIterator<Item = u32> {
987        (*range.start() as u32)..=(*range.end() as u32)
988    }
989
990    fn count() -> u64 {
991        (u16::MAX as u64) - (u16::MIN as u64) + 1
992    }
993}
994
995impl Domain for u8 {
996    fn to_u32(&self) -> u32 {
997        *self as u32
998    }
999
1000    fn from_u32(member: InDomain) -> u8 {
1001        member.value() as u8
1002    }
1003
1004    fn is_continuous() -> bool {
1005        true
1006    }
1007
1008    fn ordered_values() -> impl DoubleEndedIterator<Item = u32> {
1009        (u8::MIN as u32)..=(u8::MAX as u32)
1010    }
1011
1012    fn ordered_values_range(range: RangeInclusive<u8>) -> impl DoubleEndedIterator<Item = u32> {
1013        (*range.start() as u32)..=(*range.end() as u32)
1014    }
1015
1016    fn count() -> u64 {
1017        (u8::MAX as u64) - (u8::MIN as u64) + 1
1018    }
1019}
1020
1021impl Domain for GlyphId16 {
1022    fn to_u32(&self) -> u32 {
1023        self.to_u16() as u32
1024    }
1025
1026    fn from_u32(member: InDomain) -> GlyphId16 {
1027        GlyphId16::new(member.value() as u16)
1028    }
1029
1030    fn is_continuous() -> bool {
1031        true
1032    }
1033
1034    fn ordered_values() -> impl DoubleEndedIterator<Item = u32> {
1035        (u16::MIN as u32)..=(u16::MAX as u32)
1036    }
1037
1038    fn ordered_values_range(
1039        range: RangeInclusive<GlyphId16>,
1040    ) -> impl DoubleEndedIterator<Item = u32> {
1041        range.start().to_u32()..=range.end().to_u32()
1042    }
1043
1044    fn count() -> u64 {
1045        (u16::MAX as u64) - (u16::MIN as u64) + 1
1046    }
1047}
1048
1049impl Domain for GlyphId {
1050    fn to_u32(&self) -> u32 {
1051        GlyphId::to_u32(*self)
1052    }
1053
1054    fn from_u32(member: InDomain) -> GlyphId {
1055        GlyphId::from(member.value())
1056    }
1057
1058    fn is_continuous() -> bool {
1059        true
1060    }
1061
1062    fn ordered_values() -> impl DoubleEndedIterator<Item = u32> {
1063        u32::MIN..=u32::MAX
1064    }
1065
1066    fn ordered_values_range(
1067        range: RangeInclusive<GlyphId>,
1068    ) -> impl DoubleEndedIterator<Item = u32> {
1069        range.start().to_u32()..=range.end().to_u32()
1070    }
1071
1072    fn count() -> u64 {
1073        (u32::MAX as u64) - (u32::MIN as u64) + 1
1074    }
1075}
1076
1077impl Domain for Tag {
1078    fn to_u32(&self) -> u32 {
1079        u32::from_be_bytes(self.to_be_bytes())
1080    }
1081
1082    fn from_u32(member: InDomain) -> Tag {
1083        Tag::from_u32(member.value())
1084    }
1085
1086    fn is_continuous() -> bool {
1087        true
1088    }
1089
1090    fn ordered_values() -> impl DoubleEndedIterator<Item = u32> {
1091        u32::MIN..=u32::MAX
1092    }
1093
1094    fn ordered_values_range(range: RangeInclusive<Tag>) -> impl DoubleEndedIterator<Item = u32> {
1095        range.start().to_u32()..=range.end().to_u32()
1096    }
1097
1098    fn count() -> u64 {
1099        (u32::MAX as u64) - (u32::MIN as u64) + 1
1100    }
1101}
1102
1103impl Domain for NameId {
1104    fn to_u32(&self) -> u32 {
1105        self.to_u16() as u32
1106    }
1107
1108    fn from_u32(member: InDomain) -> NameId {
1109        NameId::new(member.value() as u16)
1110    }
1111
1112    fn is_continuous() -> bool {
1113        true
1114    }
1115
1116    fn ordered_values() -> impl DoubleEndedIterator<Item = u32> {
1117        (u16::MIN as u32)..=(u16::MAX as u32)
1118    }
1119
1120    fn ordered_values_range(range: RangeInclusive<NameId>) -> impl DoubleEndedIterator<Item = u32> {
1121        (range.start().to_u16() as u32)..=(range.end().to_u16() as u32)
1122    }
1123
1124    fn count() -> u64 {
1125        (u16::MAX as u64) - (u16::MIN as u64) + 1
1126    }
1127}
1128
1129#[cfg(test)]
1130mod test {
1131    use core::cmp::Ordering;
1132    use std::{
1133        collections::HashSet,
1134        hash::{DefaultHasher, Hash, Hasher},
1135    };
1136
1137    use super::*;
1138
1139    #[derive(PartialEq, Eq, Debug, PartialOrd, Ord, Clone)]
1140    struct EvenInts(u16);
1141
1142    impl Domain for EvenInts {
1143        fn to_u32(&self) -> u32 {
1144            self.0 as u32
1145        }
1146
1147        fn from_u32(member: InDomain) -> EvenInts {
1148            EvenInts(member.0 as u16)
1149        }
1150
1151        fn is_continuous() -> bool {
1152            false
1153        }
1154
1155        fn ordered_values() -> impl DoubleEndedIterator<Item = u32> {
1156            (u16::MIN..=u16::MAX)
1157                .filter(|v| v % 2 == 0)
1158                .map(|v| v as u32)
1159        }
1160
1161        fn ordered_values_range(
1162            range: RangeInclusive<EvenInts>,
1163        ) -> impl DoubleEndedIterator<Item = u32> {
1164            Self::ordered_values()
1165                .filter(move |v| *v >= range.start().to_u32() && *v <= range.end().to_u32())
1166        }
1167
1168        fn count() -> u64 {
1169            ((u32::MAX as u64) - (u32::MIN as u64) + 1) / 2
1170        }
1171    }
1172
1173    #[derive(PartialEq, Eq, Debug, PartialOrd, Ord, Hash, Clone)]
1174    struct TwoParts(u16);
1175
1176    impl Domain for TwoParts {
1177        fn to_u32(&self) -> u32 {
1178            self.0 as u32
1179        }
1180
1181        fn from_u32(member: InDomain) -> TwoParts {
1182            TwoParts(member.0 as u16)
1183        }
1184
1185        fn is_continuous() -> bool {
1186            false
1187        }
1188
1189        fn ordered_values() -> impl DoubleEndedIterator<Item = u32> {
1190            [2..=5, 8..=16].into_iter().flat_map(|it| it.into_iter())
1191        }
1192
1193        fn ordered_values_range(
1194            range: RangeInclusive<TwoParts>,
1195        ) -> impl DoubleEndedIterator<Item = u32> {
1196            Self::ordered_values()
1197                .filter(move |v| *v >= range.start().to_u32() && *v <= range.end().to_u32())
1198        }
1199
1200        fn count() -> u64 {
1201            4 + 9
1202        }
1203    }
1204
1205    #[derive(PartialEq, Eq, Debug, PartialOrd, Ord)]
1206    struct TwoPartsBounds(u32);
1207
1208    impl Domain for TwoPartsBounds {
1209        fn to_u32(&self) -> u32 {
1210            self.0
1211        }
1212
1213        fn from_u32(member: InDomain) -> TwoPartsBounds {
1214            TwoPartsBounds(member.0)
1215        }
1216
1217        fn is_continuous() -> bool {
1218            false
1219        }
1220
1221        fn ordered_values() -> impl DoubleEndedIterator<Item = u32> {
1222            [0..=1, u32::MAX - 1..=u32::MAX]
1223                .into_iter()
1224                .flat_map(|it| it.into_iter())
1225        }
1226
1227        fn ordered_values_range(
1228            range: RangeInclusive<TwoPartsBounds>,
1229        ) -> impl DoubleEndedIterator<Item = u32> {
1230            Self::ordered_values()
1231                .filter(move |v| *v >= range.start().to_u32() && *v <= range.end().to_u32())
1232        }
1233
1234        fn count() -> u64 {
1235            4
1236        }
1237    }
1238
1239    #[test]
1240    fn from_sparse_set() {
1241        let bytes = [0b00001101, 0b00000011, 0b00110001];
1242
1243        let set = IntSet::<u32>::from_sparse_bit_set(&bytes).unwrap();
1244
1245        let mut expected: IntSet<u32> = IntSet::<u32>::empty();
1246        expected.insert_range(0..=17);
1247
1248        assert_eq!(set, expected);
1249    }
1250
1251    #[test]
1252    fn insert() {
1253        let mut empty = IntSet::<u32>::empty();
1254        let mut all = IntSet::<u32>::all();
1255
1256        assert!(!empty.contains(10));
1257        assert!(empty.insert(10));
1258        assert!(empty.contains(10));
1259        assert!(!empty.insert(10));
1260
1261        assert!(all.contains(10));
1262        assert!(!all.insert(10));
1263        assert!(all.contains(10));
1264        assert!(!all.insert(10));
1265    }
1266
1267    #[test]
1268    fn remove() {
1269        let mut empty = IntSet::<u32>::empty();
1270        empty.insert(10);
1271        let mut all = IntSet::<u32>::all();
1272
1273        assert!(empty.contains(10));
1274        assert!(empty.remove(10));
1275        assert!(!empty.contains(10));
1276        assert!(!empty.remove(10));
1277
1278        assert!(all.contains(10));
1279        assert!(all.remove(10));
1280        assert!(!all.contains(10));
1281        assert!(!all.remove(10));
1282    }
1283
1284    #[test]
1285    fn is_empty() {
1286        let mut set = IntSet::<u32>::empty();
1287
1288        assert!(set.is_empty());
1289        set.insert(13);
1290        set.insert(800);
1291        assert!(!set.is_empty());
1292
1293        set.invert();
1294        assert!(!set.is_empty());
1295
1296        let mut empty = IntSet::<u32>::empty();
1297        assert!(empty.is_empty());
1298        empty.invert();
1299        assert!(!empty.is_empty());
1300    }
1301
1302    #[test]
1303    fn first() {
1304        let set = IntSet::<u16>::empty();
1305        assert_eq!(set.first(), None);
1306
1307        let set = IntSet::<u16>::all();
1308        assert_eq!(set.first(), Some(0));
1309
1310        let mut set = IntSet::<u16>::empty();
1311        set.extend([0]);
1312        assert_eq!(set.first(), Some(0));
1313
1314        let mut set = IntSet::<u16>::empty();
1315        set.extend([u16::MAX]);
1316        assert_eq!(set.first(), Some(u16::MAX));
1317
1318        let mut set = IntSet::<u16>::empty();
1319        set.extend([100, 1000, 10000]);
1320        assert_eq!(set.first(), Some(100));
1321
1322        set.invert();
1323        assert_eq!(set.first(), Some(0));
1324
1325        set.remove_range(0..=100);
1326        assert_eq!(set.first(), Some(101));
1327    }
1328
1329    #[test]
1330    fn last() {
1331        let set = IntSet::<u16>::empty();
1332        assert_eq!(set.last(), None);
1333
1334        let set = IntSet::<u16>::all();
1335        assert_eq!(set.last(), Some(u16::MAX));
1336
1337        let mut set = IntSet::<u16>::empty();
1338        set.extend([0]);
1339        assert_eq!(set.last(), Some(0));
1340
1341        let mut set = IntSet::<u16>::empty();
1342        set.extend([u16::MAX]);
1343        assert_eq!(set.last(), Some(u16::MAX));
1344
1345        let mut set = IntSet::<u16>::empty();
1346        set.extend([5, 7, 8]);
1347        assert_eq!(set.last(), Some(8));
1348
1349        let mut set = IntSet::<u16>::empty();
1350        set.extend([100, 1000, 10000]);
1351        assert_eq!(set.last(), Some(10000));
1352
1353        set.invert();
1354        assert_eq!(set.last(), Some(u16::MAX));
1355
1356        set.remove_range(u16::MAX - 10..=u16::MAX);
1357        assert_eq!(set.last(), Some(u16::MAX - 11));
1358    }
1359
1360    #[test]
1361    fn clear() {
1362        let mut set = IntSet::<u32>::empty();
1363        set.insert(13);
1364        set.insert(800);
1365
1366        let mut set_inverted = IntSet::<u32>::empty();
1367        set_inverted.insert(13);
1368        set_inverted.insert(800);
1369        set_inverted.invert();
1370
1371        set.clear();
1372        assert!(set.is_empty());
1373        set_inverted.clear();
1374        assert!(set_inverted.is_empty());
1375    }
1376
1377    fn hash<T>(set: &IntSet<T>) -> u64
1378    where
1379        T: Domain,
1380    {
1381        let mut h = DefaultHasher::new();
1382        set.hash(&mut h);
1383        h.finish()
1384    }
1385
1386    #[test]
1387    #[allow(clippy::mutable_key_type)]
1388    fn equal_and_hash() {
1389        let mut inc1 = IntSet::<u32>::empty();
1390        inc1.insert(14);
1391        inc1.insert(670);
1392
1393        let mut inc2 = IntSet::<u32>::empty();
1394        inc2.insert(670);
1395        inc2.insert(14);
1396
1397        let mut inc3 = inc1.clone();
1398        inc3.insert(5);
1399
1400        let mut exc = inc1.clone();
1401        exc.invert();
1402
1403        assert_eq!(inc1, inc2);
1404        assert_ne!(inc1, inc3);
1405        assert_ne!(inc1, exc);
1406
1407        let set = HashSet::from([inc1.clone(), inc3.clone(), exc.clone()]);
1408        assert!(set.contains(&inc1));
1409        assert!(set.contains(&inc3));
1410        assert!(set.contains(&exc));
1411
1412        assert_ne!(hash(&inc1), hash(&exc));
1413        assert_eq!(hash(&inc1), hash(&inc2));
1414    }
1415
1416    #[test]
1417    #[allow(clippy::mutable_key_type)]
1418    fn equal_and_hash_mixed_membership_types() {
1419        let mut inverted_all = IntSet::<TwoParts>::all();
1420        let mut all = IntSet::<TwoParts>::empty();
1421        for v in TwoParts::ordered_values() {
1422            all.insert(TwoParts(v as u16));
1423        }
1424
1425        assert_eq!(inverted_all, all);
1426        assert_eq!(hash(&all), hash(&inverted_all));
1427
1428        inverted_all.remove(TwoParts(5));
1429        assert_ne!(inverted_all, all);
1430
1431        all.remove(TwoParts(5));
1432        assert_eq!(inverted_all, all);
1433        assert_eq!(hash(&all), hash(&inverted_all));
1434    }
1435
1436    #[test]
1437    fn iter() {
1438        let mut set = IntSet::<u32>::empty();
1439        set.insert(3);
1440        set.insert(8);
1441        set.insert(534);
1442        set.insert(700);
1443        set.insert(10000);
1444        set.insert(10001);
1445        set.insert(10002);
1446
1447        let v: Vec<u32> = set.iter().collect();
1448        assert_eq!(v, vec![3, 8, 534, 700, 10000, 10001, 10002]);
1449
1450        let v: Vec<u32> = set.inclusive_iter().unwrap().collect();
1451        assert_eq!(v, vec![3, 8, 534, 700, 10000, 10001, 10002]);
1452    }
1453
1454    #[test]
1455    fn iter_backwards() {
1456        let mut set = IntSet::<u32>::empty();
1457        set.insert_range(1..=6);
1458        {
1459            let mut it = set.iter();
1460            assert_eq!(Some(1), it.next());
1461            assert_eq!(Some(6), it.next_back());
1462            assert_eq!(Some(5), it.next_back());
1463            assert_eq!(Some(2), it.next());
1464            assert_eq!(Some(3), it.next());
1465            assert_eq!(Some(4), it.next());
1466            assert_eq!(None, it.next());
1467            assert_eq!(None, it.next_back());
1468        }
1469
1470        let mut set = IntSet::<u8>::empty();
1471        set.invert();
1472        set.remove_range(10..=255);
1473        set.remove(4);
1474        set.remove(8);
1475        {
1476            let mut it = set.iter();
1477            assert_eq!(Some(0), it.next());
1478            assert_eq!(Some(1), it.next());
1479            assert_eq!(Some(2), it.next());
1480            assert_eq!(Some(3), it.next());
1481
1482            assert_eq!(Some(9), it.next_back());
1483            assert_eq!(Some(7), it.next_back());
1484            assert_eq!(Some(6), it.next_back());
1485            assert_eq!(Some(5), it.next_back());
1486            assert_eq!(None, it.next_back());
1487
1488            assert_eq!(None, it.next());
1489        }
1490
1491        let mut set = IntSet::<u8>::empty();
1492        set.invert();
1493        set.remove_range(10..=255);
1494        set.remove(4);
1495        set.remove(8);
1496        {
1497            let mut it = set.iter();
1498            assert_eq!(Some(0), it.next());
1499            assert_eq!(Some(1), it.next());
1500            assert_eq!(Some(2), it.next());
1501            assert_eq!(Some(3), it.next());
1502            assert_eq!(Some(5), it.next());
1503
1504            assert_eq!(Some(9), it.next_back());
1505            assert_eq!(Some(7), it.next_back());
1506            assert_eq!(Some(6), it.next_back());
1507            assert_eq!(None, it.next_back());
1508
1509            assert_eq!(None, it.next());
1510        }
1511    }
1512
1513    #[test]
1514    fn exclusive_iter() {
1515        let mut set = IntSet::<u32>::all();
1516        set.remove(3);
1517        set.remove(7);
1518        set.remove(8);
1519
1520        let mut iter = set.iter();
1521
1522        assert_eq!(iter.next(), Some(0));
1523        assert_eq!(iter.next(), Some(1));
1524        assert_eq!(iter.next(), Some(2));
1525        assert_eq!(iter.next(), Some(4));
1526        assert_eq!(iter.next(), Some(5));
1527        assert_eq!(iter.next(), Some(6));
1528        assert_eq!(iter.next(), Some(9));
1529        assert_eq!(iter.next(), Some(10));
1530
1531        assert!(set.inclusive_iter().is_none());
1532
1533        // Forward skip first
1534        let mut set = IntSet::<u32>::all();
1535        set.remove_range(0..=200);
1536
1537        let mut iter = set.iter();
1538        assert_eq!(iter.next(), Some(201));
1539
1540        // Backward skip first
1541        let mut set = IntSet::<u8>::all();
1542        set.remove_range(200..=255);
1543
1544        let mut iter = set.iter();
1545        assert_eq!(iter.next_back(), Some(199));
1546    }
1547
1548    #[test]
1549    fn iter_ranges_inclusive() {
1550        let mut set = IntSet::<u32>::empty();
1551        let items: Vec<_> = set.iter_ranges().collect();
1552        assert_eq!(items, vec![]);
1553
1554        set.insert_range(200..=700);
1555        set.insert(5);
1556        let items: Vec<_> = set.iter_ranges().collect();
1557        assert_eq!(items, vec![5..=5, 200..=700]);
1558
1559        let mut set = IntSet::<u32>::empty();
1560        set.insert_range(0..=0);
1561        set.insert_range(u32::MAX..=u32::MAX);
1562        let items: Vec<_> = set.iter_ranges().collect();
1563        assert_eq!(items, vec![0..=0, u32::MAX..=u32::MAX]);
1564
1565        let mut set = IntSet::<u32>::empty();
1566        set.insert_range(0..=5);
1567        set.insert_range(u32::MAX - 5..=u32::MAX);
1568        let items: Vec<_> = set.iter_ranges().collect();
1569        assert_eq!(items, vec![0..=5, u32::MAX - 5..=u32::MAX]);
1570
1571        let mut inverted = set.clone();
1572        inverted.invert();
1573        assert_eq!(
1574            set.iter_ranges().collect::<Vec<_>>(),
1575            inverted.iter_excluded_ranges().collect::<Vec<_>>()
1576        );
1577    }
1578
1579    #[test]
1580    fn iter_ranges_inclusive_discontinuous() {
1581        let mut set = IntSet::<EvenInts>::empty();
1582        let items: Vec<_> = set.iter_ranges().collect();
1583        assert_eq!(items, vec![]);
1584
1585        set.insert_range(EvenInts(4)..=EvenInts(12));
1586        set.insert(EvenInts(16));
1587
1588        let items: Vec<_> = set.iter_ranges().collect();
1589        assert_eq!(
1590            items,
1591            vec![EvenInts(4)..=EvenInts(12), EvenInts(16)..=EvenInts(16)]
1592        );
1593
1594        let mut inverted = set.clone();
1595        inverted.invert();
1596        assert_eq!(
1597            set.iter_ranges().collect::<Vec<_>>(),
1598            inverted.iter_excluded_ranges().collect::<Vec<_>>()
1599        );
1600    }
1601
1602    #[test]
1603    fn iter_ranges_exclusive() {
1604        let mut set = IntSet::<u32>::all();
1605        set.remove_range(200..=700);
1606        set.remove(5);
1607        let items: Vec<_> = set.iter_ranges().collect();
1608        assert_eq!(items, vec![0..=4, 6..=199, 701..=u32::MAX]);
1609
1610        let mut set = IntSet::<u32>::all();
1611        set.remove_range(0..=700);
1612        let items: Vec<_> = set.iter_ranges().collect();
1613        assert_eq!(items, vec![701..=u32::MAX]);
1614
1615        let mut inverted = set.clone();
1616        inverted.invert();
1617        assert_eq!(
1618            set.iter_ranges().collect::<Vec<_>>(),
1619            inverted.iter_excluded_ranges().collect::<Vec<_>>()
1620        );
1621
1622        let mut set = IntSet::<u32>::all();
1623        set.remove_range(u32::MAX - 10..=u32::MAX);
1624        let items: Vec<_> = set.iter_ranges().collect();
1625        assert_eq!(items, vec![0..=u32::MAX - 11]);
1626
1627        let mut set = IntSet::<u16>::all();
1628        set.remove_range(0..=u16::MAX);
1629        let items: Vec<_> = set.iter_ranges().collect();
1630        assert_eq!(items, vec![]);
1631
1632        let mut set = IntSet::<u16>::all();
1633        set.remove_range(0..=u16::MAX - 1);
1634        let items: Vec<_> = set.iter_ranges().collect();
1635        assert_eq!(items, vec![u16::MAX..=u16::MAX]);
1636
1637        let mut set = IntSet::<u16>::all();
1638        set.remove_range(1..=u16::MAX);
1639        let items: Vec<_> = set.iter_ranges().collect();
1640        assert_eq!(items, vec![0..=0]);
1641
1642        let set = IntSet::<u32>::all();
1643        let items: Vec<_> = set.iter_ranges().collect();
1644        assert_eq!(items, vec![0..=u32::MAX]);
1645    }
1646
1647    #[test]
1648    fn iter_ranges_exclusive_discontinuous() {
1649        let mut set = IntSet::<EvenInts>::all();
1650        set.remove_range(EvenInts(0)..=EvenInts(8));
1651        set.remove_range(EvenInts(16)..=EvenInts(u16::MAX - 1));
1652        let items: Vec<_> = set.iter_ranges().collect();
1653        assert_eq!(items, vec![EvenInts(10)..=EvenInts(14),]);
1654
1655        let mut set = IntSet::<TwoParts>::all();
1656        set.remove_range(TwoParts(11)..=TwoParts(13));
1657        let items: Vec<_> = set.iter_ranges().collect();
1658        assert_eq!(
1659            items,
1660            vec![TwoParts(2)..=TwoParts(10), TwoParts(14)..=TwoParts(16),]
1661        );
1662
1663        let mut inverted = set.clone();
1664        inverted.invert();
1665        assert_eq!(
1666            set.iter_ranges().collect::<Vec<_>>(),
1667            inverted.iter_excluded_ranges().collect::<Vec<_>>()
1668        );
1669
1670        let mut set = IntSet::<TwoParts>::all();
1671        set.remove_range(TwoParts(2)..=TwoParts(16));
1672        let items: Vec<_> = set.iter_ranges().collect();
1673        assert_eq!(items, vec![]);
1674
1675        let mut set = IntSet::<TwoParts>::all();
1676        set.remove_range(TwoParts(2)..=TwoParts(5));
1677        let items: Vec<_> = set.iter_ranges().collect();
1678        assert_eq!(items, vec![TwoParts(8)..=TwoParts(16),]);
1679
1680        let mut set = IntSet::<TwoParts>::all();
1681        set.remove_range(TwoParts(6)..=TwoParts(16));
1682        let items: Vec<_> = set.iter_ranges().collect();
1683        assert_eq!(items, vec![TwoParts(2)..=TwoParts(5),]);
1684
1685        // Check we can safely iterate to the limits of u32.
1686        let set = IntSet::<TwoPartsBounds>::all();
1687        let items: Vec<_> = set.iter_ranges().collect();
1688        assert_eq!(items, vec![TwoPartsBounds(0)..=TwoPartsBounds(u32::MAX),]);
1689    }
1690
1691    #[test]
1692    fn iter_after() {
1693        let mut set = IntSet::<u32>::empty();
1694        assert_eq!(set.iter_after(0).collect::<Vec<u32>>(), vec![]);
1695
1696        set.extend([5, 7, 10, 1250, 1300, 3001]);
1697
1698        assert_eq!(
1699            set.iter_after(0).collect::<Vec<u32>>(),
1700            vec![5, 7, 10, 1250, 1300, 3001]
1701        );
1702
1703        assert_eq!(
1704            set.iter_after(5).collect::<Vec<u32>>(),
1705            vec![7, 10, 1250, 1300, 3001]
1706        );
1707        assert_eq!(
1708            set.iter_after(700).collect::<Vec<u32>>(),
1709            vec![1250, 1300, 3001]
1710        );
1711    }
1712
1713    #[test]
1714    fn iter_after_exclusive() {
1715        let mut set = IntSet::<u32>::empty();
1716        set.extend([5, 7, 10, 1250, 1300, 3001]);
1717        set.invert();
1718
1719        assert_eq!(
1720            set.iter_after(3).take(5).collect::<Vec<u32>>(),
1721            vec![4, 6, 8, 9, 11]
1722        );
1723
1724        assert_eq!(
1725            set.iter_after(0).take(5).collect::<Vec<u32>>(),
1726            vec![1, 2, 3, 4, 6]
1727        );
1728
1729        assert_eq!(
1730            set.iter_after(u32::MAX - 1).take(1).collect::<Vec<u32>>(),
1731            vec![u32::MAX]
1732        );
1733        assert_eq!(
1734            set.iter_after(u32::MAX).take(1).collect::<Vec<u32>>(),
1735            vec![]
1736        );
1737        set.remove(u32::MAX);
1738        assert_eq!(
1739            set.iter_after(u32::MAX - 1).take(1).collect::<Vec<u32>>(),
1740            vec![]
1741        );
1742    }
1743
1744    #[test]
1745    fn iter_after_discontinuous() {
1746        let mut set = IntSet::<EvenInts>::empty();
1747        set.extend([EvenInts(6), EvenInts(10)]);
1748        set.invert();
1749
1750        assert_eq!(
1751            set.iter_after(EvenInts(2))
1752                .take(5)
1753                .collect::<Vec<EvenInts>>(),
1754            vec![
1755                EvenInts(4),
1756                EvenInts(8),
1757                EvenInts(12),
1758                EvenInts(14),
1759                EvenInts(16)
1760            ]
1761        );
1762
1763        assert_eq!(
1764            set.iter_after(EvenInts(4))
1765                .take(5)
1766                .collect::<Vec<EvenInts>>(),
1767            vec![
1768                EvenInts(8),
1769                EvenInts(12),
1770                EvenInts(14),
1771                EvenInts(16),
1772                EvenInts(18)
1773            ]
1774        );
1775
1776        assert_eq!(
1777            set.iter_after(EvenInts(u16::MAX - 1))
1778                .collect::<Vec<EvenInts>>(),
1779            vec![]
1780        );
1781
1782        assert_eq!(
1783            set.iter_after(EvenInts(u16::MAX - 5))
1784                .collect::<Vec<EvenInts>>(),
1785            vec![EvenInts(u16::MAX - 3), EvenInts(u16::MAX - 1)]
1786        );
1787
1788        set.remove(EvenInts(u16::MAX - 1));
1789        assert_eq!(
1790            set.iter_after(EvenInts(u16::MAX - 5))
1791                .collect::<Vec<EvenInts>>(),
1792            vec![EvenInts(u16::MAX - 3),]
1793        );
1794    }
1795
1796    #[test]
1797    fn from_iterator() {
1798        let s: IntSet<u32> = [3, 8, 12, 589].into_iter().collect();
1799        let mut expected = IntSet::<u32>::empty();
1800        expected.insert(3);
1801        expected.insert(8);
1802        expected.insert(12);
1803        expected.insert(589);
1804
1805        assert_eq!(s, expected);
1806    }
1807
1808    #[test]
1809    fn from_int_set_iterator() {
1810        let s1: IntSet<u32> = [3, 8, 12, 589].into_iter().collect();
1811        let s2: IntSet<u32> = s1.iter().collect();
1812        assert_eq!(s1, s2);
1813    }
1814
1815    #[test]
1816    fn extend() {
1817        let mut s = IntSet::<u32>::empty();
1818        s.extend([3, 12]);
1819        s.extend([8, 10, 589]);
1820
1821        let mut expected = IntSet::<u32>::empty();
1822        expected.insert(3);
1823        expected.insert(8);
1824        expected.insert(10);
1825        expected.insert(12);
1826        expected.insert(589);
1827
1828        assert_eq!(s, expected);
1829    }
1830
1831    #[test]
1832    fn extend_on_inverted() {
1833        let mut s = IntSet::<u32>::all();
1834        for i in 10..=20 {
1835            s.remove(i);
1836        }
1837
1838        s.extend([12, 17, 18]);
1839
1840        assert!(!s.contains(11));
1841        assert!(s.contains(12));
1842        assert!(!s.contains(13));
1843
1844        assert!(!s.contains(16));
1845        assert!(s.contains(17));
1846        assert!(s.contains(18));
1847        assert!(!s.contains(19));
1848        assert!(s.contains(100));
1849    }
1850
1851    #[test]
1852    fn remove_all() {
1853        let mut empty = IntSet::<u32>::empty();
1854        let mut all = IntSet::<u32>::all();
1855
1856        empty.extend([1, 2, 3, 4]);
1857
1858        empty.remove_all([2, 3]);
1859        all.remove_all([2, 3]);
1860
1861        assert!(empty.contains(1));
1862        assert!(!empty.contains(2));
1863        assert!(!empty.contains(3));
1864        assert!(empty.contains(4));
1865
1866        assert!(all.contains(1));
1867        assert!(!all.contains(2));
1868        assert!(!all.contains(3));
1869        assert!(all.contains(4));
1870    }
1871
1872    #[test]
1873    fn remove_range() {
1874        let mut empty = IntSet::<u32>::empty();
1875        let mut all = IntSet::<u32>::all();
1876
1877        empty.extend([1, 2, 3, 4]);
1878
1879        empty.remove_range(2..=3);
1880        all.remove_range(2..=3);
1881
1882        assert!(empty.contains(1));
1883        assert!(!empty.contains(2));
1884        assert!(!empty.contains(3));
1885        assert!(empty.contains(4));
1886
1887        assert!(all.contains(1));
1888        assert!(!all.contains(2));
1889        assert!(!all.contains(3));
1890        assert!(all.contains(4));
1891    }
1892
1893    #[test]
1894    fn insert_remove_range_boundary() {
1895        let mut set = IntSet::<u32>::empty();
1896
1897        set.remove_range(u32::MAX - 10..=u32::MAX);
1898        assert!(!set.contains(u32::MAX));
1899        set.insert_range(u32::MAX - 10..=u32::MAX);
1900        assert!(set.contains(u32::MAX));
1901        set.remove_range(u32::MAX - 10..=u32::MAX);
1902        assert!(!set.contains(u32::MAX));
1903
1904        set.remove_range(0..=10);
1905        assert!(!set.contains(0));
1906        set.insert_range(0..=10);
1907        assert!(set.contains(0));
1908        set.remove_range(0..=10);
1909        assert!(!set.contains(0));
1910    }
1911
1912    #[test]
1913    fn insert_remove_range_exclusive_boundary() {
1914        let mut set = IntSet::<u32>::all();
1915
1916        set.remove_range(u32::MAX - 10..=u32::MAX);
1917        assert!(!set.contains(u32::MAX));
1918        set.insert_range(u32::MAX - 10..=u32::MAX);
1919        assert!(set.contains(u32::MAX));
1920        set.remove_range(u32::MAX - 10..=u32::MAX);
1921        assert!(!set.contains(u32::MAX));
1922
1923        set.remove_range(0..=10);
1924        assert!(!set.contains(0));
1925        set.insert_range(0..=10);
1926        assert!(set.contains(0));
1927        set.remove_range(0..=10);
1928        assert!(!set.contains(0));
1929    }
1930
1931    struct SetOpInput {
1932        has_x: bool,
1933        inverted: bool,
1934        has_page: bool,
1935    }
1936
1937    impl SetOpInput {
1938        fn get_all_inputs() -> Vec<SetOpInput> {
1939            let mut result: Vec<SetOpInput> = vec![];
1940            for has_x in [true, false] {
1941                for inverted in [true, false] {
1942                    result.push(SetOpInput {
1943                        has_x,
1944                        inverted,
1945                        has_page: false,
1946                    });
1947                    let can_have_empty_page = has_x == inverted;
1948                    if can_have_empty_page {
1949                        result.push(SetOpInput {
1950                            has_x,
1951                            inverted,
1952                            has_page: true,
1953                        });
1954                    }
1955                }
1956            }
1957            result
1958        }
1959
1960        fn to_set(&self, x: u32) -> IntSet<u32> {
1961            let mut s = IntSet::<u32>::empty();
1962            if self.inverted {
1963                s.invert();
1964            }
1965            if self.has_page {
1966                // Ensure a page exists for x.
1967                if self.inverted {
1968                    s.remove(x);
1969                } else {
1970                    s.insert(x);
1971                }
1972            }
1973            if self.has_x {
1974                s.insert(x);
1975            } else {
1976                s.remove(x);
1977            }
1978            s
1979        }
1980    }
1981
1982    fn set_operation_test_message(
1983        a: &SetOpInput,
1984        b: &SetOpInput,
1985        op_name: &str,
1986        should_contain_x: bool,
1987    ) -> String {
1988        format!(
1989            "{}{}{} {} {}{}{} failed. {}",
1990            if a.inverted { "i" } else { "" },
1991            if a.has_page { "p" } else { "" },
1992            if a.has_x { "13" } else { "" },
1993            op_name,
1994            if b.inverted { "i" } else { "" },
1995            if b.has_page { "p" } else { "" },
1996            if b.has_x { "13" } else { "" },
1997            if should_contain_x {
1998                "Result did not have 13."
1999            } else {
2000                "Result should not have 13."
2001            }
2002        )
2003    }
2004
2005    fn check_union(a: &SetOpInput, b: &SetOpInput) {
2006        let x = 13;
2007        let mut set_a = a.to_set(x);
2008        let set_b = b.to_set(x);
2009
2010        let should_contain_x = a.has_x || b.has_x;
2011        set_a.union(&set_b);
2012
2013        assert_eq!(
2014            set_a.contains(x),
2015            should_contain_x,
2016            "{}",
2017            set_operation_test_message(a, b, "union", should_contain_x)
2018        );
2019    }
2020
2021    fn check_intersect(a: &SetOpInput, b: &SetOpInput) {
2022        let x = 13;
2023        let mut set_a = a.to_set(x);
2024        let set_b = b.to_set(x);
2025
2026        let should_contain_x = a.has_x && b.has_x;
2027        set_a.intersect(&set_b);
2028
2029        assert_eq!(
2030            set_a.contains(x),
2031            should_contain_x,
2032            "{}",
2033            set_operation_test_message(a, b, "intersect", should_contain_x)
2034        );
2035    }
2036
2037    #[test]
2038    fn set_operations() {
2039        for a in SetOpInput::get_all_inputs() {
2040            for b in SetOpInput::get_all_inputs() {
2041                check_union(&a, &b);
2042                check_intersect(&a, &b);
2043            }
2044        }
2045    }
2046
2047    #[test]
2048    fn inverted() {
2049        let mut set = IntSet::<u32>::empty();
2050
2051        set.insert(13);
2052        set.insert(800);
2053        assert!(set.contains(13));
2054        assert!(set.contains(800));
2055        assert_eq!(set.len(), 2);
2056        assert!(!set.is_inverted());
2057
2058        set.invert();
2059        assert_eq!(set.len(), u32::MAX as u64 - 1);
2060        assert!(!set.contains(13));
2061        assert!(set.contains(80));
2062        assert!(!set.contains(800));
2063        assert!(set.is_inverted());
2064
2065        set.remove(80);
2066        assert!(!set.contains(80));
2067
2068        set.insert(13);
2069        assert!(set.contains(13));
2070
2071        set.invert();
2072        assert!(set.contains(80));
2073        assert!(set.contains(800));
2074    }
2075
2076    #[test]
2077    fn limited_domain_type() {
2078        let mut set = IntSet::<EvenInts>::empty();
2079
2080        set.insert(EvenInts(2));
2081        set.insert(EvenInts(8));
2082        set.insert(EvenInts(12));
2083        set.insert_range(EvenInts(20)..=EvenInts(34));
2084        set.remove_range(EvenInts(30)..=EvenInts(34));
2085
2086        assert!(set.contains(EvenInts(2)));
2087        assert!(!set.contains(EvenInts(4)));
2088
2089        assert!(!set.contains(EvenInts(18)));
2090        assert!(!set.contains(EvenInts(19)));
2091        assert!(set.contains(EvenInts(20)));
2092        assert!(!set.contains(EvenInts(21)));
2093        assert!(set.contains(EvenInts(28)));
2094        assert!(!set.contains(EvenInts(29)));
2095        assert!(!set.contains(EvenInts(30)));
2096
2097        let copy: IntSet<EvenInts> = set.iter().collect();
2098        assert_eq!(set, copy);
2099
2100        set.invert();
2101
2102        assert!(!set.contains(EvenInts(2)));
2103        assert!(set.contains(EvenInts(4)));
2104
2105        let Some(max) = set.iter().max() else {
2106            panic!("should have a max");
2107        };
2108
2109        assert_eq!(max.0, u16::MAX - 1);
2110
2111        {
2112            let mut it = set.iter();
2113            assert_eq!(it.next(), Some(EvenInts(0)));
2114            assert_eq!(it.next(), Some(EvenInts(4)));
2115            assert_eq!(it.next(), Some(EvenInts(6)));
2116            assert_eq!(it.next(), Some(EvenInts(10)));
2117            assert_eq!(it.next(), Some(EvenInts(14)));
2118        }
2119
2120        set.insert_range(EvenInts(6)..=EvenInts(10));
2121        {
2122            let mut it = set.iter();
2123            assert_eq!(it.next(), Some(EvenInts(0)));
2124            assert_eq!(it.next(), Some(EvenInts(4)));
2125            assert_eq!(it.next(), Some(EvenInts(6)));
2126            assert_eq!(it.next(), Some(EvenInts(8)));
2127            assert_eq!(it.next(), Some(EvenInts(10)));
2128            assert_eq!(it.next(), Some(EvenInts(14)));
2129        }
2130
2131        set.remove_range(EvenInts(6)..=EvenInts(10));
2132        {
2133            let mut it = set.iter();
2134            assert_eq!(it.next(), Some(EvenInts(0)));
2135            assert_eq!(it.next(), Some(EvenInts(4)));
2136            assert_eq!(it.next(), Some(EvenInts(14)));
2137        }
2138    }
2139
2140    #[test]
2141    fn with_u16() {
2142        let mut set = IntSet::<u16>::empty();
2143
2144        set.insert(5);
2145        set.insert(8);
2146        set.insert(12);
2147        set.insert_range(200..=210);
2148
2149        assert!(set.contains(5));
2150        assert!(!set.contains(6));
2151        assert!(!set.contains(199));
2152        assert!(set.contains(200));
2153        assert!(set.contains(210));
2154        assert!(!set.contains(211));
2155
2156        let copy: IntSet<u16> = set.iter().collect();
2157        assert_eq!(set, copy);
2158
2159        set.invert();
2160
2161        assert!(!set.contains(5));
2162        assert!(set.contains(6));
2163
2164        let Some(max) = set.iter().max() else {
2165            panic!("should have a max");
2166        };
2167
2168        assert_eq!(max, u16::MAX);
2169
2170        let mut it = set.iter();
2171        assert_eq!(it.next(), Some(0));
2172        assert_eq!(it.next(), Some(1));
2173        assert_eq!(it.next(), Some(2));
2174        assert_eq!(it.next(), Some(3));
2175        assert_eq!(it.next(), Some(4));
2176        assert_eq!(it.next(), Some(6));
2177    }
2178
2179    #[test]
2180    fn with_glyph_id_16() {
2181        let mut set = IntSet::<font_types::GlyphId16>::empty();
2182
2183        set.insert(GlyphId16::new(5));
2184        set.insert(GlyphId16::new(8));
2185        set.insert(GlyphId16::new(12));
2186        set.insert_range(GlyphId16::new(200)..=GlyphId16::new(210));
2187
2188        assert!(set.contains(GlyphId16::new(5)));
2189        assert!(!set.contains(GlyphId16::new(6)));
2190        assert!(!set.contains(GlyphId16::new(199)));
2191        assert!(set.contains(GlyphId16::new(200)));
2192        assert!(set.contains(GlyphId16::new(210)));
2193        assert!(!set.contains(GlyphId16::new(211)));
2194
2195        let copy: IntSet<GlyphId16> = set.iter().collect();
2196        assert_eq!(set, copy);
2197
2198        set.invert();
2199
2200        assert!(!set.contains(GlyphId16::new(5)));
2201        assert!(set.contains(GlyphId16::new(6)));
2202
2203        let Some(max) = set.iter().max() else {
2204            panic!("should have a max");
2205        };
2206
2207        assert_eq!(max, GlyphId16::new(u16::MAX));
2208
2209        let mut it = set.iter();
2210        assert_eq!(it.next(), Some(GlyphId16::new(0)));
2211        assert_eq!(it.next(), Some(GlyphId16::new(1)));
2212        assert_eq!(it.next(), Some(GlyphId16::new(2)));
2213        assert_eq!(it.next(), Some(GlyphId16::new(3)));
2214        assert_eq!(it.next(), Some(GlyphId16::new(4)));
2215        assert_eq!(it.next(), Some(GlyphId16::new(6)));
2216    }
2217
2218    #[test]
2219    fn with_glyph_id() {
2220        let mut set = IntSet::<font_types::GlyphId>::empty();
2221
2222        set.insert(GlyphId::new(5));
2223        set.insert(GlyphId::new(8));
2224        set.insert(GlyphId::new(12));
2225        set.insert_range(GlyphId::new(200)..=GlyphId::new(210));
2226
2227        assert!(set.contains(GlyphId::new(5)));
2228        assert!(!set.contains(GlyphId::new(6)));
2229        assert!(!set.contains(GlyphId::new(199)));
2230        assert!(set.contains(GlyphId::new(200)));
2231        assert!(set.contains(GlyphId::new(210)));
2232        assert!(!set.contains(GlyphId::new(211)));
2233
2234        let copy: IntSet<GlyphId> = set.iter().collect();
2235        assert_eq!(set, copy);
2236
2237        set.invert();
2238
2239        assert!(!set.contains(GlyphId::new(5)));
2240        assert!(set.contains(GlyphId::new(6)));
2241
2242        let mut it = set.iter();
2243        assert_eq!(it.next(), Some(GlyphId::new(0)));
2244        assert_eq!(it.next(), Some(GlyphId::new(1)));
2245        assert_eq!(it.next(), Some(GlyphId::new(2)));
2246        assert_eq!(it.next(), Some(GlyphId::new(3)));
2247        assert_eq!(it.next(), Some(GlyphId::new(4)));
2248        assert_eq!(it.next(), Some(GlyphId::new(6)));
2249    }
2250
2251    #[test]
2252    fn with_tag() {
2253        let mut set = IntSet::<Tag>::empty();
2254
2255        set.insert(Tag::new(b"GSUB"));
2256        set.insert(Tag::new(b"CFF "));
2257        set.insert(Tag::new(b"OS/2"));
2258
2259        assert!(set.contains(Tag::new(b"GSUB")));
2260        assert!(!set.contains(Tag::new(b"GSU ")));
2261        assert!(set.contains(Tag::new(b"CFF ")));
2262        assert!(set.contains(Tag::new(b"OS/2")));
2263
2264        let copy: IntSet<Tag> = set.iter().collect();
2265        assert_eq!(set, copy);
2266
2267        set.invert();
2268
2269        assert!(!set.contains(Tag::new(b"GSUB")));
2270        assert!(set.contains(Tag::new(b"GSU ")));
2271        assert!(!set.contains(Tag::new(b"CFF ")));
2272        assert!(!set.contains(Tag::new(b"OS/2")));
2273    }
2274
2275    #[test]
2276    fn intersects_range() {
2277        let mut set = IntSet::<u32>::empty();
2278        assert!(!set.intersects_range(0..=0));
2279        assert!(!set.intersects_range(0..=100));
2280        assert!(!set.intersects_range(0..=u32::MAX));
2281        assert!(!set.intersects_range(u32::MAX..=u32::MAX));
2282
2283        set.insert(1234);
2284        assert!(!set.intersects_range(0..=1233));
2285        assert!(!set.intersects_range(1235..=1240));
2286
2287        assert!(set.intersects_range(1234..=1234));
2288        assert!(set.intersects_range(1230..=1240));
2289        assert!(set.intersects_range(0..=1234));
2290        assert!(set.intersects_range(1234..=u32::MAX));
2291
2292        set.insert(0);
2293        assert!(set.intersects_range(0..=0));
2294        assert!(!set.intersects_range(1..=1));
2295    }
2296
2297    #[test]
2298    fn intersects_set() {
2299        macro_rules! assert_intersects {
2300            ($lhs:path, $rhs:path, $expected:expr) => {
2301                assert_eq!($lhs.intersects_set(&$rhs), $expected);
2302                assert_eq!($rhs.intersects_set(&$lhs), $expected);
2303            };
2304        }
2305
2306        assert!(!IntSet::<u32>::empty().intersects_set(&IntSet::<u32>::empty()));
2307
2308        let empty = IntSet::<u32>::empty();
2309        let a = IntSet::from([1u32, 5, 6, 7, 8, 12]);
2310        let b = IntSet::from([2u32, 13]);
2311        let c = IntSet::from([8u32, 14]);
2312        let mut d = IntSet::all();
2313        d.remove_range(0u32..=13);
2314        let mut e = IntSet::all();
2315        e.remove_range(0u32..=100);
2316
2317        assert_intersects!(a, b, false);
2318        assert_intersects!(a, c, true);
2319        assert_intersects!(a, d, false);
2320
2321        assert_intersects!(b, c, false);
2322        assert_intersects!(b, d, false);
2323        assert_intersects!(b, e, false);
2324
2325        assert_intersects!(c, d, true);
2326        assert_intersects!(c, e, false);
2327
2328        assert_intersects!(d, e, true);
2329
2330        assert_intersects!(a, empty, false);
2331        assert_intersects!(b, empty, false);
2332        assert_intersects!(c, empty, false);
2333        assert_intersects!(d, empty, false);
2334        assert_intersects!(e, empty, false);
2335    }
2336
2337    #[test]
2338    fn intersects_range_discontinuous() {
2339        let mut set = IntSet::<EvenInts>::empty();
2340        assert!(!set.intersects_range(EvenInts(0)..=EvenInts(0)));
2341        assert!(!set.intersects_range(EvenInts(0)..=EvenInts(100)));
2342        assert!(!set.intersects_range(EvenInts(0)..=EvenInts(u16::MAX - 1)));
2343        assert!(!set.intersects_range(EvenInts(u16::MAX - 1)..=EvenInts(u16::MAX - 1)));
2344
2345        set.insert(EvenInts(1234));
2346        assert!(!set.intersects_range(EvenInts(0)..=EvenInts(1232)));
2347        assert!(!set.intersects_range(EvenInts(1236)..=EvenInts(1240)));
2348
2349        assert!(set.intersects_range(EvenInts(1234)..=EvenInts(1234)));
2350        assert!(set.intersects_range(EvenInts(1230)..=EvenInts(1240)));
2351        assert!(set.intersects_range(EvenInts(0)..=EvenInts(1234)));
2352        assert!(set.intersects_range(EvenInts(1234)..=EvenInts(u16::MAX - 1)));
2353
2354        set.insert(EvenInts(0));
2355        assert!(set.intersects_range(EvenInts(0)..=EvenInts(0)));
2356        assert!(!set.intersects_range(EvenInts(2)..=EvenInts(2)));
2357    }
2358
2359    #[test]
2360    fn intersects_range_exclusive() {
2361        let mut set = IntSet::<u32>::all();
2362        assert!(set.intersects_range(0..=0));
2363        assert!(set.intersects_range(0..=100));
2364        assert!(set.intersects_range(0..=u32::MAX));
2365        assert!(set.intersects_range(u32::MAX..=u32::MAX));
2366
2367        set.remove(1234);
2368        assert!(set.intersects_range(0..=1233));
2369        assert!(set.intersects_range(1235..=1240));
2370
2371        assert!(!set.intersects_range(1234..=1234));
2372        assert!(set.intersects_range(1230..=1240));
2373        assert!(set.intersects_range(0..=1234));
2374        assert!(set.intersects_range(1234..=u32::MAX));
2375
2376        set.remove(0);
2377        assert!(!set.intersects_range(0..=0));
2378        assert!(set.intersects_range(1..=1));
2379
2380        set.remove_range(5000..=5200);
2381        assert!(!set.intersects_range(5000..=5200));
2382        assert!(!set.intersects_range(5100..=5150));
2383        assert!(set.intersects_range(4999..=5200));
2384        assert!(set.intersects_range(5000..=5201));
2385    }
2386
2387    #[test]
2388    fn intersects_range_exclusive_discontinuous() {
2389        let mut set = IntSet::<EvenInts>::all();
2390        assert!(set.intersects_range(EvenInts(0)..=EvenInts(0)));
2391        assert!(set.intersects_range(EvenInts(0)..=EvenInts(100)));
2392        assert!(set.intersects_range(EvenInts(0)..=EvenInts(u16::MAX - 1)));
2393        assert!(set.intersects_range(EvenInts(u16::MAX - 1)..=EvenInts(u16::MAX - 1)));
2394
2395        set.remove(EvenInts(1234));
2396        assert!(set.intersects_range(EvenInts(0)..=EvenInts(1232)));
2397        assert!(set.intersects_range(EvenInts(1236)..=EvenInts(1240)));
2398
2399        assert!(!set.intersects_range(EvenInts(1234)..=EvenInts(1234)));
2400        assert!(set.intersects_range(EvenInts(1230)..=EvenInts(1240)));
2401        assert!(set.intersects_range(EvenInts(0)..=EvenInts(1234)));
2402        assert!(set.intersects_range(EvenInts(1234)..=EvenInts(u16::MAX - 1)));
2403
2404        set.remove(EvenInts(0));
2405        assert!(!set.intersects_range(EvenInts(0)..=EvenInts(0)));
2406        assert!(set.intersects_range(EvenInts(2)..=EvenInts(2)));
2407
2408        set.remove_range(EvenInts(5000)..=EvenInts(5200));
2409        assert!(!set.intersects_range(EvenInts(5000)..=EvenInts(5200)));
2410        assert!(!set.intersects_range(EvenInts(5100)..=EvenInts(5150)));
2411        assert!(set.intersects_range(EvenInts(4998)..=EvenInts(5200)));
2412        assert!(set.intersects_range(EvenInts(5000)..=EvenInts(5202)));
2413    }
2414
2415    #[test]
2416    fn length() {
2417        let mut s = IntSet::<u32>::empty();
2418        assert_eq!(s.len(), 0);
2419        s.insert(5);
2420        s.insert(5);
2421        s.insert(100);
2422        assert_eq!(s.len(), 2);
2423
2424        s.invert();
2425        assert_eq!(s.len(), (u32::MAX - 1) as u64);
2426
2427        assert_eq!(IntSet::<u32>::all().len(), (u32::MAX as u64) + 1);
2428
2429        let mut s = IntSet::<TwoParts>::all();
2430        assert_eq!(s.len(), 13);
2431        s.remove(TwoParts::from_u32(InDomain(5)));
2432        assert_eq!(s.len(), 12);
2433
2434        for v in TwoParts::ordered_values() {
2435            s.remove(TwoParts::from_u32(InDomain(v)));
2436        }
2437        assert_eq!(s.len(), 0);
2438    }
2439
2440    #[test]
2441    fn ordering() {
2442        macro_rules! assert_ord {
2443            ($lhs:expr, $rhs:expr, $ord:path) => {
2444                assert_eq!(
2445                    IntSet::from($lhs.clone()).cmp(&IntSet::from($rhs.clone())),
2446                    $ord,
2447                    "{:?}, {:?}",
2448                    $lhs,
2449                    $rhs
2450                )
2451            };
2452        }
2453
2454        const EMPTY: [u16; 0] = [];
2455        assert_ord!(EMPTY, EMPTY, Ordering::Equal);
2456        assert_ord!(EMPTY, [0], Ordering::Less);
2457        assert_ord!([0u16], [0], Ordering::Equal);
2458        assert_ord!([0u16, 1, 2], [1, 2, 3], Ordering::Less);
2459        assert_ord!([0u16, 1, 4], [1, 2, 3], Ordering::Less);
2460        assert_ord!([1u16, 2, 3], [0, 2, 4], Ordering::Greater);
2461        assert_ord!([5u16, 4, 0], [1, 2, 3], Ordering::Less); // out of order
2462        assert_ord!([1u16, 2, 3], [1, 2, 3, 4], Ordering::Less); // out of order
2463        assert_ord!([2u16, 3, 4], [1, 2, 3, 4, 5], Ordering::Greater); // out of order
2464
2465        // Exclusive - Exclusive
2466        let all = IntSet::<u16>::all();
2467        let mut all_but_0 = all.clone();
2468        all_but_0.remove(0);
2469        let mut all_but_5 = all.clone();
2470        all_but_5.remove(5);
2471
2472        assert_eq!(all.cmp(&all), Ordering::Equal);
2473        assert_eq!(all.cmp(&all_but_0), Ordering::Less);
2474        assert_eq!(all_but_0.cmp(&all), Ordering::Greater);
2475
2476        let mut a = IntSet::<u16>::all();
2477        a.remove_range(0..=5);
2478        a.remove_range(221..=1693);
2479        let mut b = IntSet::<u16>::all();
2480        b.remove_range(0..=1693);
2481        assert_eq!(a.cmp(&b), Ordering::Less);
2482
2483        // Mixed
2484        let mut inc_all_but_0 = IntSet::<u16>::empty();
2485        inc_all_but_0.insert_range(1..=u16::MAX);
2486        let mut inc_all_but_5 = IntSet::<u16>::empty();
2487        inc_all_but_5.insert_range(0..=4);
2488        inc_all_but_5.insert_range(6..=u16::MAX);
2489
2490        assert_eq!(all.cmp(&all), Ordering::Equal);
2491        assert_eq!(all.cmp(&inc_all_but_0), Ordering::Less);
2492        assert_eq!(inc_all_but_0.cmp(&all), Ordering::Greater);
2493        assert_eq!(inc_all_but_5.cmp(&all_but_0), Ordering::Less);
2494
2495        let mut a = IntSet::<u16>::all();
2496        a.remove_range(8..=1160);
2497        let mut b = IntSet::<u16>::empty();
2498        b.insert_range(0..=259);
2499
2500        assert_eq!(a.cmp(&b), Ordering::Greater);
2501
2502        let mut a = IntSet::<u16>::all();
2503        a.remove_range(8..=u16::MAX);
2504        let mut b = IntSet::<u16>::empty();
2505        b.insert_range(0..=259);
2506
2507        assert_eq!(a.cmp(&b), Ordering::Less);
2508    }
2509}