Skip to main content

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