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