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