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