Skip to main content

btree_range_map/generic/
set.rs

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
10/// Range set.
11///
12/// This is based on a range map, where the values are `()`.
13pub 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	/// Returns an iterator over the gaps (missing values) of the set.
86	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
216/// Iterator over the gaps (unbound keys) of a `RangeSet`.
217pub 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}