read_fonts/collections/int_set/
mod.rs

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