1mod bitpage;
21mod bitset;
22mod input_bit_stream;
23mod output_bit_stream;
24pub mod sparse_bit_set;
25
26use bitset::BitSet;
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(BitSet),
99
100 Exclusive(BitSet),
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: BitSet) -> 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(BitSet::empty()), PhantomData::<T>)
442 }
443
444 pub const fn all() -> Self {
446 IntSet(Membership::Exclusive(BitSet::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, BitSet::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, BitSet::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 BitSet,
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 BitSet,
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 #[allow(clippy::mutable_key_type)]
1492 fn equal_and_hash() {
1493 let mut inc1 = IntSet::<u32>::empty();
1494 inc1.insert(14);
1495 inc1.insert(670);
1496
1497 let mut inc2 = IntSet::<u32>::empty();
1498 inc2.insert(670);
1499 inc2.insert(14);
1500
1501 let mut inc3 = inc1.clone();
1502 inc3.insert(5);
1503
1504 let mut exc = inc1.clone();
1505 exc.invert();
1506
1507 assert_eq!(inc1, inc2);
1508 assert_ne!(inc1, inc3);
1509 assert_ne!(inc1, exc);
1510
1511 let set = HashSet::from([inc1.clone(), inc3.clone(), exc.clone()]);
1512 assert!(set.contains(&inc1));
1513 assert!(set.contains(&inc3));
1514 assert!(set.contains(&exc));
1515
1516 assert_ne!(hash(&inc1), hash(&exc));
1517 assert_eq!(hash(&inc1), hash(&inc2));
1518 }
1519
1520 #[test]
1521 #[allow(clippy::mutable_key_type)]
1522 fn equal_and_hash_mixed_membership_types() {
1523 let mut inverted_all = IntSet::<TwoParts>::all();
1524 let mut all = IntSet::<TwoParts>::empty();
1525 for v in TwoParts::ordered_values() {
1526 all.insert(TwoParts(v as u16));
1527 }
1528
1529 assert_eq!(inverted_all, all);
1530 assert_eq!(hash(&all), hash(&inverted_all));
1531
1532 inverted_all.remove(TwoParts(5));
1533 assert_ne!(inverted_all, all);
1534
1535 all.remove(TwoParts(5));
1536 assert_eq!(inverted_all, all);
1537 assert_eq!(hash(&all), hash(&inverted_all));
1538 }
1539
1540 #[test]
1541 fn iter() {
1542 let mut set = IntSet::<u32>::empty();
1543 set.insert(3);
1544 set.insert(8);
1545 set.insert(534);
1546 set.insert(700);
1547 set.insert(10000);
1548 set.insert(10001);
1549 set.insert(10002);
1550
1551 let v: Vec<u32> = set.iter().collect();
1552 assert_eq!(v, vec![3, 8, 534, 700, 10000, 10001, 10002]);
1553
1554 let v: Vec<u32> = set.inclusive_iter().unwrap().collect();
1555 assert_eq!(v, vec![3, 8, 534, 700, 10000, 10001, 10002]);
1556 }
1557
1558 #[test]
1559 fn iter_backwards() {
1560 let mut set = IntSet::<u32>::empty();
1561 set.insert_range(1..=6);
1562 {
1563 let mut it = set.iter();
1564 assert_eq!(Some(1), it.next());
1565 assert_eq!(Some(6), it.next_back());
1566 assert_eq!(Some(5), it.next_back());
1567 assert_eq!(Some(2), it.next());
1568 assert_eq!(Some(3), it.next());
1569 assert_eq!(Some(4), it.next());
1570 assert_eq!(None, it.next());
1571 assert_eq!(None, it.next_back());
1572 }
1573
1574 let mut set = IntSet::<u8>::empty();
1575 set.invert();
1576 set.remove_range(10..=255);
1577 set.remove(4);
1578 set.remove(8);
1579 {
1580 let mut it = set.iter();
1581 assert_eq!(Some(0), it.next());
1582 assert_eq!(Some(1), it.next());
1583 assert_eq!(Some(2), it.next());
1584 assert_eq!(Some(3), it.next());
1585
1586 assert_eq!(Some(9), it.next_back());
1587 assert_eq!(Some(7), it.next_back());
1588 assert_eq!(Some(6), it.next_back());
1589 assert_eq!(Some(5), it.next_back());
1590 assert_eq!(None, it.next_back());
1591
1592 assert_eq!(None, it.next());
1593 }
1594
1595 let mut set = IntSet::<u8>::empty();
1596 set.invert();
1597 set.remove_range(10..=255);
1598 set.remove(4);
1599 set.remove(8);
1600 {
1601 let mut it = set.iter();
1602 assert_eq!(Some(0), it.next());
1603 assert_eq!(Some(1), it.next());
1604 assert_eq!(Some(2), it.next());
1605 assert_eq!(Some(3), it.next());
1606 assert_eq!(Some(5), it.next());
1607
1608 assert_eq!(Some(9), it.next_back());
1609 assert_eq!(Some(7), it.next_back());
1610 assert_eq!(Some(6), it.next_back());
1611 assert_eq!(None, it.next_back());
1612
1613 assert_eq!(None, it.next());
1614 }
1615 }
1616
1617 #[test]
1618 fn exclusive_iter() {
1619 let mut set = IntSet::<u32>::all();
1620 set.remove(3);
1621 set.remove(7);
1622 set.remove(8);
1623
1624 let mut iter = set.iter();
1625
1626 assert_eq!(iter.next(), Some(0));
1627 assert_eq!(iter.next(), Some(1));
1628 assert_eq!(iter.next(), Some(2));
1629 assert_eq!(iter.next(), Some(4));
1630 assert_eq!(iter.next(), Some(5));
1631 assert_eq!(iter.next(), Some(6));
1632 assert_eq!(iter.next(), Some(9));
1633 assert_eq!(iter.next(), Some(10));
1634
1635 assert!(set.inclusive_iter().is_none());
1636
1637 let mut set = IntSet::<u32>::all();
1639 set.remove_range(0..=200);
1640
1641 let mut iter = set.iter();
1642 assert_eq!(iter.next(), Some(201));
1643
1644 let mut set = IntSet::<u8>::all();
1646 set.remove_range(200..=255);
1647
1648 let mut iter = set.iter();
1649 assert_eq!(iter.next_back(), Some(199));
1650 }
1651
1652 #[test]
1653 fn iter_ranges_inclusive() {
1654 let mut set = IntSet::<u32>::empty();
1655 let items: Vec<_> = set.iter_ranges().collect();
1656 assert_eq!(items, vec![]);
1657
1658 set.insert_range(200..=700);
1659 set.insert(5);
1660 let items: Vec<_> = set.iter_ranges().collect();
1661 assert_eq!(items, vec![5..=5, 200..=700]);
1662
1663 let mut set = IntSet::<u32>::empty();
1664 set.insert_range(0..=0);
1665 set.insert_range(u32::MAX..=u32::MAX);
1666 let items: Vec<_> = set.iter_ranges().collect();
1667 assert_eq!(items, vec![0..=0, u32::MAX..=u32::MAX]);
1668
1669 let mut set = IntSet::<u32>::empty();
1670 set.insert_range(0..=5);
1671 set.insert_range(u32::MAX - 5..=u32::MAX);
1672 let items: Vec<_> = set.iter_ranges().collect();
1673 assert_eq!(items, vec![0..=5, u32::MAX - 5..=u32::MAX]);
1674
1675 let mut inverted = set.clone();
1676 inverted.invert();
1677 assert_eq!(
1678 set.iter_ranges().collect::<Vec<_>>(),
1679 inverted.iter_excluded_ranges().collect::<Vec<_>>()
1680 );
1681 }
1682
1683 #[test]
1684 fn iter_ranges_inclusive_discontinuous() {
1685 let mut set = IntSet::<EvenInts>::empty();
1686 let items: Vec<_> = set.iter_ranges().collect();
1687 assert_eq!(items, vec![]);
1688
1689 set.insert_range(EvenInts(4)..=EvenInts(12));
1690 set.insert(EvenInts(16));
1691
1692 let items: Vec<_> = set.iter_ranges().collect();
1693 assert_eq!(
1694 items,
1695 vec![EvenInts(4)..=EvenInts(12), EvenInts(16)..=EvenInts(16)]
1696 );
1697
1698 let mut inverted = set.clone();
1699 inverted.invert();
1700 assert_eq!(
1701 set.iter_ranges().collect::<Vec<_>>(),
1702 inverted.iter_excluded_ranges().collect::<Vec<_>>()
1703 );
1704 }
1705
1706 #[test]
1707 fn iter_ranges_exclusive() {
1708 let mut set = IntSet::<u32>::all();
1709 set.remove_range(200..=700);
1710 set.remove(5);
1711 let items: Vec<_> = set.iter_ranges().collect();
1712 assert_eq!(items, vec![0..=4, 6..=199, 701..=u32::MAX]);
1713
1714 let mut set = IntSet::<u32>::all();
1715 set.remove_range(0..=700);
1716 let items: Vec<_> = set.iter_ranges().collect();
1717 assert_eq!(items, vec![701..=u32::MAX]);
1718
1719 let mut inverted = set.clone();
1720 inverted.invert();
1721 assert_eq!(
1722 set.iter_ranges().collect::<Vec<_>>(),
1723 inverted.iter_excluded_ranges().collect::<Vec<_>>()
1724 );
1725
1726 let mut set = IntSet::<u32>::all();
1727 set.remove_range(u32::MAX - 10..=u32::MAX);
1728 let items: Vec<_> = set.iter_ranges().collect();
1729 assert_eq!(items, vec![0..=u32::MAX - 11]);
1730
1731 let mut set = IntSet::<u16>::all();
1732 set.remove_range(0..=u16::MAX);
1733 let items: Vec<_> = set.iter_ranges().collect();
1734 assert_eq!(items, vec![]);
1735
1736 let mut set = IntSet::<u16>::all();
1737 set.remove_range(0..=u16::MAX - 1);
1738 let items: Vec<_> = set.iter_ranges().collect();
1739 assert_eq!(items, vec![u16::MAX..=u16::MAX]);
1740
1741 let mut set = IntSet::<u16>::all();
1742 set.remove_range(1..=u16::MAX);
1743 let items: Vec<_> = set.iter_ranges().collect();
1744 assert_eq!(items, vec![0..=0]);
1745
1746 let set = IntSet::<u32>::all();
1747 let items: Vec<_> = set.iter_ranges().collect();
1748 assert_eq!(items, vec![0..=u32::MAX]);
1749 }
1750
1751 #[test]
1752 fn iter_ranges_exclusive_discontinuous() {
1753 let mut set = IntSet::<EvenInts>::all();
1754 set.remove_range(EvenInts(0)..=EvenInts(8));
1755 set.remove_range(EvenInts(16)..=EvenInts(u16::MAX - 1));
1756 let items: Vec<_> = set.iter_ranges().collect();
1757 assert_eq!(items, vec![EvenInts(10)..=EvenInts(14),]);
1758
1759 let mut set = IntSet::<TwoParts>::all();
1760 set.remove_range(TwoParts(11)..=TwoParts(13));
1761 let items: Vec<_> = set.iter_ranges().collect();
1762 assert_eq!(
1763 items,
1764 vec![TwoParts(2)..=TwoParts(10), TwoParts(14)..=TwoParts(16),]
1765 );
1766
1767 let mut inverted = set.clone();
1768 inverted.invert();
1769 assert_eq!(
1770 set.iter_ranges().collect::<Vec<_>>(),
1771 inverted.iter_excluded_ranges().collect::<Vec<_>>()
1772 );
1773
1774 let mut set = IntSet::<TwoParts>::all();
1775 set.remove_range(TwoParts(2)..=TwoParts(16));
1776 let items: Vec<_> = set.iter_ranges().collect();
1777 assert_eq!(items, vec![]);
1778
1779 let mut set = IntSet::<TwoParts>::all();
1780 set.remove_range(TwoParts(2)..=TwoParts(5));
1781 let items: Vec<_> = set.iter_ranges().collect();
1782 assert_eq!(items, vec![TwoParts(8)..=TwoParts(16),]);
1783
1784 let mut set = IntSet::<TwoParts>::all();
1785 set.remove_range(TwoParts(6)..=TwoParts(16));
1786 let items: Vec<_> = set.iter_ranges().collect();
1787 assert_eq!(items, vec![TwoParts(2)..=TwoParts(5),]);
1788
1789 let set = IntSet::<TwoPartsBounds>::all();
1791 let items: Vec<_> = set.iter_ranges().collect();
1792 assert_eq!(items, vec![TwoPartsBounds(0)..=TwoPartsBounds(u32::MAX),]);
1793 }
1794
1795 #[test]
1796 fn iter_range() {
1797 let mut set = IntSet::<u32>::empty();
1798 assert_eq!(set.iter_after(0).count(), 0);
1799
1800 set.extend([5, 7, 10, 1250, 1300, 3001]);
1801
1802 assert_eq!(
1803 set.iter_after(0).collect::<Vec<u32>>(),
1804 vec![5, 7, 10, 1250, 1300, 3001]
1805 );
1806 assert_eq!(
1807 set.range(0..).collect::<Vec<u32>>(),
1808 vec![5, 7, 10, 1250, 1300, 3001]
1809 );
1810
1811 assert_eq!(
1812 set.iter_after(5).collect::<Vec<u32>>(),
1813 vec![7, 10, 1250, 1300, 3001]
1814 );
1815 assert_eq!(
1816 set.range(5..).collect::<Vec<u32>>(),
1817 vec![5, 7, 10, 1250, 1300, 3001]
1818 );
1819
1820 assert_eq!(
1821 set.iter_after(700).collect::<Vec<u32>>(),
1822 vec![1250, 1300, 3001]
1823 );
1824 assert_eq!(
1825 set.range(700..).collect::<Vec<u32>>(),
1826 vec![1250, 1300, 3001]
1827 );
1828 }
1829
1830 #[test]
1831 fn iter_after_from_exclusive() {
1832 let mut set = IntSet::<u32>::empty();
1833 set.extend([5, 7, 10, 1250, 1300, 3001]);
1834 set.invert();
1835
1836 assert_eq!(
1837 set.iter_after(3).take(5).collect::<Vec<u32>>(),
1838 vec![4, 6, 8, 9, 11]
1839 );
1840 assert_eq!(
1841 set.range(3..).take(5).collect::<Vec<u32>>(),
1842 vec![3, 4, 6, 8, 9]
1843 );
1844
1845 assert_eq!(
1846 set.iter_after(0).take(5).collect::<Vec<u32>>(),
1847 vec![1, 2, 3, 4, 6]
1848 );
1849 assert_eq!(
1850 set.range(0..).take(5).collect::<Vec<u32>>(),
1851 vec![0, 1, 2, 3, 4]
1852 );
1853
1854 assert_eq!(
1855 set.iter_after(u32::MAX - 1).take(1).collect::<Vec<u32>>(),
1856 vec![u32::MAX]
1857 );
1858 assert_eq!(
1859 set.range(u32::MAX - 1..).take(2).collect::<Vec<u32>>(),
1860 vec![u32::MAX - 1, u32::MAX]
1861 );
1862
1863 assert_eq!(set.iter_after(u32::MAX).take(1).count(), 0);
1864 set.remove(u32::MAX);
1865 assert_eq!(set.range(u32::MAX..).take(1).count(), 0);
1866 assert_eq!(set.iter_after(u32::MAX - 1).take(1).count(), 0);
1867 }
1868
1869 #[test]
1870 fn iter_after_discontinuous() {
1871 let mut set = IntSet::<EvenInts>::empty();
1872 set.extend([EvenInts(6), EvenInts(10)]);
1873 set.invert();
1874
1875 assert_eq!(
1876 set.iter_after(EvenInts(2))
1877 .take(5)
1878 .collect::<Vec<EvenInts>>(),
1879 vec![
1880 EvenInts(4),
1881 EvenInts(8),
1882 EvenInts(12),
1883 EvenInts(14),
1884 EvenInts(16)
1885 ]
1886 );
1887 assert_eq!(
1888 set.range(EvenInts(2)..).take(5).collect::<Vec<EvenInts>>(),
1889 vec![
1890 EvenInts(2),
1891 EvenInts(4),
1892 EvenInts(8),
1893 EvenInts(12),
1894 EvenInts(14)
1895 ]
1896 );
1897
1898 assert_eq!(
1899 set.iter_after(EvenInts(4))
1900 .take(5)
1901 .collect::<Vec<EvenInts>>(),
1902 vec![
1903 EvenInts(8),
1904 EvenInts(12),
1905 EvenInts(14),
1906 EvenInts(16),
1907 EvenInts(18)
1908 ]
1909 );
1910
1911 assert_eq!(
1912 set.iter_after(EvenInts(u16::MAX - 1))
1913 .collect::<Vec<EvenInts>>(),
1914 vec![]
1915 );
1916 assert_eq!(
1917 set.range(EvenInts(u16::MAX - 1)..)
1918 .collect::<Vec<EvenInts>>(),
1919 vec![EvenInts(u16::MAX - 1)]
1920 );
1921
1922 assert_eq!(
1923 set.iter_after(EvenInts(u16::MAX - 5))
1924 .collect::<Vec<EvenInts>>(),
1925 vec![EvenInts(u16::MAX - 3), EvenInts(u16::MAX - 1)]
1926 );
1927
1928 set.remove(EvenInts(u16::MAX - 1));
1929 assert_eq!(
1930 set.iter_after(EvenInts(u16::MAX - 5))
1931 .collect::<Vec<EvenInts>>(),
1932 vec![EvenInts(u16::MAX - 3),]
1933 );
1934 assert_eq!(
1935 set.range(EvenInts(u16::MAX - 5)..)
1936 .collect::<Vec<EvenInts>>(),
1937 vec![EvenInts(u16::MAX - 5), EvenInts(u16::MAX - 3),]
1938 );
1939 }
1940
1941 #[test]
1942 #[allow(clippy::reversed_empty_ranges)]
1943 fn range() {
1944 let mut set = IntSet::<u32>::empty();
1945 assert_eq!(set.range(0..=5).count(), 0);
1946
1947 set.extend([5, 7, 10, 1250, 1300, 3001]);
1948
1949 assert_eq!(set.range(0..=5).collect::<Vec<u32>>(), vec![5]);
1950 assert_eq!(set.range(5..=11).collect::<Vec<u32>>(), vec![5, 7, 10]);
1951 assert_eq!(set.range(5..10).collect::<Vec<u32>>(), vec![5, 7]);
1952 assert_eq!(set.range(..10).collect::<Vec<u32>>(), vec![5, 7]);
1953 assert_eq!(set.range(..=10).collect::<Vec<u32>>(), vec![5, 7, 10]);
1954 assert_eq!(set.range(6..=11).collect::<Vec<u32>>(), vec![7, 10]);
1955
1956 assert!(set.range(7..6).collect::<Vec<u32>>().is_empty());
1957 assert!(set.range(7..7).collect::<Vec<u32>>().is_empty());
1958 assert_eq!(set.range(7..=7).collect::<Vec<u32>>(), vec![7]);
1959
1960 assert!(set.range(5..=0).collect::<Vec<u32>>().is_empty());
1961 }
1962
1963 #[test]
1964 fn from_iterator() {
1965 let s: IntSet<u32> = [3, 8, 12, 589].into_iter().collect();
1966 let mut expected = IntSet::<u32>::empty();
1967 expected.insert(3);
1968 expected.insert(8);
1969 expected.insert(12);
1970 expected.insert(589);
1971
1972 assert_eq!(s, expected);
1973 }
1974
1975 #[test]
1976 fn from_int_set_iterator() {
1977 let s1: IntSet<u32> = [3, 8, 12, 589].into_iter().collect();
1978 let s2: IntSet<u32> = s1.iter().collect();
1979 assert_eq!(s1, s2);
1980 }
1981
1982 #[test]
1983 fn extend() {
1984 let mut s = IntSet::<u32>::empty();
1985 s.extend([3, 12]);
1986 s.extend([8, 10, 589]);
1987
1988 let mut expected = IntSet::<u32>::empty();
1989 expected.insert(3);
1990 expected.insert(8);
1991 expected.insert(10);
1992 expected.insert(12);
1993 expected.insert(589);
1994
1995 assert_eq!(s, expected);
1996 }
1997
1998 #[test]
1999 fn extend_on_inverted() {
2000 let mut s = IntSet::<u32>::all();
2001 for i in 10..=20 {
2002 s.remove(i);
2003 }
2004
2005 s.extend([12, 17, 18]);
2006
2007 assert!(!s.contains(11));
2008 assert!(s.contains(12));
2009 assert!(!s.contains(13));
2010
2011 assert!(!s.contains(16));
2012 assert!(s.contains(17));
2013 assert!(s.contains(18));
2014 assert!(!s.contains(19));
2015 assert!(s.contains(100));
2016 }
2017
2018 #[test]
2019 fn remove_all() {
2020 let mut empty = IntSet::<u32>::empty();
2021 let mut all = IntSet::<u32>::all();
2022
2023 empty.extend([1, 2, 3, 4]);
2024
2025 empty.remove_all([2, 3]);
2026 all.remove_all([2, 3]);
2027
2028 assert!(empty.contains(1));
2029 assert!(!empty.contains(2));
2030 assert!(!empty.contains(3));
2031 assert!(empty.contains(4));
2032
2033 assert!(all.contains(1));
2034 assert!(!all.contains(2));
2035 assert!(!all.contains(3));
2036 assert!(all.contains(4));
2037 }
2038
2039 #[test]
2040 fn remove_range() {
2041 let mut empty = IntSet::<u32>::empty();
2042 let mut all = IntSet::<u32>::all();
2043
2044 empty.extend([1, 2, 3, 4]);
2045
2046 empty.remove_range(2..=3);
2047 all.remove_range(2..=3);
2048
2049 assert!(empty.contains(1));
2050 assert!(!empty.contains(2));
2051 assert!(!empty.contains(3));
2052 assert!(empty.contains(4));
2053
2054 assert!(all.contains(1));
2055 assert!(!all.contains(2));
2056 assert!(!all.contains(3));
2057 assert!(all.contains(4));
2058 }
2059
2060 #[test]
2061 fn insert_remove_range_boundary() {
2062 let mut set = IntSet::<u32>::empty();
2063
2064 set.remove_range(u32::MAX - 10..=u32::MAX);
2065 assert!(!set.contains(u32::MAX));
2066 set.insert_range(u32::MAX - 10..=u32::MAX);
2067 assert!(set.contains(u32::MAX));
2068 set.remove_range(u32::MAX - 10..=u32::MAX);
2069 assert!(!set.contains(u32::MAX));
2070
2071 set.remove_range(0..=10);
2072 assert!(!set.contains(0));
2073 set.insert_range(0..=10);
2074 assert!(set.contains(0));
2075 set.remove_range(0..=10);
2076 assert!(!set.contains(0));
2077 }
2078
2079 #[test]
2080 fn insert_remove_range_exclusive_boundary() {
2081 let mut set = IntSet::<u32>::all();
2082
2083 set.remove_range(u32::MAX - 10..=u32::MAX);
2084 assert!(!set.contains(u32::MAX));
2085 set.insert_range(u32::MAX - 10..=u32::MAX);
2086 assert!(set.contains(u32::MAX));
2087 set.remove_range(u32::MAX - 10..=u32::MAX);
2088 assert!(!set.contains(u32::MAX));
2089
2090 set.remove_range(0..=10);
2091 assert!(!set.contains(0));
2092 set.insert_range(0..=10);
2093 assert!(set.contains(0));
2094 set.remove_range(0..=10);
2095 assert!(!set.contains(0));
2096 }
2097
2098 struct SetOpInput {
2099 has_x: bool,
2100 inverted: bool,
2101 has_page: bool,
2102 }
2103
2104 impl SetOpInput {
2105 fn get_all_inputs() -> Vec<SetOpInput> {
2106 let mut result: Vec<SetOpInput> = vec![];
2107 for has_x in [true, false] {
2108 for inverted in [true, false] {
2109 result.push(SetOpInput {
2110 has_x,
2111 inverted,
2112 has_page: false,
2113 });
2114 let can_have_empty_page = has_x == inverted;
2115 if can_have_empty_page {
2116 result.push(SetOpInput {
2117 has_x,
2118 inverted,
2119 has_page: true,
2120 });
2121 }
2122 }
2123 }
2124 result
2125 }
2126
2127 fn to_set(&self, x: u32) -> IntSet<u32> {
2128 let mut s = IntSet::<u32>::empty();
2129 if self.inverted {
2130 s.invert();
2131 }
2132 if self.has_page {
2133 if self.inverted {
2135 s.remove(x);
2136 } else {
2137 s.insert(x);
2138 }
2139 }
2140 if self.has_x {
2141 s.insert(x);
2142 } else {
2143 s.remove(x);
2144 }
2145 s
2146 }
2147 }
2148
2149 fn set_operation_test_message(
2150 a: &SetOpInput,
2151 b: &SetOpInput,
2152 op_name: &str,
2153 should_contain_x: bool,
2154 ) -> String {
2155 format!(
2156 "{}{}{} {} {}{}{} failed. {}",
2157 if a.inverted { "i" } else { "" },
2158 if a.has_page { "p" } else { "" },
2159 if a.has_x { "13" } else { "" },
2160 op_name,
2161 if b.inverted { "i" } else { "" },
2162 if b.has_page { "p" } else { "" },
2163 if b.has_x { "13" } else { "" },
2164 if should_contain_x {
2165 "Result did not have 13."
2166 } else {
2167 "Result should not have 13."
2168 }
2169 )
2170 }
2171
2172 fn check_union(a: &SetOpInput, b: &SetOpInput) {
2173 let x = 13;
2174 let mut set_a = a.to_set(x);
2175 let set_b = b.to_set(x);
2176
2177 let should_contain_x = a.has_x || b.has_x;
2178 set_a.union(&set_b);
2179
2180 assert_eq!(
2181 set_a.contains(x),
2182 should_contain_x,
2183 "{}",
2184 set_operation_test_message(a, b, "union", should_contain_x)
2185 );
2186 }
2187
2188 fn check_intersect(a: &SetOpInput, b: &SetOpInput) {
2189 let x = 13;
2190 let mut set_a = a.to_set(x);
2191 let set_b = b.to_set(x);
2192
2193 let should_contain_x = a.has_x && b.has_x;
2194 set_a.intersect(&set_b);
2195
2196 assert_eq!(
2197 set_a.contains(x),
2198 should_contain_x,
2199 "{}",
2200 set_operation_test_message(a, b, "intersect", should_contain_x)
2201 );
2202 }
2203
2204 fn check_subtract(a: &SetOpInput, b: &SetOpInput) {
2205 let x = 13;
2206 let mut set_a = a.to_set(x);
2207 let set_b = b.to_set(x);
2208
2209 let should_contain_x = a.has_x && (!b.has_x);
2210 set_a.subtract(&set_b);
2211
2212 assert_eq!(
2213 set_a.contains(x),
2214 should_contain_x,
2215 "{}",
2216 set_operation_test_message(a, b, "subtract", should_contain_x)
2217 );
2218 }
2219
2220 #[test]
2221 fn set_operations() {
2222 for a in SetOpInput::get_all_inputs() {
2223 for b in SetOpInput::get_all_inputs() {
2224 check_union(&a, &b);
2225 check_intersect(&a, &b);
2226 check_subtract(&a, &b);
2227 }
2228 }
2229 }
2230
2231 #[test]
2232 fn inverted() {
2233 let mut set = IntSet::<u32>::empty();
2234
2235 set.insert(13);
2236 set.insert(800);
2237 assert!(set.contains(13));
2238 assert!(set.contains(800));
2239 assert_eq!(set.len(), 2);
2240 assert!(!set.is_inverted());
2241
2242 set.invert();
2243 assert_eq!(set.len(), u32::MAX as u64 - 1);
2244 assert!(!set.contains(13));
2245 assert!(set.contains(80));
2246 assert!(!set.contains(800));
2247 assert!(set.is_inverted());
2248
2249 set.remove(80);
2250 assert!(!set.contains(80));
2251
2252 set.insert(13);
2253 assert!(set.contains(13));
2254
2255 set.invert();
2256 assert!(set.contains(80));
2257 assert!(set.contains(800));
2258 }
2259
2260 #[test]
2261 fn limited_domain_type() {
2262 let mut set = IntSet::<EvenInts>::empty();
2263
2264 set.insert(EvenInts(2));
2265 set.insert(EvenInts(8));
2266 set.insert(EvenInts(12));
2267 set.insert_range(EvenInts(20)..=EvenInts(34));
2268 set.remove_range(EvenInts(30)..=EvenInts(34));
2269
2270 assert!(set.contains(EvenInts(2)));
2271 assert!(!set.contains(EvenInts(4)));
2272
2273 assert!(!set.contains(EvenInts(18)));
2274 assert!(!set.contains(EvenInts(19)));
2275 assert!(set.contains(EvenInts(20)));
2276 assert!(!set.contains(EvenInts(21)));
2277 assert!(set.contains(EvenInts(28)));
2278 assert!(!set.contains(EvenInts(29)));
2279 assert!(!set.contains(EvenInts(30)));
2280
2281 let copy: IntSet<EvenInts> = set.iter().collect();
2282 assert_eq!(set, copy);
2283
2284 set.invert();
2285
2286 assert!(!set.contains(EvenInts(2)));
2287 assert!(set.contains(EvenInts(4)));
2288
2289 let Some(max) = set.iter().max() else {
2290 panic!("should have a max");
2291 };
2292
2293 assert_eq!(max.0, u16::MAX - 1);
2294
2295 {
2296 let mut it = set.iter();
2297 assert_eq!(it.next(), Some(EvenInts(0)));
2298 assert_eq!(it.next(), Some(EvenInts(4)));
2299 assert_eq!(it.next(), Some(EvenInts(6)));
2300 assert_eq!(it.next(), Some(EvenInts(10)));
2301 assert_eq!(it.next(), Some(EvenInts(14)));
2302 }
2303
2304 set.insert_range(EvenInts(6)..=EvenInts(10));
2305 {
2306 let mut it = set.iter();
2307 assert_eq!(it.next(), Some(EvenInts(0)));
2308 assert_eq!(it.next(), Some(EvenInts(4)));
2309 assert_eq!(it.next(), Some(EvenInts(6)));
2310 assert_eq!(it.next(), Some(EvenInts(8)));
2311 assert_eq!(it.next(), Some(EvenInts(10)));
2312 assert_eq!(it.next(), Some(EvenInts(14)));
2313 }
2314
2315 set.remove_range(EvenInts(6)..=EvenInts(10));
2316 {
2317 let mut it = set.iter();
2318 assert_eq!(it.next(), Some(EvenInts(0)));
2319 assert_eq!(it.next(), Some(EvenInts(4)));
2320 assert_eq!(it.next(), Some(EvenInts(14)));
2321 }
2322 }
2323
2324 #[test]
2325 fn with_u16() {
2326 let mut set = IntSet::<u16>::empty();
2327
2328 set.insert(5);
2329 set.insert(8);
2330 set.insert(12);
2331 set.insert_range(200..=210);
2332
2333 assert!(set.contains(5));
2334 assert!(!set.contains(6));
2335 assert!(!set.contains(199));
2336 assert!(set.contains(200));
2337 assert!(set.contains(210));
2338 assert!(!set.contains(211));
2339
2340 let copy: IntSet<u16> = set.iter().collect();
2341 assert_eq!(set, copy);
2342
2343 set.invert();
2344
2345 assert!(!set.contains(5));
2346 assert!(set.contains(6));
2347
2348 let Some(max) = set.iter().max() else {
2349 panic!("should have a max");
2350 };
2351
2352 assert_eq!(max, u16::MAX);
2353
2354 let mut it = set.iter();
2355 assert_eq!(it.next(), Some(0));
2356 assert_eq!(it.next(), Some(1));
2357 assert_eq!(it.next(), Some(2));
2358 assert_eq!(it.next(), Some(3));
2359 assert_eq!(it.next(), Some(4));
2360 assert_eq!(it.next(), Some(6));
2361 }
2362
2363 #[test]
2364 fn with_glyph_id_16() {
2365 let mut set = IntSet::<font_types::GlyphId16>::empty();
2366
2367 set.insert(GlyphId16::new(5));
2368 set.insert(GlyphId16::new(8));
2369 set.insert(GlyphId16::new(12));
2370 set.insert_range(GlyphId16::new(200)..=GlyphId16::new(210));
2371
2372 assert!(set.contains(GlyphId16::new(5)));
2373 assert!(!set.contains(GlyphId16::new(6)));
2374 assert!(!set.contains(GlyphId16::new(199)));
2375 assert!(set.contains(GlyphId16::new(200)));
2376 assert!(set.contains(GlyphId16::new(210)));
2377 assert!(!set.contains(GlyphId16::new(211)));
2378
2379 let copy: IntSet<GlyphId16> = set.iter().collect();
2380 assert_eq!(set, copy);
2381
2382 set.invert();
2383
2384 assert!(!set.contains(GlyphId16::new(5)));
2385 assert!(set.contains(GlyphId16::new(6)));
2386
2387 let Some(max) = set.iter().max() else {
2388 panic!("should have a max");
2389 };
2390
2391 assert_eq!(max, GlyphId16::new(u16::MAX));
2392
2393 let mut it = set.iter();
2394 assert_eq!(it.next(), Some(GlyphId16::new(0)));
2395 assert_eq!(it.next(), Some(GlyphId16::new(1)));
2396 assert_eq!(it.next(), Some(GlyphId16::new(2)));
2397 assert_eq!(it.next(), Some(GlyphId16::new(3)));
2398 assert_eq!(it.next(), Some(GlyphId16::new(4)));
2399 assert_eq!(it.next(), Some(GlyphId16::new(6)));
2400 }
2401
2402 #[test]
2403 fn with_glyph_id() {
2404 let mut set = IntSet::<font_types::GlyphId>::empty();
2405
2406 set.insert(GlyphId::new(5));
2407 set.insert(GlyphId::new(8));
2408 set.insert(GlyphId::new(12));
2409 set.insert_range(GlyphId::new(200)..=GlyphId::new(210));
2410
2411 assert!(set.contains(GlyphId::new(5)));
2412 assert!(!set.contains(GlyphId::new(6)));
2413 assert!(!set.contains(GlyphId::new(199)));
2414 assert!(set.contains(GlyphId::new(200)));
2415 assert!(set.contains(GlyphId::new(210)));
2416 assert!(!set.contains(GlyphId::new(211)));
2417
2418 let copy: IntSet<GlyphId> = set.iter().collect();
2419 assert_eq!(set, copy);
2420
2421 set.invert();
2422
2423 assert!(!set.contains(GlyphId::new(5)));
2424 assert!(set.contains(GlyphId::new(6)));
2425
2426 let mut it = set.iter();
2427 assert_eq!(it.next(), Some(GlyphId::new(0)));
2428 assert_eq!(it.next(), Some(GlyphId::new(1)));
2429 assert_eq!(it.next(), Some(GlyphId::new(2)));
2430 assert_eq!(it.next(), Some(GlyphId::new(3)));
2431 assert_eq!(it.next(), Some(GlyphId::new(4)));
2432 assert_eq!(it.next(), Some(GlyphId::new(6)));
2433 }
2434
2435 #[test]
2436 fn with_tag() {
2437 let mut set = IntSet::<Tag>::empty();
2438
2439 set.insert(Tag::new(b"GSUB"));
2440 set.insert(Tag::new(b"CFF "));
2441 set.insert(Tag::new(b"OS/2"));
2442
2443 assert!(set.contains(Tag::new(b"GSUB")));
2444 assert!(!set.contains(Tag::new(b"GSU ")));
2445 assert!(set.contains(Tag::new(b"CFF ")));
2446 assert!(set.contains(Tag::new(b"OS/2")));
2447
2448 let copy: IntSet<Tag> = set.iter().collect();
2449 assert_eq!(set, copy);
2450
2451 set.invert();
2452
2453 assert!(!set.contains(Tag::new(b"GSUB")));
2454 assert!(set.contains(Tag::new(b"GSU ")));
2455 assert!(!set.contains(Tag::new(b"CFF ")));
2456 assert!(!set.contains(Tag::new(b"OS/2")));
2457 }
2458
2459 #[test]
2460 fn intersects_range() {
2461 let mut set = IntSet::<u32>::empty();
2462 assert!(!set.intersects_range(0..=0));
2463 assert!(!set.intersects_range(0..=100));
2464 assert!(!set.intersects_range(0..=u32::MAX));
2465 assert!(!set.intersects_range(u32::MAX..=u32::MAX));
2466
2467 set.insert(1234);
2468 assert!(!set.intersects_range(0..=1233));
2469 assert!(!set.intersects_range(1235..=1240));
2470
2471 assert!(set.intersects_range(1234..=1234));
2472 assert!(set.intersects_range(1230..=1240));
2473 assert!(set.intersects_range(0..=1234));
2474 assert!(set.intersects_range(1234..=u32::MAX));
2475
2476 set.insert(0);
2477 assert!(set.intersects_range(0..=0));
2478 assert!(!set.intersects_range(1..=1));
2479 }
2480
2481 #[test]
2482 fn intersects_set() {
2483 macro_rules! assert_intersects {
2484 ($lhs:path, $rhs:path, $expected:expr) => {
2485 assert_eq!($lhs.intersects_set(&$rhs), $expected);
2486 assert_eq!($rhs.intersects_set(&$lhs), $expected);
2487 };
2488 }
2489
2490 assert!(!IntSet::<u32>::empty().intersects_set(&IntSet::<u32>::empty()));
2491
2492 let empty = IntSet::<u32>::empty();
2493 let a = IntSet::from([1u32, 5, 6, 7, 8, 12]);
2494 let b = IntSet::from([2u32, 13]);
2495 let c = IntSet::from([8u32, 14]);
2496 let mut d = IntSet::all();
2497 d.remove_range(0u32..=13);
2498 let mut e = IntSet::all();
2499 e.remove_range(0u32..=100);
2500
2501 assert_intersects!(a, b, false);
2502 assert_intersects!(a, c, true);
2503 assert_intersects!(a, d, false);
2504
2505 assert_intersects!(b, c, false);
2506 assert_intersects!(b, d, false);
2507 assert_intersects!(b, e, false);
2508
2509 assert_intersects!(c, d, true);
2510 assert_intersects!(c, e, false);
2511
2512 assert_intersects!(d, e, true);
2513
2514 assert_intersects!(a, empty, false);
2515 assert_intersects!(b, empty, false);
2516 assert_intersects!(c, empty, false);
2517 assert_intersects!(d, empty, false);
2518 assert_intersects!(e, empty, false);
2519 }
2520
2521 #[test]
2522 fn intersects_range_discontinuous() {
2523 let mut set = IntSet::<EvenInts>::empty();
2524 assert!(!set.intersects_range(EvenInts(0)..=EvenInts(0)));
2525 assert!(!set.intersects_range(EvenInts(0)..=EvenInts(100)));
2526 assert!(!set.intersects_range(EvenInts(0)..=EvenInts(u16::MAX - 1)));
2527 assert!(!set.intersects_range(EvenInts(u16::MAX - 1)..=EvenInts(u16::MAX - 1)));
2528
2529 set.insert(EvenInts(1234));
2530 assert!(!set.intersects_range(EvenInts(0)..=EvenInts(1232)));
2531 assert!(!set.intersects_range(EvenInts(1236)..=EvenInts(1240)));
2532
2533 assert!(set.intersects_range(EvenInts(1234)..=EvenInts(1234)));
2534 assert!(set.intersects_range(EvenInts(1230)..=EvenInts(1240)));
2535 assert!(set.intersects_range(EvenInts(0)..=EvenInts(1234)));
2536 assert!(set.intersects_range(EvenInts(1234)..=EvenInts(u16::MAX - 1)));
2537
2538 set.insert(EvenInts(0));
2539 assert!(set.intersects_range(EvenInts(0)..=EvenInts(0)));
2540 assert!(!set.intersects_range(EvenInts(2)..=EvenInts(2)));
2541 }
2542
2543 #[test]
2544 fn intersects_range_exclusive() {
2545 let mut set = IntSet::<u32>::all();
2546 assert!(set.intersects_range(0..=0));
2547 assert!(set.intersects_range(0..=100));
2548 assert!(set.intersects_range(0..=u32::MAX));
2549 assert!(set.intersects_range(u32::MAX..=u32::MAX));
2550
2551 set.remove(1234);
2552 assert!(set.intersects_range(0..=1233));
2553 assert!(set.intersects_range(1235..=1240));
2554
2555 assert!(!set.intersects_range(1234..=1234));
2556 assert!(set.intersects_range(1230..=1240));
2557 assert!(set.intersects_range(0..=1234));
2558 assert!(set.intersects_range(1234..=u32::MAX));
2559
2560 set.remove(0);
2561 assert!(!set.intersects_range(0..=0));
2562 assert!(set.intersects_range(1..=1));
2563
2564 set.remove_range(5000..=5200);
2565 assert!(!set.intersects_range(5000..=5200));
2566 assert!(!set.intersects_range(5100..=5150));
2567 assert!(set.intersects_range(4999..=5200));
2568 assert!(set.intersects_range(5000..=5201));
2569 }
2570
2571 #[test]
2572 fn intersects_range_exclusive_discontinuous() {
2573 let mut set = IntSet::<EvenInts>::all();
2574 assert!(set.intersects_range(EvenInts(0)..=EvenInts(0)));
2575 assert!(set.intersects_range(EvenInts(0)..=EvenInts(100)));
2576 assert!(set.intersects_range(EvenInts(0)..=EvenInts(u16::MAX - 1)));
2577 assert!(set.intersects_range(EvenInts(u16::MAX - 1)..=EvenInts(u16::MAX - 1)));
2578
2579 set.remove(EvenInts(1234));
2580 assert!(set.intersects_range(EvenInts(0)..=EvenInts(1232)));
2581 assert!(set.intersects_range(EvenInts(1236)..=EvenInts(1240)));
2582
2583 assert!(!set.intersects_range(EvenInts(1234)..=EvenInts(1234)));
2584 assert!(set.intersects_range(EvenInts(1230)..=EvenInts(1240)));
2585 assert!(set.intersects_range(EvenInts(0)..=EvenInts(1234)));
2586 assert!(set.intersects_range(EvenInts(1234)..=EvenInts(u16::MAX - 1)));
2587
2588 set.remove(EvenInts(0));
2589 assert!(!set.intersects_range(EvenInts(0)..=EvenInts(0)));
2590 assert!(set.intersects_range(EvenInts(2)..=EvenInts(2)));
2591
2592 set.remove_range(EvenInts(5000)..=EvenInts(5200));
2593 assert!(!set.intersects_range(EvenInts(5000)..=EvenInts(5200)));
2594 assert!(!set.intersects_range(EvenInts(5100)..=EvenInts(5150)));
2595 assert!(set.intersects_range(EvenInts(4998)..=EvenInts(5200)));
2596 assert!(set.intersects_range(EvenInts(5000)..=EvenInts(5202)));
2597 }
2598
2599 #[test]
2600 fn length() {
2601 let mut s = IntSet::<u32>::empty();
2602 assert_eq!(s.len(), 0);
2603 s.insert(5);
2604 s.insert(5);
2605 s.insert(100);
2606 assert_eq!(s.len(), 2);
2607
2608 s.invert();
2609 assert_eq!(s.len(), (u32::MAX - 1) as u64);
2610
2611 assert_eq!(IntSet::<u32>::all().len(), (u32::MAX as u64) + 1);
2612
2613 let mut s = IntSet::<TwoParts>::all();
2614 assert_eq!(s.len(), 13);
2615 s.remove(TwoParts::from_u32(InDomain(5)));
2616 assert_eq!(s.len(), 12);
2617
2618 for v in TwoParts::ordered_values() {
2619 s.remove(TwoParts::from_u32(InDomain(v)));
2620 }
2621 assert_eq!(s.len(), 0);
2622 }
2623
2624 #[test]
2625 fn ordering() {
2626 macro_rules! assert_ord {
2627 ($lhs:expr, $rhs:expr, $ord:path) => {
2628 assert_eq!(
2629 IntSet::from($lhs.clone()).cmp(&IntSet::from($rhs.clone())),
2630 $ord,
2631 "{:?}, {:?}",
2632 $lhs,
2633 $rhs
2634 )
2635 };
2636 }
2637
2638 const EMPTY: [u16; 0] = [];
2639 assert_ord!(EMPTY, EMPTY, Ordering::Equal);
2640 assert_ord!(EMPTY, [0], Ordering::Less);
2641 assert_ord!([0u16], [0], Ordering::Equal);
2642 assert_ord!([0u16, 1, 2], [1, 2, 3], Ordering::Less);
2643 assert_ord!([0u16, 1, 4], [1, 2, 3], Ordering::Less);
2644 assert_ord!([1u16, 2, 3], [0, 2, 4], Ordering::Greater);
2645 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();
2651 let mut all_but_0 = all.clone();
2652 all_but_0.remove(0);
2653 let mut all_but_5 = all.clone();
2654 all_but_5.remove(5);
2655
2656 assert_eq!(all.cmp(&all), Ordering::Equal);
2657 assert_eq!(all.cmp(&all_but_0), Ordering::Less);
2658 assert_eq!(all_but_0.cmp(&all), Ordering::Greater);
2659
2660 let mut a = IntSet::<u16>::all();
2661 a.remove_range(0..=5);
2662 a.remove_range(221..=1693);
2663 let mut b = IntSet::<u16>::all();
2664 b.remove_range(0..=1693);
2665 assert_eq!(a.cmp(&b), Ordering::Less);
2666
2667 let mut inc_all_but_0 = IntSet::<u16>::empty();
2669 inc_all_but_0.insert_range(1..=u16::MAX);
2670 let mut inc_all_but_5 = IntSet::<u16>::empty();
2671 inc_all_but_5.insert_range(0..=4);
2672 inc_all_but_5.insert_range(6..=u16::MAX);
2673
2674 assert_eq!(all.cmp(&all), Ordering::Equal);
2675 assert_eq!(all.cmp(&inc_all_but_0), Ordering::Less);
2676 assert_eq!(inc_all_but_0.cmp(&all), Ordering::Greater);
2677 assert_eq!(inc_all_but_5.cmp(&all_but_0), Ordering::Less);
2678
2679 let mut a = IntSet::<u16>::all();
2680 a.remove_range(8..=1160);
2681 let mut b = IntSet::<u16>::empty();
2682 b.insert_range(0..=259);
2683
2684 assert_eq!(a.cmp(&b), Ordering::Greater);
2685
2686 let mut a = IntSet::<u16>::all();
2687 a.remove_range(8..=u16::MAX);
2688 let mut b = IntSet::<u16>::empty();
2689 b.insert_range(0..=259);
2690
2691 assert_eq!(a.cmp(&b), Ordering::Less);
2692 }
2693
2694 #[cfg(feature = "serde")]
2695 fn roundtrip_json<T: Domain>(set: &IntSet<T>) -> Result<IntSet<T>, serde_json::Error> {
2696 let json = serde_json::to_vec(&set).unwrap();
2697 serde_json::from_slice(&json)
2698 }
2699
2700 #[test]
2701 #[cfg(feature = "serde")]
2702 fn simple_serde() {
2703 let mut set = IntSet::empty();
2704 set.insert(0u32);
2705 set.insert(u32::MAX);
2706 assert_eq!(roundtrip_json(&set).unwrap(), set);
2707 }
2708
2709 #[test]
2710 #[cfg(feature = "serde")]
2711 fn serde_non_contiguous() {
2712 fn ev(val: u16) -> EvenInts {
2713 assert!(val % 2 == 0);
2714 EvenInts(val)
2715 }
2716 let set = IntSet::<EvenInts>::from([ev(2), ev(166), ev(u16::MAX - 1)]);
2717 assert_eq!(roundtrip_json(&set).unwrap(), set);
2718 }
2719
2720 #[test]
2721 #[cfg(feature = "serde")]
2722 #[should_panic(expected = "out of range for domain")]
2723 fn serde_non_contiguous_out_of_domain() {
2724 let set = IntSet::from([1u16, 2, 3, 4, 5, 6, 7]);
2725 let bytes = serde_json::to_vec(&set).unwrap();
2726 serde_json::from_slice::<IntSet<EvenInts>>(&bytes).unwrap();
2727 }
2728
2729 #[test]
2730 #[cfg(feature = "serde")]
2731 fn non_contiguous_inverted() {
2732 let all = IntSet::<u16>::all();
2733 let bytes = serde_json::to_vec(&all).unwrap();
2734 let readback: IntSet<EvenInts> = serde_json::from_slice(&bytes).unwrap();
2735 let mut iter = readback.iter().map(|v| v.0);
2736 let mut values = (&mut iter).take(5).collect::<Vec<_>>();
2737 values.extend(iter.rev().take(5));
2738
2739 assert_eq!(values, [0, 2, 4, 6, 8, 65534, 65532, 65530, 65528, 65526])
2740 }
2741
2742 #[test]
2743 #[cfg(feature = "serde")]
2744 fn serde_inverted() {
2745 let mut set = IntSet::all();
2746 set.remove_range(0u16..=420);
2747 let bytes = serde_json::to_string(&set).unwrap();
2748 assert!(bytes.len() < 5000, "sanity check serialization");
2749 assert_eq!(roundtrip_json(&set).unwrap(), set)
2750 }
2751
2752 #[test]
2753 #[cfg(feature = "serde")]
2754 fn serde_inverted_out_of_domain() {
2755 let mut set = IntSet::all();
2756 set.remove_range(0u16..=250);
2757 let bytes = serde_json::to_string(&set).unwrap();
2758 let readback: IntSet<u8> = serde_json::from_str(&bytes).unwrap();
2759 assert_eq!(readback.len(), 5);
2760 assert_eq!(
2761 readback.iter().collect::<Vec<_>>(),
2762 [251, 252, 253, 254, 255]
2763 );
2764 }
2765
2766 #[test]
2767 #[cfg(feature = "serde")]
2768 #[should_panic(expected = "out of range for domain")]
2769 fn serde_out_of_domain() {
2770 let set = IntSet::from([u32::MAX]);
2771 let json = serde_json::to_vec(&set).unwrap();
2772 serde_json::from_slice::<IntSet<GlyphId16>>(&json).unwrap();
2773 }
2774}