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