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}