1use crate::{AnyRange, AsRange, IntoRange, RangePartialOrd, generic::RangeMap};
2use range_traits::{Bounded, Measure, PartialEnum};
3use raw_btree::{Item, Storage};
4use std::{
5 cmp::Ordering,
6 fmt,
7 hash::{Hash, Hasher},
8};
9
10pub struct RangeSet<T, C: Storage<Item<AnyRange<T>, ()>>> {
14 map: RangeMap<T, (), C>,
15}
16
17impl<T: Clone, C: Storage<Item<AnyRange<T>, ()>>> Clone for RangeSet<T, C> {
18 fn clone(&self) -> Self {
19 RangeSet {
20 map: self.map.clone(),
21 }
22 }
23}
24
25impl<T, C: Storage<Item<AnyRange<T>, ()>>> RangeSet<T, C> {
26 pub fn new() -> RangeSet<T, C> {
27 RangeSet {
28 map: RangeMap::new(),
29 }
30 }
31}
32
33impl<T, C: Storage<Item<AnyRange<T>, ()>>> Default for RangeSet<T, C> {
34 fn default() -> Self {
35 Self::new()
36 }
37}
38
39impl<T, C: Storage<Item<AnyRange<T>, ()>>> RangeSet<T, C> {
40 pub fn range_count(&self) -> usize {
41 self.map.range_count()
42 }
43
44 pub fn len(&self) -> T::Len
45 where
46 T: Measure + PartialEnum + Bounded,
47 {
48 self.map.len()
49 }
50
51 pub fn bounded_len(&self) -> Option<T::Len>
52 where
53 T: Measure + PartialEnum,
54 {
55 self.map.bounded_len()
56 }
57
58 pub fn is_empty(&self) -> bool
59 where
60 T: Measure + PartialEnum,
61 {
62 self.map.is_empty()
63 }
64
65 pub fn intersects<R: AsRange<Item = T>>(&self, values: R) -> bool
66 where
67 T: Clone + PartialEnum + Measure,
68 {
69 self.map.intersects(values)
70 }
71
72 pub fn contains(&self, value: T) -> bool
73 where
74 T: Clone + PartialEnum + RangePartialOrd + Measure,
75 {
76 self.map.contains_key(value)
77 }
78
79 pub fn iter(&self) -> Iter<'_, T, C> {
80 Iter {
81 inner: self.map.iter(),
82 }
83 }
84
85 pub fn gaps(&self) -> Gaps<'_, T, C> {
87 self.map.gaps()
88 }
89}
90
91impl<T: fmt::Debug, C: Storage<Item<AnyRange<T>, ()>>> fmt::Debug for RangeSet<T, C> {
92 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
93 write!(f, "{{")?;
94
95 for range in self {
96 write!(f, "{:?}", range)?
97 }
98
99 write!(f, "}}")
100 }
101}
102
103impl<'a, T, C: Storage<Item<AnyRange<T>, ()>>> IntoIterator for &'a RangeSet<T, C> {
104 type Item = &'a AnyRange<T>;
105 type IntoIter = Iter<'a, T, C>;
106
107 fn into_iter(self) -> Self::IntoIter {
108 self.iter()
109 }
110}
111
112impl<T, C: Storage<Item<AnyRange<T>, ()>>> RangeSet<T, C> {
113 pub fn insert<R: IntoRange<Item = T>>(&mut self, key: R)
114 where
115 T: Clone + PartialEnum + Measure,
116 {
117 self.map.insert(key, ())
118 }
119
120 pub fn remove<R: AsRange<Item = T>>(&mut self, key: R)
121 where
122 T: Clone + PartialEnum + Measure,
123 {
124 self.map.remove(key)
125 }
126
127 pub fn complement(&self) -> Self
128 where
129 T: Clone + Measure + PartialEnum,
130 {
131 self.gaps().map(AnyRange::cloned).collect()
132 }
133}
134
135impl<K, C, D> PartialEq<RangeSet<K, D>> for RangeSet<K, C>
136where
137 K: Measure + PartialOrd + PartialEnum,
138 C: Storage<Item<AnyRange<K>, ()>>,
139 D: Storage<Item<AnyRange<K>, ()>>,
140{
141 fn eq(&self, other: &RangeSet<K, D>) -> bool {
142 self.map == other.map
143 }
144}
145
146impl<K, C: Storage<Item<AnyRange<K>, ()>>> Eq for RangeSet<K, C> where K: Measure + PartialEnum + Ord
147{}
148
149impl<K, C, D> PartialOrd<RangeSet<K, D>> for RangeSet<K, C>
150where
151 K: Measure + PartialOrd + PartialEnum,
152 C: Storage<Item<AnyRange<K>, ()>>,
153 D: Storage<Item<AnyRange<K>, ()>>,
154{
155 fn partial_cmp(&self, other: &RangeSet<K, D>) -> Option<Ordering> {
156 self.map.partial_cmp(&other.map)
157 }
158}
159
160impl<K, C: Storage<Item<AnyRange<K>, ()>>> Ord for RangeSet<K, C>
161where
162 K: Measure + PartialEnum + Ord,
163{
164 fn cmp(&self, other: &Self) -> Ordering {
165 self.map.cmp(&other.map)
166 }
167}
168
169impl<K, C: Storage<Item<AnyRange<K>, ()>>> Hash for RangeSet<K, C>
170where
171 K: Hash + PartialEnum,
172{
173 fn hash<H: Hasher>(&self, h: &mut H) {
174 self.map.hash(h)
175 }
176}
177
178impl<T, C: Storage<Item<AnyRange<T>, ()>>> IntoIterator for RangeSet<T, C> {
179 type Item = AnyRange<T>;
180 type IntoIter = IntoIter<T, C>;
181
182 fn into_iter(self) -> Self::IntoIter {
183 IntoIter {
184 inner: self.map.into_iter(),
185 }
186 }
187}
188
189pub struct Iter<'a, T, C: Storage<Item<AnyRange<T>, ()>>> {
190 inner: crate::generic::map::Iter<'a, T, (), C>,
191}
192
193impl<'a, T, C: Storage<Item<AnyRange<T>, ()>>> Iterator for Iter<'a, T, C> {
194 type Item = &'a AnyRange<T>;
195
196 fn next(&mut self) -> Option<Self::Item> {
197 match self.inner.next() {
198 Some((range, ())) => Some(range),
199 None => None,
200 }
201 }
202}
203
204pub struct IntoIter<T, C: Storage<Item<AnyRange<T>, ()>>> {
205 inner: crate::generic::map::IntoIter<T, (), C>,
206}
207
208impl<T, C: Storage<Item<AnyRange<T>, ()>>> Iterator for IntoIter<T, C> {
209 type Item = AnyRange<T>;
210
211 fn next(&mut self) -> Option<Self::Item> {
212 self.inner.next().map(|(range, _)| range)
213 }
214}
215
216pub type Gaps<'a, T, C> = crate::generic::map::Gaps<'a, T, (), C>;
218
219impl<R: IntoRange, C: Storage<Item<AnyRange<R::Item>, ()>>> std::iter::Extend<R>
220 for RangeSet<R::Item, C>
221where
222 R::Item: Clone + Measure + PartialOrd,
223{
224 fn extend<I: IntoIterator<Item = R>>(&mut self, iter: I) {
225 for range in iter {
226 self.insert(range)
227 }
228 }
229}
230
231impl<R: IntoRange, C: Storage<Item<AnyRange<R::Item>, ()>>> FromIterator<R> for RangeSet<R::Item, C>
232where
233 R::Item: Clone + Measure + PartialOrd,
234{
235 fn from_iter<I: IntoIterator<Item = R>>(iter: I) -> Self {
236 let mut result = Self::default();
237 result.extend(iter);
238 result
239 }
240}
241
242#[cfg(test)]
243mod test {
244 use crate::{AnyRange, RangeSet};
245
246 #[test]
247 fn gaps1() {
248 let mut a: RangeSet<u8> = RangeSet::new();
249 let mut b: RangeSet<u8> = RangeSet::new();
250
251 a.insert(10..20);
252
253 b.insert(0..10);
254 b.insert(20..);
255
256 assert_eq!(a.complement(), b)
257 }
258
259 #[test]
260 fn gaps2() {
261 let mut a: RangeSet<u8> = RangeSet::new();
262 let mut b: RangeSet<u8> = RangeSet::new();
263
264 a.insert(0..10);
265 b.insert(10..);
266
267 assert_eq!(a.complement(), b)
268 }
269
270 #[test]
271 fn gaps3() {
272 let mut a: RangeSet<u8> = RangeSet::new();
273 let mut b: RangeSet<u8> = RangeSet::new();
274
275 a.insert(20..);
276 b.insert(0..=19);
277
278 assert_eq!(a.complement(), b)
279 }
280
281 #[test]
282 fn gaps4() {
283 let mut a: RangeSet<u8> = RangeSet::new();
284
285 a.insert(10..20);
286
287 let mut gaps = a.gaps().map(AnyRange::cloned);
288 assert_eq!(gaps.next(), Some(AnyRange::from(..10u8)));
289 assert_eq!(gaps.next(), Some(AnyRange::from(20u8..)));
290 assert_eq!(gaps.next(), None)
291 }
292
293 #[test]
294 fn gaps5() {
295 let mut a: RangeSet<u8> = RangeSet::new();
296
297 a.insert(..10);
298 a.insert(20..);
299
300 let mut gaps = a.gaps().map(AnyRange::cloned);
301 assert_eq!(gaps.next(), Some(AnyRange::from(10..20)));
302 assert_eq!(gaps.next(), None)
303 }
304
305 #[test]
306 fn gaps6() {
307 let mut a: RangeSet<u8> = RangeSet::new();
308
309 a.insert(10..20);
310
311 assert_eq!(a.complement().complement(), a)
312 }
313}