read_fonts/collections/int_set/
mod.rs

1//! A fast, efficient, sparse, & ordered unsigned integer (u32) bit set which is invertible.
2//!
3//! The bitset is implemented using fixed size pages which allows it to compactly
4//! represent sparse membership. However, the set excels when set members are typically
5//! clustered together. For example when representing glyph id or unicode codepoint values
6//! in a font.
7//!
8//! The set can have inclusive (the set of integers which are members) or
9//! exclusive (the set of integers which are not members) membership. The
10//! exclusive/inverted version of the set is useful for patterns such as
11//! "keep all codepoints except for {x, y, z, ...}".
12//!
13//! When constructing a new [`IntSet`] from an existing lists of integer values the most efficient
14//! way to create the set is to initialize it from a sorted (ascending) iterator of the values.
15//!
16//! For a type to be stored in the [`IntSet`] it must implement the [`Domain`] trait, and all
17//! unique values of that type must be able to be mapped to and from a unique `u32` value.
18//! See the [`Domain`] trait for more information.
19
20mod bitpage;
21mod bitset;
22mod input_bit_stream;
23mod output_bit_stream;
24pub mod sparse_bit_set;
25
26pub use bitset::U32Set;
27use core::ops::{Bound, RangeBounds};
28use font_types::{GlyphId, GlyphId16, NameId, Tag};
29use std::hash::Hash;
30use std::marker::PhantomData;
31use std::ops::RangeInclusive;
32use std::{
33    cmp::Ordering,
34    fmt::{Debug, Display},
35};
36
37/// A fast & efficient invertible ordered set for small (up to 32-bit) unsigned integer types.
38#[derive(Clone)]
39pub struct IntSet<T>(Membership, PhantomData<T>);
40
41/// Defines the domain of `IntSet` member types.
42///
43/// Members of `IntSet` must implement this trait. Members of `IntSet`'s must meet the following
44/// conditions to be used in an `IntSet`:
45///
46/// 1. Every possible unique value of `T` must be able map to and from a unique `u32`
47///    integer.
48///
49/// 2. The mapped `u32` values must retain the same ordering as the values in `T`.
50///
51/// 3. `ordered_values`() must iterate over all values in `T` in sorted order (ascending).
52///
53/// `from_u32`() will only ever be called with u32 values that are part of the domain of T as defined
54/// by an implementation of this trait. So it doesn't need to correctly handle values
55/// that are outside the domain of `T`.
56pub trait Domain: Sized + Copy {
57    /// Converts this value of `T` to a value in u32.
58    ///
59    /// The mapped value must maintain the same ordering as `T`.
60    fn to_u32(&self) -> u32;
61
62    /// Returns `true` if the value is part of this domain.
63    fn contains(value: u32) -> bool;
64
65    /// Converts a mapped u32 value back to T.
66    ///
67    /// Will only ever be called with values produced by `to_u32`.
68    fn from_u32(member: InDomain) -> Self;
69
70    /// Returns true if all u32 values between the mapped u32 min and mapped u32 max value of T are used.
71    fn is_continuous() -> bool;
72
73    /// Returns an iterator which iterates over all values in the domain of `T`
74    ///
75    /// Values should be converted to `u32`'s according to the mapping defined in
76    /// `to_u32`/`from_u32`.
77    fn ordered_values() -> impl DoubleEndedIterator<Item = u32>;
78
79    /// Return an iterator which iterates over all values of T in the given range.
80    ///
81    /// Values should be converted to `u32`'s according to the mapping defined in
82    /// `to_u32`/`from_u32`.
83    fn ordered_values_range(range: RangeInclusive<Self>) -> impl DoubleEndedIterator<Item = u32>;
84
85    /// Returns the number of members in the domain.
86    fn count() -> u64;
87}
88
89/// Marks a mapped value as being in the domain of `T` for [`Domain`].
90///
91/// See [`Domain`] for more information.
92pub struct InDomain(u32);
93
94#[derive(Clone, Debug, Hash, PartialEq, Eq)]
95#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
96enum Membership {
97    /// Records a set of integers which are members of the set.
98    Inclusive(U32Set),
99
100    /// Records the set of integers which are not members of the set.
101    Exclusive(U32Set),
102}
103
104impl InDomain {
105    pub fn value(&self) -> u32 {
106        self.0
107    }
108}
109
110impl<T> Default for IntSet<T> {
111    fn default() -> IntSet<T> {
112        IntSet::empty()
113    }
114}
115
116impl<T: Domain> IntSet<T> {
117    /// Returns an iterator over all members of the set in sorted ascending order.
118    ///
119    /// Note: iteration of inverted sets can be extremely slow due to the very large number of members in the set
120    /// care should be taken when using `.iter()` in combination with an inverted set.
121    pub fn iter(&self) -> impl DoubleEndedIterator<Item = T> + '_ {
122        let u32_iter = match &self.0 {
123            Membership::Inclusive(s) => Iter::new_bidirectional(s.iter(), None),
124            Membership::Exclusive(s) => {
125                Iter::new_bidirectional(s.iter(), Some(T::ordered_values()))
126            }
127        };
128        u32_iter.map(|v| T::from_u32(InDomain(v)))
129    }
130
131    /// If this is an inclusive membership set then returns an iterator over the members, otherwise returns `None`.
132    pub fn inclusive_iter(&self) -> Option<impl DoubleEndedIterator<Item = T> + '_> {
133        match &self.0 {
134            Membership::Inclusive(s) => Some(s.iter().map(|v| T::from_u32(InDomain(v)))),
135            Membership::Exclusive(_) => None,
136        }
137    }
138
139    fn iter_from_u32(&self, value: T) -> impl Iterator<Item = u32> + '_ {
140        match &self.0 {
141            Membership::Inclusive(s) => Iter::new(s.iter_from(value.to_u32()), None),
142            Membership::Exclusive(s) => {
143                let value_u32 = value.to_u32();
144                let max = T::ordered_values().next_back();
145                let it = max.map(|max| T::ordered_values_range(value..=T::from_u32(InDomain(max))));
146                let min = it.and_then(|mut it| it.next());
147
148                if let (Some(min), Some(max)) = (min, max) {
149                    Iter::new(
150                        s.iter_from(value_u32),
151                        Some(T::ordered_values_range(
152                            T::from_u32(InDomain(min))..=T::from_u32(InDomain(max)),
153                        )),
154                    )
155                } else {
156                    // either min or max doesn't exist, so just return an iterator that has no values.
157                    let mut it = Iter::new(s.iter_from(u32::MAX), None);
158                    it.next();
159                    it
160                }
161            }
162        }
163    }
164
165    /// Returns an iterator over the members of this set that are after `value` in ascending order.
166    ///
167    /// Note: iteration of inverted sets can be extremely slow due to the very large number of members in the set
168    /// care should be taken when using `.iter()` in combination with an inverted set.
169    pub fn iter_after(&self, value: T) -> impl Iterator<Item = T> + '_ {
170        self.range((Bound::Excluded(value), Bound::Unbounded))
171    }
172
173    /// Returns an iterator over members of this set that are in `range`.
174    pub fn range<R: RangeBounds<T>>(&self, range: R) -> impl Iterator<Item = T> + '_ {
175        let mut it = match range.start_bound() {
176            Bound::Included(start) | Bound::Excluded(start) => {
177                self.iter_from_u32(*start).peekable()
178            }
179            Bound::Unbounded => {
180                let min = T::from_u32(InDomain(T::ordered_values().next().unwrap()));
181                self.iter_from_u32(min).peekable()
182            }
183        };
184
185        if let Bound::Excluded(start) = range.start_bound() {
186            it.next_if_eq(&start.to_u32());
187        }
188
189        let range_end = range.end_bound().cloned();
190        it.take_while(move |v| match range_end {
191            Bound::Included(end) => *v <= end.to_u32(),
192            Bound::Excluded(end) => *v < end.to_u32(),
193            Bound::Unbounded => true,
194        })
195        .map(move |v| T::from_u32(InDomain(v)))
196    }
197
198    /// Returns an iterator over all disjoint ranges of values within the set in sorted ascending order.
199    pub fn iter_ranges(&self) -> impl Iterator<Item = RangeInclusive<T>> + '_ {
200        self.iter_ranges_invertible(false)
201    }
202
203    /// Returns an iterator over all disjoint ranges of values not within the set in sorted ascending order.
204    pub fn iter_excluded_ranges(&self) -> impl Iterator<Item = RangeInclusive<T>> + '_ {
205        self.iter_ranges_invertible(true)
206    }
207
208    fn iter_ranges_invertible(
209        &self,
210        inverted: bool,
211    ) -> impl Iterator<Item = RangeInclusive<T>> + '_ {
212        let u32_iter = match (&self.0, inverted) {
213            (Membership::Inclusive(s), false) | (Membership::Exclusive(s), true)
214                if T::is_continuous() =>
215            {
216                RangeIter::Inclusive::<_, _, T> {
217                    ranges: s.iter_ranges(),
218                }
219            }
220            (Membership::Inclusive(s), false) | (Membership::Exclusive(s), true) => {
221                RangeIter::InclusiveDiscontinuous::<_, _, T> {
222                    ranges: s.iter_ranges(),
223                    current_range: None,
224                    phantom: PhantomData::<T>,
225                }
226            }
227            (Membership::Exclusive(s), false) | (Membership::Inclusive(s), true)
228                if T::is_continuous() =>
229            {
230                RangeIter::Exclusive::<_, _, T> {
231                    ranges: s.iter_ranges(),
232                    min: T::ordered_values().next().unwrap(),
233                    max: T::ordered_values().next_back().unwrap(),
234                    done: false,
235                }
236            }
237            (Membership::Exclusive(s), false) | (Membership::Inclusive(s), true) => {
238                RangeIter::ExclusiveDiscontinuous::<_, _, T> {
239                    all_values: Some(T::ordered_values()),
240                    set: s,
241                    next_value: None,
242                }
243            }
244        };
245
246        u32_iter.map(|r| T::from_u32(InDomain(*r.start()))..=T::from_u32(InDomain(*r.end())))
247    }
248
249    /// Adds a value to the set.
250    ///
251    /// Returns `true` if the value was newly inserted.
252    pub fn insert(&mut self, val: T) -> bool {
253        let val = val.to_u32();
254        match &mut self.0 {
255            Membership::Inclusive(s) => s.insert(val),
256            Membership::Exclusive(s) => s.remove(val),
257        }
258    }
259
260    /// Add all values in range as members of this set.
261    pub fn insert_range(&mut self, range: RangeInclusive<T>) {
262        if T::is_continuous() {
263            let range = range.start().to_u32()..=range.end().to_u32();
264            match &mut self.0 {
265                Membership::Inclusive(s) => s.insert_range(range),
266                Membership::Exclusive(s) => s.remove_range(range),
267            }
268        } else {
269            let range = T::ordered_values_range(range);
270            match &mut self.0 {
271                Membership::Inclusive(s) => s.extend(range),
272                Membership::Exclusive(s) => s.remove_all(range),
273            }
274        }
275    }
276
277    /// An alternate version of [`extend()`] which is optimized for inserting an unsorted iterator of values.
278    ///
279    /// [`extend()`]: Self::extend
280    pub fn extend_unsorted<U: IntoIterator<Item = T>>(&mut self, iter: U) {
281        let iter = iter.into_iter().map(|v| v.to_u32());
282        match &mut self.0 {
283            Membership::Inclusive(s) => s.extend_unsorted(iter),
284            Membership::Exclusive(s) => s.remove_all(iter),
285        }
286    }
287
288    /// Removes a value from the set. Returns whether the value was present in the set.
289    pub fn remove(&mut self, val: T) -> bool {
290        let val = val.to_u32();
291        match &mut self.0 {
292            Membership::Inclusive(s) => s.remove(val),
293            Membership::Exclusive(s) => s.insert(val),
294        }
295    }
296
297    // Removes all values in iter from the set.
298    pub fn remove_all<U: IntoIterator<Item = T>>(&mut self, iter: U) {
299        let iter = iter.into_iter().map(|v| v.to_u32());
300        match &mut self.0 {
301            Membership::Inclusive(s) => s.remove_all(iter),
302            Membership::Exclusive(s) => s.extend(iter),
303        }
304    }
305
306    /// Removes all values in range as members of this set.
307    pub fn remove_range(&mut self, range: RangeInclusive<T>) {
308        if T::is_continuous() {
309            let range = range.start().to_u32()..=range.end().to_u32();
310            match &mut self.0 {
311                Membership::Inclusive(s) => s.remove_range(range),
312                Membership::Exclusive(s) => s.insert_range(range),
313            }
314        } else {
315            let range = T::ordered_values_range(range);
316            match &mut self.0 {
317                Membership::Inclusive(s) => s.remove_all(range),
318                Membership::Exclusive(s) => s.extend(range),
319            }
320        }
321    }
322
323    /// Sets the members of this set to the union of self and other.
324    pub fn union(&mut self, other: &IntSet<T>) {
325        match (&mut self.0, &other.0) {
326            (Membership::Inclusive(a), Membership::Inclusive(b)) => a.union(b),
327            (Membership::Inclusive(a), Membership::Exclusive(b)) => {
328                a.reversed_subtract(b);
329                self.invert();
330            }
331            (Membership::Exclusive(a), Membership::Inclusive(b)) => a.subtract(b),
332            (Membership::Exclusive(a), Membership::Exclusive(b)) => a.intersect(b),
333        }
334    }
335
336    /// Sets the members of this set to the intersection of self and other.
337    pub fn intersect(&mut self, other: &IntSet<T>) {
338        match (&mut self.0, &other.0) {
339            (Membership::Inclusive(a), Membership::Inclusive(b)) => a.intersect(b),
340            (Membership::Inclusive(a), Membership::Exclusive(b)) => a.subtract(b),
341            (Membership::Exclusive(a), Membership::Inclusive(b)) => {
342                a.reversed_subtract(b);
343                self.invert();
344            }
345            (Membership::Exclusive(a), Membership::Exclusive(b)) => a.union(b),
346        }
347    }
348
349    /// Sets the members of this set to self - other.
350    pub fn subtract(&mut self, other: &IntSet<T>) {
351        match (&mut self.0, &other.0) {
352            (Membership::Inclusive(a), Membership::Inclusive(b)) => a.subtract(b),
353            (Membership::Inclusive(a), Membership::Exclusive(b)) => a.intersect(b),
354            (Membership::Exclusive(a), Membership::Inclusive(b)) => a.union(b),
355            (Membership::Exclusive(a), Membership::Exclusive(b)) => {
356                a.reversed_subtract(b);
357                self.invert();
358            }
359        }
360    }
361
362    /// Returns true if this set contains at least one element in 'range'.
363    pub fn intersects_range(&self, range: RangeInclusive<T>) -> bool {
364        self.range(range).next().is_some()
365    }
366
367    /// Returns true if this set contains at least one element in 'other'.
368    pub fn intersects_set(&self, other: &IntSet<T>) -> bool {
369        // Iterate the smaller set and check for member ship in the larger set
370        // Estimate the true size as the number of pages.
371        let (a, b) = match (&self.0, &other.0) {
372            (
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: U32Set) -> 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(U32Set::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(U32Set::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, U32Set::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, U32Set::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 U32Set,
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 U32Set,
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    fn equal_and_hash() {
1492        let mut inc1 = IntSet::<u32>::empty();
1493        inc1.insert(14);
1494        inc1.insert(670);
1495
1496        let mut inc2 = IntSet::<u32>::empty();
1497        inc2.insert(670);
1498        inc2.insert(14);
1499
1500        let mut inc3 = inc1.clone();
1501        inc3.insert(5);
1502
1503        let mut exc = inc1.clone();
1504        exc.invert();
1505
1506        assert_eq!(inc1, inc2);
1507        assert_ne!(inc1, inc3);
1508        assert_ne!(inc1, exc);
1509
1510        let set = HashSet::from([inc1.clone(), inc3.clone(), exc.clone()]);
1511        assert!(set.contains(&inc1));
1512        assert!(set.contains(&inc3));
1513        assert!(set.contains(&exc));
1514
1515        assert_ne!(hash(&inc1), hash(&exc));
1516        assert_eq!(hash(&inc1), hash(&inc2));
1517    }
1518
1519    #[test]
1520    fn equal_and_hash_mixed_membership_types() {
1521        let mut inverted_all = IntSet::<TwoParts>::all();
1522        let mut all = IntSet::<TwoParts>::empty();
1523        for v in TwoParts::ordered_values() {
1524            all.insert(TwoParts(v as u16));
1525        }
1526
1527        assert_eq!(inverted_all, all);
1528        assert_eq!(hash(&all), hash(&inverted_all));
1529
1530        inverted_all.remove(TwoParts(5));
1531        assert_ne!(inverted_all, all);
1532
1533        all.remove(TwoParts(5));
1534        assert_eq!(inverted_all, all);
1535        assert_eq!(hash(&all), hash(&inverted_all));
1536    }
1537
1538    #[test]
1539    fn iter() {
1540        let mut set = IntSet::<u32>::empty();
1541        set.insert(3);
1542        set.insert(8);
1543        set.insert(534);
1544        set.insert(700);
1545        set.insert(10000);
1546        set.insert(10001);
1547        set.insert(10002);
1548
1549        let v: Vec<u32> = set.iter().collect();
1550        assert_eq!(v, vec![3, 8, 534, 700, 10000, 10001, 10002]);
1551
1552        let v: Vec<u32> = set.inclusive_iter().unwrap().collect();
1553        assert_eq!(v, vec![3, 8, 534, 700, 10000, 10001, 10002]);
1554    }
1555
1556    #[test]
1557    fn iter_backwards() {
1558        let mut set = IntSet::<u32>::empty();
1559        set.insert_range(1..=6);
1560        {
1561            let mut it = set.iter();
1562            assert_eq!(Some(1), it.next());
1563            assert_eq!(Some(6), it.next_back());
1564            assert_eq!(Some(5), it.next_back());
1565            assert_eq!(Some(2), it.next());
1566            assert_eq!(Some(3), it.next());
1567            assert_eq!(Some(4), it.next());
1568            assert_eq!(None, it.next());
1569            assert_eq!(None, it.next_back());
1570        }
1571
1572        let mut set = IntSet::<u8>::empty();
1573        set.invert();
1574        set.remove_range(10..=255);
1575        set.remove(4);
1576        set.remove(8);
1577        {
1578            let mut it = set.iter();
1579            assert_eq!(Some(0), it.next());
1580            assert_eq!(Some(1), it.next());
1581            assert_eq!(Some(2), it.next());
1582            assert_eq!(Some(3), it.next());
1583
1584            assert_eq!(Some(9), it.next_back());
1585            assert_eq!(Some(7), it.next_back());
1586            assert_eq!(Some(6), it.next_back());
1587            assert_eq!(Some(5), it.next_back());
1588            assert_eq!(None, it.next_back());
1589
1590            assert_eq!(None, it.next());
1591        }
1592
1593        let mut set = IntSet::<u8>::empty();
1594        set.invert();
1595        set.remove_range(10..=255);
1596        set.remove(4);
1597        set.remove(8);
1598        {
1599            let mut it = set.iter();
1600            assert_eq!(Some(0), it.next());
1601            assert_eq!(Some(1), it.next());
1602            assert_eq!(Some(2), it.next());
1603            assert_eq!(Some(3), it.next());
1604            assert_eq!(Some(5), it.next());
1605
1606            assert_eq!(Some(9), it.next_back());
1607            assert_eq!(Some(7), it.next_back());
1608            assert_eq!(Some(6), it.next_back());
1609            assert_eq!(None, it.next_back());
1610
1611            assert_eq!(None, it.next());
1612        }
1613    }
1614
1615    #[test]
1616    fn exclusive_iter() {
1617        let mut set = IntSet::<u32>::all();
1618        set.remove(3);
1619        set.remove(7);
1620        set.remove(8);
1621
1622        let mut iter = set.iter();
1623
1624        assert_eq!(iter.next(), Some(0));
1625        assert_eq!(iter.next(), Some(1));
1626        assert_eq!(iter.next(), Some(2));
1627        assert_eq!(iter.next(), Some(4));
1628        assert_eq!(iter.next(), Some(5));
1629        assert_eq!(iter.next(), Some(6));
1630        assert_eq!(iter.next(), Some(9));
1631        assert_eq!(iter.next(), Some(10));
1632
1633        assert!(set.inclusive_iter().is_none());
1634
1635        // Forward skip first
1636        let mut set = IntSet::<u32>::all();
1637        set.remove_range(0..=200);
1638
1639        let mut iter = set.iter();
1640        assert_eq!(iter.next(), Some(201));
1641
1642        // Backward skip first
1643        let mut set = IntSet::<u8>::all();
1644        set.remove_range(200..=255);
1645
1646        let mut iter = set.iter();
1647        assert_eq!(iter.next_back(), Some(199));
1648    }
1649
1650    #[test]
1651    fn iter_ranges_inclusive() {
1652        let mut set = IntSet::<u32>::empty();
1653        let items: Vec<_> = set.iter_ranges().collect();
1654        assert_eq!(items, vec![]);
1655
1656        set.insert_range(200..=700);
1657        set.insert(5);
1658        let items: Vec<_> = set.iter_ranges().collect();
1659        assert_eq!(items, vec![5..=5, 200..=700]);
1660
1661        let mut set = IntSet::<u32>::empty();
1662        set.insert_range(0..=0);
1663        set.insert_range(u32::MAX..=u32::MAX);
1664        let items: Vec<_> = set.iter_ranges().collect();
1665        assert_eq!(items, vec![0..=0, u32::MAX..=u32::MAX]);
1666
1667        let mut set = IntSet::<u32>::empty();
1668        set.insert_range(0..=5);
1669        set.insert_range(u32::MAX - 5..=u32::MAX);
1670        let items: Vec<_> = set.iter_ranges().collect();
1671        assert_eq!(items, vec![0..=5, u32::MAX - 5..=u32::MAX]);
1672
1673        let mut inverted = set.clone();
1674        inverted.invert();
1675        assert_eq!(
1676            set.iter_ranges().collect::<Vec<_>>(),
1677            inverted.iter_excluded_ranges().collect::<Vec<_>>()
1678        );
1679    }
1680
1681    #[test]
1682    fn iter_ranges_inclusive_discontinuous() {
1683        let mut set = IntSet::<EvenInts>::empty();
1684        let items: Vec<_> = set.iter_ranges().collect();
1685        assert_eq!(items, vec![]);
1686
1687        set.insert_range(EvenInts(4)..=EvenInts(12));
1688        set.insert(EvenInts(16));
1689
1690        let items: Vec<_> = set.iter_ranges().collect();
1691        assert_eq!(
1692            items,
1693            vec![EvenInts(4)..=EvenInts(12), EvenInts(16)..=EvenInts(16)]
1694        );
1695
1696        let mut inverted = set.clone();
1697        inverted.invert();
1698        assert_eq!(
1699            set.iter_ranges().collect::<Vec<_>>(),
1700            inverted.iter_excluded_ranges().collect::<Vec<_>>()
1701        );
1702    }
1703
1704    #[test]
1705    fn iter_ranges_exclusive() {
1706        let mut set = IntSet::<u32>::all();
1707        set.remove_range(200..=700);
1708        set.remove(5);
1709        let items: Vec<_> = set.iter_ranges().collect();
1710        assert_eq!(items, vec![0..=4, 6..=199, 701..=u32::MAX]);
1711
1712        let mut set = IntSet::<u32>::all();
1713        set.remove_range(0..=700);
1714        let items: Vec<_> = set.iter_ranges().collect();
1715        assert_eq!(items, vec![701..=u32::MAX]);
1716
1717        let mut inverted = set.clone();
1718        inverted.invert();
1719        assert_eq!(
1720            set.iter_ranges().collect::<Vec<_>>(),
1721            inverted.iter_excluded_ranges().collect::<Vec<_>>()
1722        );
1723
1724        let mut set = IntSet::<u32>::all();
1725        set.remove_range(u32::MAX - 10..=u32::MAX);
1726        let items: Vec<_> = set.iter_ranges().collect();
1727        assert_eq!(items, vec![0..=u32::MAX - 11]);
1728
1729        let mut set = IntSet::<u16>::all();
1730        set.remove_range(0..=u16::MAX);
1731        let items: Vec<_> = set.iter_ranges().collect();
1732        assert_eq!(items, vec![]);
1733
1734        let mut set = IntSet::<u16>::all();
1735        set.remove_range(0..=u16::MAX - 1);
1736        let items: Vec<_> = set.iter_ranges().collect();
1737        assert_eq!(items, vec![u16::MAX..=u16::MAX]);
1738
1739        let mut set = IntSet::<u16>::all();
1740        set.remove_range(1..=u16::MAX);
1741        let items: Vec<_> = set.iter_ranges().collect();
1742        assert_eq!(items, vec![0..=0]);
1743
1744        let set = IntSet::<u32>::all();
1745        let items: Vec<_> = set.iter_ranges().collect();
1746        assert_eq!(items, vec![0..=u32::MAX]);
1747    }
1748
1749    #[test]
1750    fn iter_ranges_exclusive_discontinuous() {
1751        let mut set = IntSet::<EvenInts>::all();
1752        set.remove_range(EvenInts(0)..=EvenInts(8));
1753        set.remove_range(EvenInts(16)..=EvenInts(u16::MAX - 1));
1754        let items: Vec<_> = set.iter_ranges().collect();
1755        assert_eq!(items, vec![EvenInts(10)..=EvenInts(14),]);
1756
1757        let mut set = IntSet::<TwoParts>::all();
1758        set.remove_range(TwoParts(11)..=TwoParts(13));
1759        let items: Vec<_> = set.iter_ranges().collect();
1760        assert_eq!(
1761            items,
1762            vec![TwoParts(2)..=TwoParts(10), TwoParts(14)..=TwoParts(16),]
1763        );
1764
1765        let mut inverted = set.clone();
1766        inverted.invert();
1767        assert_eq!(
1768            set.iter_ranges().collect::<Vec<_>>(),
1769            inverted.iter_excluded_ranges().collect::<Vec<_>>()
1770        );
1771
1772        let mut set = IntSet::<TwoParts>::all();
1773        set.remove_range(TwoParts(2)..=TwoParts(16));
1774        let items: Vec<_> = set.iter_ranges().collect();
1775        assert_eq!(items, vec![]);
1776
1777        let mut set = IntSet::<TwoParts>::all();
1778        set.remove_range(TwoParts(2)..=TwoParts(5));
1779        let items: Vec<_> = set.iter_ranges().collect();
1780        assert_eq!(items, vec![TwoParts(8)..=TwoParts(16),]);
1781
1782        let mut set = IntSet::<TwoParts>::all();
1783        set.remove_range(TwoParts(6)..=TwoParts(16));
1784        let items: Vec<_> = set.iter_ranges().collect();
1785        assert_eq!(items, vec![TwoParts(2)..=TwoParts(5),]);
1786
1787        // Check we can safely iterate to the limits of u32.
1788        let set = IntSet::<TwoPartsBounds>::all();
1789        let items: Vec<_> = set.iter_ranges().collect();
1790        assert_eq!(items, vec![TwoPartsBounds(0)..=TwoPartsBounds(u32::MAX),]);
1791    }
1792
1793    #[test]
1794    fn iter_range() {
1795        let mut set = IntSet::<u32>::empty();
1796        assert_eq!(set.iter_after(0).count(), 0);
1797
1798        set.extend([5, 7, 10, 1250, 1300, 3001]);
1799
1800        assert_eq!(
1801            set.iter_after(0).collect::<Vec<u32>>(),
1802            vec![5, 7, 10, 1250, 1300, 3001]
1803        );
1804        assert_eq!(
1805            set.range(0..).collect::<Vec<u32>>(),
1806            vec![5, 7, 10, 1250, 1300, 3001]
1807        );
1808
1809        assert_eq!(
1810            set.iter_after(5).collect::<Vec<u32>>(),
1811            vec![7, 10, 1250, 1300, 3001]
1812        );
1813        assert_eq!(
1814            set.range(5..).collect::<Vec<u32>>(),
1815            vec![5, 7, 10, 1250, 1300, 3001]
1816        );
1817
1818        assert_eq!(
1819            set.iter_after(700).collect::<Vec<u32>>(),
1820            vec![1250, 1300, 3001]
1821        );
1822        assert_eq!(
1823            set.range(700..).collect::<Vec<u32>>(),
1824            vec![1250, 1300, 3001]
1825        );
1826    }
1827
1828    #[test]
1829    fn iter_after_from_exclusive() {
1830        let mut set = IntSet::<u32>::empty();
1831        set.extend([5, 7, 10, 1250, 1300, 3001]);
1832        set.invert();
1833
1834        assert_eq!(
1835            set.iter_after(3).take(5).collect::<Vec<u32>>(),
1836            vec![4, 6, 8, 9, 11]
1837        );
1838        assert_eq!(
1839            set.range(3..).take(5).collect::<Vec<u32>>(),
1840            vec![3, 4, 6, 8, 9]
1841        );
1842
1843        assert_eq!(
1844            set.iter_after(0).take(5).collect::<Vec<u32>>(),
1845            vec![1, 2, 3, 4, 6]
1846        );
1847        assert_eq!(
1848            set.range(0..).take(5).collect::<Vec<u32>>(),
1849            vec![0, 1, 2, 3, 4]
1850        );
1851
1852        assert_eq!(
1853            set.iter_after(u32::MAX - 1).take(1).collect::<Vec<u32>>(),
1854            vec![u32::MAX]
1855        );
1856        assert_eq!(
1857            set.range(u32::MAX - 1..).take(2).collect::<Vec<u32>>(),
1858            vec![u32::MAX - 1, u32::MAX]
1859        );
1860
1861        assert_eq!(set.iter_after(u32::MAX).take(1).count(), 0);
1862        set.remove(u32::MAX);
1863        assert_eq!(set.range(u32::MAX..).take(1).count(), 0);
1864        assert_eq!(set.iter_after(u32::MAX - 1).take(1).count(), 0);
1865    }
1866
1867    #[test]
1868    fn iter_after_discontinuous() {
1869        let mut set = IntSet::<EvenInts>::empty();
1870        set.extend([EvenInts(6), EvenInts(10)]);
1871        set.invert();
1872
1873        assert_eq!(
1874            set.iter_after(EvenInts(2))
1875                .take(5)
1876                .collect::<Vec<EvenInts>>(),
1877            vec![
1878                EvenInts(4),
1879                EvenInts(8),
1880                EvenInts(12),
1881                EvenInts(14),
1882                EvenInts(16)
1883            ]
1884        );
1885        assert_eq!(
1886            set.range(EvenInts(2)..).take(5).collect::<Vec<EvenInts>>(),
1887            vec![
1888                EvenInts(2),
1889                EvenInts(4),
1890                EvenInts(8),
1891                EvenInts(12),
1892                EvenInts(14)
1893            ]
1894        );
1895
1896        assert_eq!(
1897            set.iter_after(EvenInts(4))
1898                .take(5)
1899                .collect::<Vec<EvenInts>>(),
1900            vec![
1901                EvenInts(8),
1902                EvenInts(12),
1903                EvenInts(14),
1904                EvenInts(16),
1905                EvenInts(18)
1906            ]
1907        );
1908
1909        assert_eq!(
1910            set.iter_after(EvenInts(u16::MAX - 1))
1911                .collect::<Vec<EvenInts>>(),
1912            vec![]
1913        );
1914        assert_eq!(
1915            set.range(EvenInts(u16::MAX - 1)..)
1916                .collect::<Vec<EvenInts>>(),
1917            vec![EvenInts(u16::MAX - 1)]
1918        );
1919
1920        assert_eq!(
1921            set.iter_after(EvenInts(u16::MAX - 5))
1922                .collect::<Vec<EvenInts>>(),
1923            vec![EvenInts(u16::MAX - 3), EvenInts(u16::MAX - 1)]
1924        );
1925
1926        set.remove(EvenInts(u16::MAX - 1));
1927        assert_eq!(
1928            set.iter_after(EvenInts(u16::MAX - 5))
1929                .collect::<Vec<EvenInts>>(),
1930            vec![EvenInts(u16::MAX - 3),]
1931        );
1932        assert_eq!(
1933            set.range(EvenInts(u16::MAX - 5)..)
1934                .collect::<Vec<EvenInts>>(),
1935            vec![EvenInts(u16::MAX - 5), EvenInts(u16::MAX - 3),]
1936        );
1937    }
1938
1939    #[test]
1940    #[allow(clippy::reversed_empty_ranges)]
1941    fn range() {
1942        let mut set = IntSet::<u32>::empty();
1943        assert_eq!(set.range(0..=5).count(), 0);
1944
1945        set.extend([5, 7, 10, 1250, 1300, 3001]);
1946
1947        assert_eq!(set.range(0..=5).collect::<Vec<u32>>(), vec![5]);
1948        assert_eq!(set.range(5..=11).collect::<Vec<u32>>(), vec![5, 7, 10]);
1949        assert_eq!(set.range(5..10).collect::<Vec<u32>>(), vec![5, 7]);
1950        assert_eq!(set.range(..10).collect::<Vec<u32>>(), vec![5, 7]);
1951        assert_eq!(set.range(..=10).collect::<Vec<u32>>(), vec![5, 7, 10]);
1952        assert_eq!(set.range(6..=11).collect::<Vec<u32>>(), vec![7, 10]);
1953
1954        assert!(set.range(7..6).collect::<Vec<u32>>().is_empty());
1955        assert!(set.range(7..7).collect::<Vec<u32>>().is_empty());
1956        assert_eq!(set.range(7..=7).collect::<Vec<u32>>(), vec![7]);
1957
1958        assert!(set.range(5..=0).collect::<Vec<u32>>().is_empty());
1959    }
1960
1961    #[test]
1962    fn from_iterator() {
1963        let s: IntSet<u32> = [3, 8, 12, 589].into_iter().collect();
1964        let mut expected = IntSet::<u32>::empty();
1965        expected.insert(3);
1966        expected.insert(8);
1967        expected.insert(12);
1968        expected.insert(589);
1969
1970        assert_eq!(s, expected);
1971    }
1972
1973    #[test]
1974    fn from_int_set_iterator() {
1975        let s1: IntSet<u32> = [3, 8, 12, 589].into_iter().collect();
1976        let s2: IntSet<u32> = s1.iter().collect();
1977        assert_eq!(s1, s2);
1978    }
1979
1980    #[test]
1981    fn extend() {
1982        let mut s = IntSet::<u32>::empty();
1983        s.extend([3, 12]);
1984        s.extend([8, 10, 589]);
1985
1986        let mut expected = IntSet::<u32>::empty();
1987        expected.insert(3);
1988        expected.insert(8);
1989        expected.insert(10);
1990        expected.insert(12);
1991        expected.insert(589);
1992
1993        assert_eq!(s, expected);
1994    }
1995
1996    #[test]
1997    fn extend_on_inverted() {
1998        let mut s = IntSet::<u32>::all();
1999        for i in 10..=20 {
2000            s.remove(i);
2001        }
2002
2003        s.extend([12, 17, 18]);
2004
2005        assert!(!s.contains(11));
2006        assert!(s.contains(12));
2007        assert!(!s.contains(13));
2008
2009        assert!(!s.contains(16));
2010        assert!(s.contains(17));
2011        assert!(s.contains(18));
2012        assert!(!s.contains(19));
2013        assert!(s.contains(100));
2014    }
2015
2016    #[test]
2017    fn remove_all() {
2018        let mut empty = IntSet::<u32>::empty();
2019        let mut all = IntSet::<u32>::all();
2020
2021        empty.extend([1, 2, 3, 4]);
2022
2023        empty.remove_all([2, 3]);
2024        all.remove_all([2, 3]);
2025
2026        assert!(empty.contains(1));
2027        assert!(!empty.contains(2));
2028        assert!(!empty.contains(3));
2029        assert!(empty.contains(4));
2030
2031        assert!(all.contains(1));
2032        assert!(!all.contains(2));
2033        assert!(!all.contains(3));
2034        assert!(all.contains(4));
2035    }
2036
2037    #[test]
2038    fn remove_range() {
2039        let mut empty = IntSet::<u32>::empty();
2040        let mut all = IntSet::<u32>::all();
2041
2042        empty.extend([1, 2, 3, 4]);
2043
2044        empty.remove_range(2..=3);
2045        all.remove_range(2..=3);
2046
2047        assert!(empty.contains(1));
2048        assert!(!empty.contains(2));
2049        assert!(!empty.contains(3));
2050        assert!(empty.contains(4));
2051
2052        assert!(all.contains(1));
2053        assert!(!all.contains(2));
2054        assert!(!all.contains(3));
2055        assert!(all.contains(4));
2056    }
2057
2058    #[test]
2059    fn insert_remove_range_boundary() {
2060        let mut set = IntSet::<u32>::empty();
2061
2062        set.remove_range(u32::MAX - 10..=u32::MAX);
2063        assert!(!set.contains(u32::MAX));
2064        set.insert_range(u32::MAX - 10..=u32::MAX);
2065        assert!(set.contains(u32::MAX));
2066        set.remove_range(u32::MAX - 10..=u32::MAX);
2067        assert!(!set.contains(u32::MAX));
2068
2069        set.remove_range(0..=10);
2070        assert!(!set.contains(0));
2071        set.insert_range(0..=10);
2072        assert!(set.contains(0));
2073        set.remove_range(0..=10);
2074        assert!(!set.contains(0));
2075    }
2076
2077    #[test]
2078    fn insert_remove_range_exclusive_boundary() {
2079        let mut set = IntSet::<u32>::all();
2080
2081        set.remove_range(u32::MAX - 10..=u32::MAX);
2082        assert!(!set.contains(u32::MAX));
2083        set.insert_range(u32::MAX - 10..=u32::MAX);
2084        assert!(set.contains(u32::MAX));
2085        set.remove_range(u32::MAX - 10..=u32::MAX);
2086        assert!(!set.contains(u32::MAX));
2087
2088        set.remove_range(0..=10);
2089        assert!(!set.contains(0));
2090        set.insert_range(0..=10);
2091        assert!(set.contains(0));
2092        set.remove_range(0..=10);
2093        assert!(!set.contains(0));
2094    }
2095
2096    struct SetOpInput {
2097        has_x: bool,
2098        inverted: bool,
2099        has_page: bool,
2100    }
2101
2102    impl SetOpInput {
2103        fn get_all_inputs() -> Vec<SetOpInput> {
2104            let mut result: Vec<SetOpInput> = vec![];
2105            for has_x in [true, false] {
2106                for inverted in [true, false] {
2107                    result.push(SetOpInput {
2108                        has_x,
2109                        inverted,
2110                        has_page: false,
2111                    });
2112                    let can_have_empty_page = has_x == inverted;
2113                    if can_have_empty_page {
2114                        result.push(SetOpInput {
2115                            has_x,
2116                            inverted,
2117                            has_page: true,
2118                        });
2119                    }
2120                }
2121            }
2122            result
2123        }
2124
2125        fn to_set(&self, x: u32) -> IntSet<u32> {
2126            let mut s = IntSet::<u32>::empty();
2127            if self.inverted {
2128                s.invert();
2129            }
2130            if self.has_page {
2131                // Ensure a page exists for x.
2132                if self.inverted {
2133                    s.remove(x);
2134                } else {
2135                    s.insert(x);
2136                }
2137            }
2138            if self.has_x {
2139                s.insert(x);
2140            } else {
2141                s.remove(x);
2142            }
2143            s
2144        }
2145    }
2146
2147    fn set_operation_test_message(
2148        a: &SetOpInput,
2149        b: &SetOpInput,
2150        op_name: &str,
2151        should_contain_x: bool,
2152    ) -> String {
2153        format!(
2154            "{}{}{} {} {}{}{} failed. {}",
2155            if a.inverted { "i" } else { "" },
2156            if a.has_page { "p" } else { "" },
2157            if a.has_x { "13" } else { "" },
2158            op_name,
2159            if b.inverted { "i" } else { "" },
2160            if b.has_page { "p" } else { "" },
2161            if b.has_x { "13" } else { "" },
2162            if should_contain_x {
2163                "Result did not have 13."
2164            } else {
2165                "Result should not have 13."
2166            }
2167        )
2168    }
2169
2170    fn check_union(a: &SetOpInput, b: &SetOpInput) {
2171        let x = 13;
2172        let mut set_a = a.to_set(x);
2173        let set_b = b.to_set(x);
2174
2175        let should_contain_x = a.has_x || b.has_x;
2176        set_a.union(&set_b);
2177
2178        assert_eq!(
2179            set_a.contains(x),
2180            should_contain_x,
2181            "{}",
2182            set_operation_test_message(a, b, "union", should_contain_x)
2183        );
2184    }
2185
2186    fn check_intersect(a: &SetOpInput, b: &SetOpInput) {
2187        let x = 13;
2188        let mut set_a = a.to_set(x);
2189        let set_b = b.to_set(x);
2190
2191        let should_contain_x = a.has_x && b.has_x;
2192        set_a.intersect(&set_b);
2193
2194        assert_eq!(
2195            set_a.contains(x),
2196            should_contain_x,
2197            "{}",
2198            set_operation_test_message(a, b, "intersect", should_contain_x)
2199        );
2200    }
2201
2202    fn check_subtract(a: &SetOpInput, b: &SetOpInput) {
2203        let x = 13;
2204        let mut set_a = a.to_set(x);
2205        let set_b = b.to_set(x);
2206
2207        let should_contain_x = a.has_x && (!b.has_x);
2208        set_a.subtract(&set_b);
2209
2210        assert_eq!(
2211            set_a.contains(x),
2212            should_contain_x,
2213            "{}",
2214            set_operation_test_message(a, b, "subtract", should_contain_x)
2215        );
2216    }
2217
2218    #[test]
2219    fn set_operations() {
2220        for a in SetOpInput::get_all_inputs() {
2221            for b in SetOpInput::get_all_inputs() {
2222                check_union(&a, &b);
2223                check_intersect(&a, &b);
2224                check_subtract(&a, &b);
2225            }
2226        }
2227    }
2228
2229    #[test]
2230    fn inverted() {
2231        let mut set = IntSet::<u32>::empty();
2232
2233        set.insert(13);
2234        set.insert(800);
2235        assert!(set.contains(13));
2236        assert!(set.contains(800));
2237        assert_eq!(set.len(), 2);
2238        assert!(!set.is_inverted());
2239
2240        set.invert();
2241        assert_eq!(set.len(), u32::MAX as u64 - 1);
2242        assert!(!set.contains(13));
2243        assert!(set.contains(80));
2244        assert!(!set.contains(800));
2245        assert!(set.is_inverted());
2246
2247        set.remove(80);
2248        assert!(!set.contains(80));
2249
2250        set.insert(13);
2251        assert!(set.contains(13));
2252
2253        set.invert();
2254        assert!(set.contains(80));
2255        assert!(set.contains(800));
2256    }
2257
2258    #[test]
2259    fn limited_domain_type() {
2260        let mut set = IntSet::<EvenInts>::empty();
2261
2262        set.insert(EvenInts(2));
2263        set.insert(EvenInts(8));
2264        set.insert(EvenInts(12));
2265        set.insert_range(EvenInts(20)..=EvenInts(34));
2266        set.remove_range(EvenInts(30)..=EvenInts(34));
2267
2268        assert!(set.contains(EvenInts(2)));
2269        assert!(!set.contains(EvenInts(4)));
2270
2271        assert!(!set.contains(EvenInts(18)));
2272        assert!(!set.contains(EvenInts(19)));
2273        assert!(set.contains(EvenInts(20)));
2274        assert!(!set.contains(EvenInts(21)));
2275        assert!(set.contains(EvenInts(28)));
2276        assert!(!set.contains(EvenInts(29)));
2277        assert!(!set.contains(EvenInts(30)));
2278
2279        let copy: IntSet<EvenInts> = set.iter().collect();
2280        assert_eq!(set, copy);
2281
2282        set.invert();
2283
2284        assert!(!set.contains(EvenInts(2)));
2285        assert!(set.contains(EvenInts(4)));
2286
2287        let Some(max) = set.iter().max() else {
2288            panic!("should have a max");
2289        };
2290
2291        assert_eq!(max.0, u16::MAX - 1);
2292
2293        {
2294            let mut it = set.iter();
2295            assert_eq!(it.next(), Some(EvenInts(0)));
2296            assert_eq!(it.next(), Some(EvenInts(4)));
2297            assert_eq!(it.next(), Some(EvenInts(6)));
2298            assert_eq!(it.next(), Some(EvenInts(10)));
2299            assert_eq!(it.next(), Some(EvenInts(14)));
2300        }
2301
2302        set.insert_range(EvenInts(6)..=EvenInts(10));
2303        {
2304            let mut it = set.iter();
2305            assert_eq!(it.next(), Some(EvenInts(0)));
2306            assert_eq!(it.next(), Some(EvenInts(4)));
2307            assert_eq!(it.next(), Some(EvenInts(6)));
2308            assert_eq!(it.next(), Some(EvenInts(8)));
2309            assert_eq!(it.next(), Some(EvenInts(10)));
2310            assert_eq!(it.next(), Some(EvenInts(14)));
2311        }
2312
2313        set.remove_range(EvenInts(6)..=EvenInts(10));
2314        {
2315            let mut it = set.iter();
2316            assert_eq!(it.next(), Some(EvenInts(0)));
2317            assert_eq!(it.next(), Some(EvenInts(4)));
2318            assert_eq!(it.next(), Some(EvenInts(14)));
2319        }
2320    }
2321
2322    #[test]
2323    fn with_u16() {
2324        let mut set = IntSet::<u16>::empty();
2325
2326        set.insert(5);
2327        set.insert(8);
2328        set.insert(12);
2329        set.insert_range(200..=210);
2330
2331        assert!(set.contains(5));
2332        assert!(!set.contains(6));
2333        assert!(!set.contains(199));
2334        assert!(set.contains(200));
2335        assert!(set.contains(210));
2336        assert!(!set.contains(211));
2337
2338        let copy: IntSet<u16> = set.iter().collect();
2339        assert_eq!(set, copy);
2340
2341        set.invert();
2342
2343        assert!(!set.contains(5));
2344        assert!(set.contains(6));
2345
2346        let Some(max) = set.iter().max() else {
2347            panic!("should have a max");
2348        };
2349
2350        assert_eq!(max, u16::MAX);
2351
2352        let mut it = set.iter();
2353        assert_eq!(it.next(), Some(0));
2354        assert_eq!(it.next(), Some(1));
2355        assert_eq!(it.next(), Some(2));
2356        assert_eq!(it.next(), Some(3));
2357        assert_eq!(it.next(), Some(4));
2358        assert_eq!(it.next(), Some(6));
2359    }
2360
2361    #[test]
2362    fn with_glyph_id_16() {
2363        let mut set = IntSet::<font_types::GlyphId16>::empty();
2364
2365        set.insert(GlyphId16::new(5));
2366        set.insert(GlyphId16::new(8));
2367        set.insert(GlyphId16::new(12));
2368        set.insert_range(GlyphId16::new(200)..=GlyphId16::new(210));
2369
2370        assert!(set.contains(GlyphId16::new(5)));
2371        assert!(!set.contains(GlyphId16::new(6)));
2372        assert!(!set.contains(GlyphId16::new(199)));
2373        assert!(set.contains(GlyphId16::new(200)));
2374        assert!(set.contains(GlyphId16::new(210)));
2375        assert!(!set.contains(GlyphId16::new(211)));
2376
2377        let copy: IntSet<GlyphId16> = set.iter().collect();
2378        assert_eq!(set, copy);
2379
2380        set.invert();
2381
2382        assert!(!set.contains(GlyphId16::new(5)));
2383        assert!(set.contains(GlyphId16::new(6)));
2384
2385        let Some(max) = set.iter().max() else {
2386            panic!("should have a max");
2387        };
2388
2389        assert_eq!(max, GlyphId16::new(u16::MAX));
2390
2391        let mut it = set.iter();
2392        assert_eq!(it.next(), Some(GlyphId16::new(0)));
2393        assert_eq!(it.next(), Some(GlyphId16::new(1)));
2394        assert_eq!(it.next(), Some(GlyphId16::new(2)));
2395        assert_eq!(it.next(), Some(GlyphId16::new(3)));
2396        assert_eq!(it.next(), Some(GlyphId16::new(4)));
2397        assert_eq!(it.next(), Some(GlyphId16::new(6)));
2398    }
2399
2400    #[test]
2401    fn with_glyph_id() {
2402        let mut set = IntSet::<font_types::GlyphId>::empty();
2403
2404        set.insert(GlyphId::new(5));
2405        set.insert(GlyphId::new(8));
2406        set.insert(GlyphId::new(12));
2407        set.insert_range(GlyphId::new(200)..=GlyphId::new(210));
2408
2409        assert!(set.contains(GlyphId::new(5)));
2410        assert!(!set.contains(GlyphId::new(6)));
2411        assert!(!set.contains(GlyphId::new(199)));
2412        assert!(set.contains(GlyphId::new(200)));
2413        assert!(set.contains(GlyphId::new(210)));
2414        assert!(!set.contains(GlyphId::new(211)));
2415
2416        let copy: IntSet<GlyphId> = set.iter().collect();
2417        assert_eq!(set, copy);
2418
2419        set.invert();
2420
2421        assert!(!set.contains(GlyphId::new(5)));
2422        assert!(set.contains(GlyphId::new(6)));
2423
2424        let mut it = set.iter();
2425        assert_eq!(it.next(), Some(GlyphId::new(0)));
2426        assert_eq!(it.next(), Some(GlyphId::new(1)));
2427        assert_eq!(it.next(), Some(GlyphId::new(2)));
2428        assert_eq!(it.next(), Some(GlyphId::new(3)));
2429        assert_eq!(it.next(), Some(GlyphId::new(4)));
2430        assert_eq!(it.next(), Some(GlyphId::new(6)));
2431    }
2432
2433    #[test]
2434    fn with_tag() {
2435        let mut set = IntSet::<Tag>::empty();
2436
2437        set.insert(Tag::new(b"GSUB"));
2438        set.insert(Tag::new(b"CFF "));
2439        set.insert(Tag::new(b"OS/2"));
2440
2441        assert!(set.contains(Tag::new(b"GSUB")));
2442        assert!(!set.contains(Tag::new(b"GSU ")));
2443        assert!(set.contains(Tag::new(b"CFF ")));
2444        assert!(set.contains(Tag::new(b"OS/2")));
2445
2446        let copy: IntSet<Tag> = set.iter().collect();
2447        assert_eq!(set, copy);
2448
2449        set.invert();
2450
2451        assert!(!set.contains(Tag::new(b"GSUB")));
2452        assert!(set.contains(Tag::new(b"GSU ")));
2453        assert!(!set.contains(Tag::new(b"CFF ")));
2454        assert!(!set.contains(Tag::new(b"OS/2")));
2455    }
2456
2457    #[test]
2458    fn intersects_range() {
2459        let mut set = IntSet::<u32>::empty();
2460        assert!(!set.intersects_range(0..=0));
2461        assert!(!set.intersects_range(0..=100));
2462        assert!(!set.intersects_range(0..=u32::MAX));
2463        assert!(!set.intersects_range(u32::MAX..=u32::MAX));
2464
2465        set.insert(1234);
2466        assert!(!set.intersects_range(0..=1233));
2467        assert!(!set.intersects_range(1235..=1240));
2468
2469        assert!(set.intersects_range(1234..=1234));
2470        assert!(set.intersects_range(1230..=1240));
2471        assert!(set.intersects_range(0..=1234));
2472        assert!(set.intersects_range(1234..=u32::MAX));
2473
2474        set.insert(0);
2475        assert!(set.intersects_range(0..=0));
2476        assert!(!set.intersects_range(1..=1));
2477    }
2478
2479    #[test]
2480    fn intersects_set() {
2481        macro_rules! assert_intersects {
2482            ($lhs:path, $rhs:path, $expected:expr) => {
2483                assert_eq!($lhs.intersects_set(&$rhs), $expected);
2484                assert_eq!($rhs.intersects_set(&$lhs), $expected);
2485            };
2486        }
2487
2488        assert!(!IntSet::<u32>::empty().intersects_set(&IntSet::<u32>::empty()));
2489
2490        let empty = IntSet::<u32>::empty();
2491        let a = IntSet::from([1u32, 5, 6, 7, 8, 12]);
2492        let b = IntSet::from([2u32, 13]);
2493        let c = IntSet::from([8u32, 14]);
2494        let mut d = IntSet::all();
2495        d.remove_range(0u32..=13);
2496        let mut e = IntSet::all();
2497        e.remove_range(0u32..=100);
2498
2499        assert_intersects!(a, b, false);
2500        assert_intersects!(a, c, true);
2501        assert_intersects!(a, d, false);
2502
2503        assert_intersects!(b, c, false);
2504        assert_intersects!(b, d, false);
2505        assert_intersects!(b, e, false);
2506
2507        assert_intersects!(c, d, true);
2508        assert_intersects!(c, e, false);
2509
2510        assert_intersects!(d, e, true);
2511
2512        assert_intersects!(a, empty, false);
2513        assert_intersects!(b, empty, false);
2514        assert_intersects!(c, empty, false);
2515        assert_intersects!(d, empty, false);
2516        assert_intersects!(e, empty, false);
2517    }
2518
2519    #[test]
2520    fn intersects_range_discontinuous() {
2521        let mut set = IntSet::<EvenInts>::empty();
2522        assert!(!set.intersects_range(EvenInts(0)..=EvenInts(0)));
2523        assert!(!set.intersects_range(EvenInts(0)..=EvenInts(100)));
2524        assert!(!set.intersects_range(EvenInts(0)..=EvenInts(u16::MAX - 1)));
2525        assert!(!set.intersects_range(EvenInts(u16::MAX - 1)..=EvenInts(u16::MAX - 1)));
2526
2527        set.insert(EvenInts(1234));
2528        assert!(!set.intersects_range(EvenInts(0)..=EvenInts(1232)));
2529        assert!(!set.intersects_range(EvenInts(1236)..=EvenInts(1240)));
2530
2531        assert!(set.intersects_range(EvenInts(1234)..=EvenInts(1234)));
2532        assert!(set.intersects_range(EvenInts(1230)..=EvenInts(1240)));
2533        assert!(set.intersects_range(EvenInts(0)..=EvenInts(1234)));
2534        assert!(set.intersects_range(EvenInts(1234)..=EvenInts(u16::MAX - 1)));
2535
2536        set.insert(EvenInts(0));
2537        assert!(set.intersects_range(EvenInts(0)..=EvenInts(0)));
2538        assert!(!set.intersects_range(EvenInts(2)..=EvenInts(2)));
2539    }
2540
2541    #[test]
2542    fn intersects_range_exclusive() {
2543        let mut set = IntSet::<u32>::all();
2544        assert!(set.intersects_range(0..=0));
2545        assert!(set.intersects_range(0..=100));
2546        assert!(set.intersects_range(0..=u32::MAX));
2547        assert!(set.intersects_range(u32::MAX..=u32::MAX));
2548
2549        set.remove(1234);
2550        assert!(set.intersects_range(0..=1233));
2551        assert!(set.intersects_range(1235..=1240));
2552
2553        assert!(!set.intersects_range(1234..=1234));
2554        assert!(set.intersects_range(1230..=1240));
2555        assert!(set.intersects_range(0..=1234));
2556        assert!(set.intersects_range(1234..=u32::MAX));
2557
2558        set.remove(0);
2559        assert!(!set.intersects_range(0..=0));
2560        assert!(set.intersects_range(1..=1));
2561
2562        set.remove_range(5000..=5200);
2563        assert!(!set.intersects_range(5000..=5200));
2564        assert!(!set.intersects_range(5100..=5150));
2565        assert!(set.intersects_range(4999..=5200));
2566        assert!(set.intersects_range(5000..=5201));
2567    }
2568
2569    #[test]
2570    fn intersects_range_exclusive_discontinuous() {
2571        let mut set = IntSet::<EvenInts>::all();
2572        assert!(set.intersects_range(EvenInts(0)..=EvenInts(0)));
2573        assert!(set.intersects_range(EvenInts(0)..=EvenInts(100)));
2574        assert!(set.intersects_range(EvenInts(0)..=EvenInts(u16::MAX - 1)));
2575        assert!(set.intersects_range(EvenInts(u16::MAX - 1)..=EvenInts(u16::MAX - 1)));
2576
2577        set.remove(EvenInts(1234));
2578        assert!(set.intersects_range(EvenInts(0)..=EvenInts(1232)));
2579        assert!(set.intersects_range(EvenInts(1236)..=EvenInts(1240)));
2580
2581        assert!(!set.intersects_range(EvenInts(1234)..=EvenInts(1234)));
2582        assert!(set.intersects_range(EvenInts(1230)..=EvenInts(1240)));
2583        assert!(set.intersects_range(EvenInts(0)..=EvenInts(1234)));
2584        assert!(set.intersects_range(EvenInts(1234)..=EvenInts(u16::MAX - 1)));
2585
2586        set.remove(EvenInts(0));
2587        assert!(!set.intersects_range(EvenInts(0)..=EvenInts(0)));
2588        assert!(set.intersects_range(EvenInts(2)..=EvenInts(2)));
2589
2590        set.remove_range(EvenInts(5000)..=EvenInts(5200));
2591        assert!(!set.intersects_range(EvenInts(5000)..=EvenInts(5200)));
2592        assert!(!set.intersects_range(EvenInts(5100)..=EvenInts(5150)));
2593        assert!(set.intersects_range(EvenInts(4998)..=EvenInts(5200)));
2594        assert!(set.intersects_range(EvenInts(5000)..=EvenInts(5202)));
2595    }
2596
2597    #[test]
2598    fn length() {
2599        let mut s = IntSet::<u32>::empty();
2600        assert_eq!(s.len(), 0);
2601        s.insert(5);
2602        s.insert(5);
2603        s.insert(100);
2604        assert_eq!(s.len(), 2);
2605
2606        s.invert();
2607        assert_eq!(s.len(), (u32::MAX - 1) as u64);
2608
2609        assert_eq!(IntSet::<u32>::all().len(), (u32::MAX as u64) + 1);
2610
2611        let mut s = IntSet::<TwoParts>::all();
2612        assert_eq!(s.len(), 13);
2613        s.remove(TwoParts::from_u32(InDomain(5)));
2614        assert_eq!(s.len(), 12);
2615
2616        for v in TwoParts::ordered_values() {
2617            s.remove(TwoParts::from_u32(InDomain(v)));
2618        }
2619        assert_eq!(s.len(), 0);
2620    }
2621
2622    #[test]
2623    fn ordering() {
2624        macro_rules! assert_ord {
2625            ($lhs:expr, $rhs:expr, $ord:path) => {
2626                assert_eq!(
2627                    IntSet::from($lhs.clone()).cmp(&IntSet::from($rhs.clone())),
2628                    $ord,
2629                    "{:?}, {:?}",
2630                    $lhs,
2631                    $rhs
2632                )
2633            };
2634        }
2635
2636        const EMPTY: [u16; 0] = [];
2637        assert_ord!(EMPTY, EMPTY, Ordering::Equal);
2638        assert_ord!(EMPTY, [0], Ordering::Less);
2639        assert_ord!([0u16], [0], Ordering::Equal);
2640        assert_ord!([0u16, 1, 2], [1, 2, 3], Ordering::Less);
2641        assert_ord!([0u16, 1, 4], [1, 2, 3], Ordering::Less);
2642        assert_ord!([1u16, 2, 3], [0, 2, 4], Ordering::Greater);
2643        assert_ord!([5u16, 4, 0], [1, 2, 3], Ordering::Less); // out of order
2644        assert_ord!([1u16, 2, 3], [1, 2, 3, 4], Ordering::Less); // out of order
2645        assert_ord!([2u16, 3, 4], [1, 2, 3, 4, 5], Ordering::Greater); // out of order
2646
2647        // Exclusive - Exclusive
2648        let all = IntSet::<u16>::all();
2649        let mut all_but_0 = all.clone();
2650        all_but_0.remove(0);
2651        let mut all_but_5 = all.clone();
2652        all_but_5.remove(5);
2653
2654        assert_eq!(all.cmp(&all), Ordering::Equal);
2655        assert_eq!(all.cmp(&all_but_0), Ordering::Less);
2656        assert_eq!(all_but_0.cmp(&all), Ordering::Greater);
2657
2658        let mut a = IntSet::<u16>::all();
2659        a.remove_range(0..=5);
2660        a.remove_range(221..=1693);
2661        let mut b = IntSet::<u16>::all();
2662        b.remove_range(0..=1693);
2663        assert_eq!(a.cmp(&b), Ordering::Less);
2664
2665        // Mixed
2666        let mut inc_all_but_0 = IntSet::<u16>::empty();
2667        inc_all_but_0.insert_range(1..=u16::MAX);
2668        let mut inc_all_but_5 = IntSet::<u16>::empty();
2669        inc_all_but_5.insert_range(0..=4);
2670        inc_all_but_5.insert_range(6..=u16::MAX);
2671
2672        assert_eq!(all.cmp(&all), Ordering::Equal);
2673        assert_eq!(all.cmp(&inc_all_but_0), Ordering::Less);
2674        assert_eq!(inc_all_but_0.cmp(&all), Ordering::Greater);
2675        assert_eq!(inc_all_but_5.cmp(&all_but_0), Ordering::Less);
2676
2677        let mut a = IntSet::<u16>::all();
2678        a.remove_range(8..=1160);
2679        let mut b = IntSet::<u16>::empty();
2680        b.insert_range(0..=259);
2681
2682        assert_eq!(a.cmp(&b), Ordering::Greater);
2683
2684        let mut a = IntSet::<u16>::all();
2685        a.remove_range(8..=u16::MAX);
2686        let mut b = IntSet::<u16>::empty();
2687        b.insert_range(0..=259);
2688
2689        assert_eq!(a.cmp(&b), Ordering::Less);
2690    }
2691
2692    #[cfg(feature = "serde")]
2693    fn roundtrip_json<T: Domain>(set: &IntSet<T>) -> Result<IntSet<T>, serde_json::Error> {
2694        let json = serde_json::to_vec(&set).unwrap();
2695        serde_json::from_slice(&json)
2696    }
2697
2698    #[test]
2699    #[cfg(feature = "serde")]
2700    fn simple_serde() {
2701        let mut set = IntSet::empty();
2702        set.insert(0u32);
2703        set.insert(u32::MAX);
2704        assert_eq!(roundtrip_json(&set).unwrap(), set);
2705    }
2706
2707    #[test]
2708    #[cfg(feature = "serde")]
2709    fn serde_non_contiguous() {
2710        fn ev(val: u16) -> EvenInts {
2711            assert!(val % 2 == 0);
2712            EvenInts(val)
2713        }
2714        let set = IntSet::<EvenInts>::from([ev(2), ev(166), ev(u16::MAX - 1)]);
2715        assert_eq!(roundtrip_json(&set).unwrap(), set);
2716    }
2717
2718    #[test]
2719    #[cfg(feature = "serde")]
2720    #[should_panic(expected = "out of range for domain")]
2721    fn serde_non_contiguous_out_of_domain() {
2722        let set = IntSet::from([1u16, 2, 3, 4, 5, 6, 7]);
2723        let bytes = serde_json::to_vec(&set).unwrap();
2724        serde_json::from_slice::<IntSet<EvenInts>>(&bytes).unwrap();
2725    }
2726
2727    #[test]
2728    #[cfg(feature = "serde")]
2729    fn non_contiguous_inverted() {
2730        let all = IntSet::<u16>::all();
2731        let bytes = serde_json::to_vec(&all).unwrap();
2732        let readback: IntSet<EvenInts> = serde_json::from_slice(&bytes).unwrap();
2733        let mut iter = readback.iter().map(|v| v.0);
2734        let mut values = (&mut iter).take(5).collect::<Vec<_>>();
2735        values.extend(iter.rev().take(5));
2736
2737        assert_eq!(values, [0, 2, 4, 6, 8, 65534, 65532, 65530, 65528, 65526])
2738    }
2739
2740    #[test]
2741    #[cfg(feature = "serde")]
2742    fn serde_inverted() {
2743        let mut set = IntSet::all();
2744        set.remove_range(0u16..=420);
2745        let bytes = serde_json::to_string(&set).unwrap();
2746        assert!(bytes.len() < 5000, "sanity check serialization");
2747        assert_eq!(roundtrip_json(&set).unwrap(), set)
2748    }
2749
2750    #[test]
2751    #[cfg(feature = "serde")]
2752    fn serde_inverted_out_of_domain() {
2753        let mut set = IntSet::all();
2754        set.remove_range(0u16..=250);
2755        let bytes = serde_json::to_string(&set).unwrap();
2756        let readback: IntSet<u8> = serde_json::from_str(&bytes).unwrap();
2757        assert_eq!(readback.len(), 5);
2758        assert_eq!(
2759            readback.iter().collect::<Vec<_>>(),
2760            [251, 252, 253, 254, 255]
2761        );
2762    }
2763
2764    #[test]
2765    #[cfg(feature = "serde")]
2766    #[should_panic(expected = "out of range for domain")]
2767    fn serde_out_of_domain() {
2768        let set = IntSet::from([u32::MAX]);
2769        let json = serde_json::to_vec(&set).unwrap();
2770        serde_json::from_slice::<IntSet<GlyphId16>>(&json).unwrap();
2771    }
2772}