closed_interval_set/
overloads.rs

1use crate::ClosedRange;
2use crate::Endpoint;
3use crate::NormalizedRangeIter;
4use crate::RangeVec;
5
6use alloc::boxed::Box;
7
8impl<T: Endpoint> core::ops::BitAnd<&RangeVec<T>> for &RangeVec<T> {
9    type Output = RangeVec<T>;
10
11    fn bitand(self, rhs: &RangeVec<T>) -> RangeVec<T> {
12        crate::intersect_vec(self, rhs)
13    }
14}
15
16impl<T: Endpoint> core::ops::BitAndAssign<&RangeVec<T>> for RangeVec<T> {
17    fn bitand_assign(&mut self, rhs: &RangeVec<T>) {
18        let mut tmp = RangeVec::new();
19        core::mem::swap(&mut tmp, self);
20        *self = &tmp & rhs;
21    }
22}
23
24impl<T: Endpoint> core::ops::BitAnd<RangeVec<T>> for &RangeVec<T> {
25    type Output = RangeVec<T>;
26
27    fn bitand(self, rhs: RangeVec<T>) -> RangeVec<T> {
28        self & &rhs
29    }
30}
31
32impl<T: Endpoint> core::ops::BitAndAssign<RangeVec<T>> for RangeVec<T> {
33    fn bitand_assign(&mut self, rhs: RangeVec<T>) {
34        *self &= &rhs;
35    }
36}
37
38impl<T: Endpoint> core::ops::BitOr<RangeVec<T>> for RangeVec<T> {
39    type Output = RangeVec<T>;
40
41    fn bitor(mut self, mut rhs: RangeVec<T>) -> RangeVec<T> {
42        if self.len() < rhs.len() {
43            core::mem::swap(&mut self, &mut rhs);
44        }
45
46        self.into_union(rhs)
47    }
48}
49
50impl<T: Endpoint> core::ops::BitOrAssign<RangeVec<T>> for RangeVec<T> {
51    fn bitor_assign(&mut self, rhs: RangeVec<T>) {
52        let mut tmp = RangeVec::new();
53        core::mem::swap(&mut tmp, self);
54        *self = tmp | rhs;
55    }
56}
57
58impl<T: Endpoint> core::ops::BitOr<&RangeVec<T>> for RangeVec<T> {
59    type Output = RangeVec<T>;
60
61    fn bitor(self, rhs: &RangeVec<T>) -> RangeVec<T> {
62        crate::union_vec(self, rhs)
63    }
64}
65
66impl<T: Endpoint> core::ops::BitOrAssign<&RangeVec<T>> for RangeVec<T> {
67    fn bitor_assign(&mut self, rhs: &RangeVec<T>) {
68        let mut tmp = RangeVec::new();
69        core::mem::swap(&mut tmp, self);
70        *self = tmp | rhs;
71    }
72}
73
74impl<T: Endpoint> core::ops::BitOr<&RangeVec<T>> for &RangeVec<T> {
75    type Output = RangeVec<T>;
76
77    fn bitor(self, rhs: &RangeVec<T>) -> RangeVec<T> {
78        self.union(rhs)
79    }
80}
81
82impl<T: Endpoint> core::ops::Not for &RangeVec<T> {
83    type Output = RangeVec<T>;
84
85    fn not(self) -> RangeVec<T> {
86        self.complement()
87    }
88}
89
90impl<T: Endpoint> core::ops::Not for RangeVec<T> {
91    type Output = RangeVec<T>;
92
93    fn not(self) -> RangeVec<T> {
94        crate::complement_vec(self)
95    }
96}
97
98impl<
99        T: 'static + Endpoint,
100        X: 'static + ClosedRange<EndT = T>,
101        Y: 'static + ClosedRange<EndT = T>,
102    > core::ops::BitAnd<Box<dyn NormalizedRangeIter<Item = Y>>>
103    for Box<dyn NormalizedRangeIter<Item = X>>
104{
105    type Output = Box<dyn NormalizedRangeIter<Item = (T, T)>>;
106
107    fn bitand(self, rhs: Box<dyn NormalizedRangeIter<Item = Y>>) -> Self::Output {
108        Box::new(self.intersect(rhs))
109    }
110}
111
112impl<
113        T: 'static + Endpoint,
114        X: 'static + ClosedRange<EndT = T>,
115        Y: 'static + ClosedRange<EndT = T>,
116    > core::ops::BitOr<Box<dyn NormalizedRangeIter<Item = Y>>>
117    for Box<dyn NormalizedRangeIter<Item = X>>
118{
119    type Output = Box<dyn NormalizedRangeIter<Item = (T, T)>>;
120
121    fn bitor(self, rhs: Box<dyn NormalizedRangeIter<Item = Y>>) -> Self::Output {
122        Box::new(self.union(rhs))
123    }
124}
125
126impl<T: Endpoint + 'static, X: 'static + ClosedRange<EndT = T>> core::ops::Not
127    for Box<dyn NormalizedRangeIter<Item = X>>
128{
129    type Output = Box<dyn NormalizedRangeIter<Item = (T, T)>>;
130
131    fn not(self) -> Self::Output {
132        Box::new(self.complement())
133    }
134}
135
136#[cfg(test)]
137#[cfg_attr(coverage_nightly, coverage(off))]
138mod test {
139    use super::*;
140
141    #[test]
142    fn smoke_test_ref_vec_ops() {
143        let mut x = RangeVec::from_vec(vec![(1u8, 4u8), (10u8, 12u8)]);
144        let y = RangeVec::from_vec(vec![(2u8, 6u8), (11u8, 11u8)]);
145
146        assert_eq!(&x & &y, RangeVec::from_vec(vec![(2u8, 4u8), (11u8, 11u8)]));
147        assert_eq!(
148            &x & y.clone(),
149            RangeVec::from_vec(vec![(2u8, 4u8), (11u8, 11u8)])
150        );
151        assert_eq!(&x | &y, RangeVec::from_vec(vec![(1u8, 6u8), (10u8, 12u8)]));
152        assert_eq!(
153            !&x,
154            RangeVec::from_vec(vec![(0u8, 0u8), (5u8, 9u8), (13u8, 255u8)])
155        );
156
157        x &= y;
158        assert_eq!(x, RangeVec::from_vec(vec![(2u8, 4u8), (11u8, 11u8)]));
159    }
160
161    #[test]
162    fn smoke_test_vec_ops() {
163        let mut x = RangeVec::from_vec(vec![(1u8, 4u8), (10u8, 12u8)]);
164        let y = RangeVec::from_vec(vec![(2u8, 6u8), (11u8, 11u8), (255u8, 255u8)]);
165
166        assert_eq!(
167            x.clone() | y.clone(),
168            RangeVec::from_vec(vec![(1u8, 6u8), (10u8, 12u8), (255u8, 255u8)])
169        );
170        assert_eq!(
171            x.clone() | &y,
172            RangeVec::from_vec(vec![(1u8, 6u8), (10u8, 12u8), (255u8, 255u8)])
173        );
174        assert_eq!(
175            !x.clone(),
176            RangeVec::from_vec(vec![(0u8, 0u8), (5u8, 9u8), (13u8, 255u8)])
177        );
178
179        x |= &y;
180        assert_eq!(
181            x,
182            RangeVec::from_vec(vec![(1u8, 6u8), (10u8, 12u8), (255u8, 255u8)])
183        );
184
185        x &= !&y;
186        assert_eq!(
187            x,
188            RangeVec::from_vec(vec![(1u8, 1u8), (10u8, 10u8), (12u8, 12u8)])
189        );
190
191        x |= y.clone();
192        assert_eq!(
193            x,
194            RangeVec::from_vec(vec![(1u8, 6u8), (10u8, 12u8), (255u8, 255u8)])
195        );
196
197        x &= !y;
198        assert_eq!(
199            x,
200            RangeVec::from_vec(vec![(1u8, 1u8), (10u8, 10u8), (12u8, 12u8)])
201        );
202    }
203
204    #[test]
205    fn smoke_test_iterator_ops() {
206        let x = RangeVec::from_vec(vec![(1u8, 4u8), (10u8, 12u8)]);
207        let y = RangeVec::from_vec(vec![(2u8, 6u8), (11u8, 11u8)]);
208
209        {
210            let mut x: Box<dyn NormalizedRangeIter<Item = _>> = Box::new(x.clone().into_iter());
211            let y: Box<dyn NormalizedRangeIter<Item = _>> = Box::new(y.clone().into_iter());
212
213            x = x & y;
214            assert_eq!(
215                RangeVec::from_iter(x),
216                RangeVec::from_vec(vec![(2u8, 4u8), (11u8, 11u8)])
217            );
218        }
219
220        {
221            let mut x: Box<dyn NormalizedRangeIter<Item = _>> = Box::new(x.clone().into_iter());
222            let y: Box<dyn NormalizedRangeIter<Item = _>> = Box::new(y.clone().into_iter());
223
224            x = x | y;
225            assert_eq!(
226                RangeVec::from_iter(x),
227                RangeVec::from_vec(vec![(1u8, 6u8), (10u8, 12u8)])
228            );
229        }
230
231        {
232            let mut x: Box<dyn NormalizedRangeIter<Item = _>> = Box::new(x.into_iter());
233            x = !x;
234            assert_eq!(
235                RangeVec::from_iter(x),
236                RangeVec::from_vec(vec![(0u8, 0u8), (5u8, 9u8), (13u8, 255u8)])
237            );
238        }
239    }
240}