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