closed_interval_set/
range_vec.rs1use alloc::vec::Vec;
6use core::iter::DoubleEndedIterator;
7use core::iter::ExactSizeIterator;
8use smallvec::SmallVec;
9
10use crate::iterator_wrapper::NormalizedRangeIterWrapper;
11use crate::Backing;
12use crate::Endpoint;
13use crate::NormalizedRangeIter;
14
15#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd, Hash)]
23#[repr(transparent)]
24pub struct RangeVec<T: Endpoint> {
25 inner: Backing<T>,
26}
27
28impl<T: Endpoint> RangeVec<T> {
29 #[inline(always)]
31 pub fn new() -> Self {
32 Self {
33 inner: SmallVec::new(),
34 }
35 }
36
37 #[inline(always)]
48 pub unsafe fn new_unchecked(inner: Backing<T>) -> Self {
49 #[cfg(any(feature = "internal_checks", debug_assertions))]
50 assert!(crate::is_normalized(&inner[..]));
51 Self { inner }
52 }
53
54 #[inline(always)]
59 pub fn from_vec(inner: Vec<(T, T)>) -> Self {
60 crate::normalize_vec(inner)
61 }
62
63 #[inline(always)]
68 pub fn from_smallvec<const N: usize>(inner: SmallVec<[(T, T); N]>) -> Self {
69 crate::normalize_vec(inner)
70 }
71
72 #[inline(always)]
74 pub fn inner(&self) -> &[(T, T)] {
75 &self.inner
76 }
77
78 #[inline(always)]
82 pub fn into_inner(self) -> Backing<T> {
83 self.inner
84 }
85
86 #[inline(always)]
88 pub fn into_vec(self) -> Vec<(T, T)> {
89 self.inner.into_vec()
90 }
91
92 #[inline(always)]
94 pub fn iter(
95 &self,
96 ) -> impl '_ + NormalizedRangeIter<Item = (T, T)> + DoubleEndedIterator + ExactSizeIterator
97 {
98 let iter = self.inner.iter().copied();
99 unsafe { NormalizedRangeIterWrapper::new_unchecked(iter) }
100 }
101
102 pub fn eqv(&self, other: &RangeVec<T>) -> bool {
108 self.iter().eqv(other.iter())
109 }
110}
111
112impl<T: Endpoint> Default for RangeVec<T> {
113 fn default() -> Self {
114 RangeVec::new()
115 }
116}
117
118impl<T: Endpoint> IntoIterator for RangeVec<T> {
119 type Item = (T, T);
120 type IntoIter = NormalizedRangeIterWrapper<<Backing<T> as IntoIterator>::IntoIter>;
121
122 #[inline(always)]
123 fn into_iter(self) -> Self::IntoIter {
124 let iter = self.inner.into_iter();
125 unsafe { NormalizedRangeIterWrapper::new_unchecked(iter) }
126 }
127}
128
129impl<'a, T: Endpoint> IntoIterator for &'a RangeVec<T> {
130 type Item = (T, T);
131 type IntoIter =
132 NormalizedRangeIterWrapper<core::iter::Copied<<&'a Backing<T> as IntoIterator>::IntoIter>>;
133
134 #[inline(always)]
135 fn into_iter(self) -> Self::IntoIter {
136 let iter = self.inner.iter().copied();
137 unsafe { NormalizedRangeIterWrapper::new_unchecked(iter) }
138 }
139}
140
141impl<T: Endpoint> core::ops::Deref for RangeVec<T> {
142 type Target = [(T, T)];
143
144 #[inline(always)]
145 fn deref(&self) -> &[(T, T)] {
146 <RangeVec<T>>::inner(self)
147 }
148}
149
150#[cfg_attr(coverage_nightly, coverage(off))]
151#[test]
152fn test_smoke() {
153 use smallvec::smallvec;
154
155 assert_eq!(RangeVec::<u8>::new(), Default::default());
156 assert_eq!(RangeVec::<u8>::new(), unsafe {
157 RangeVec::new_unchecked(smallvec![])
158 });
159 assert!(RangeVec::<u8>::new().is_empty());
160
161 let ranges = unsafe { RangeVec::new_unchecked(smallvec![(2u8, 4u8), (10u8, 20u8)]) };
162
163 assert_eq!(ranges[0], (2u8, 4u8));
164
165 assert_eq!(&ranges, &ranges.iter().collect_range_vec());
166
167 assert!(ranges.eqv(&ranges.iter().collect_range_vec()));
168 assert!(!ranges.eqv(&Default::default()));
169 assert!(!ranges.eqv(&unsafe { RangeVec::new_unchecked(smallvec![(2u8, 4u8), (11u8, 20u8)]) }));
170 assert!(!ranges.eqv(&unsafe {
171 RangeVec::new_unchecked(smallvec![(2u8, 4u8), (10u8, 20u8), (30u8, 30u8)])
172 }));
173 assert!(!ranges.eqv(&unsafe { RangeVec::new_unchecked(smallvec![(2u8, 4u8)]) }));
174
175 assert_eq!(ranges.inner(), &ranges.iter().collect::<Vec<_>>());
176
177 assert_eq!(ranges.inner(), &(&ranges).into_iter().collect::<Vec<_>>());
178 assert_eq!(
179 ranges.clone().into_vec(),
180 ranges.into_iter().collect::<Vec<_>>()
181 );
182}