1use std::{
2 collections::{BTreeMap, btree_map},
3 iter::{Extend, FromIterator},
4};
5
6#[derive(Debug, Clone)]
8pub struct RangeMap<K, V> {
9 map: BTreeMap<(K, K), V>,
10}
11impl<K, V> Default for RangeMap<K, V>
12where
13 K: Ord,
14{
15 fn default() -> Self {
16 Self {
17 map: Default::default(),
18 }
19 }
20}
21impl<K, V> RangeMap<K, V> {
22 pub fn new() -> Self
24 where
25 K: Ord,
26 {
27 Default::default()
28 }
29 pub fn clear(&mut self)
31 where
32 K: Ord,
33 {
34 self.map.clear();
35 }
36 pub fn contains_key(&self, key: &K) -> bool
38 where
39 K: Clone + Ord,
40 {
41 self.get(key).is_some()
42 }
43 pub fn get(&self, key: &K) -> Option<&V>
45 where
46 K: Clone + Ord,
47 {
48 self.get_range_value(key).map(|(_, v)| v)
49 }
50 pub fn get_range_value(&self, key: &K) -> Option<(&(K, K), &V)>
52 where
53 K: Clone + Ord,
54 {
55 self.get_right_if(key, |r, _| key == &r.0)
56 .or_else(|| self.get_left_if(key, |r, _| key < &r.1))
57 }
58 pub fn insert(&mut self, range: (K, K), value: V)
60 where
61 K: Clone + Ord,
62 V: Clone + Eq,
63 {
64 self.insert_with(range, value, |_, _| {});
65 }
66 pub fn insert_with<F>(&mut self, range: (K, K), value: V, mut f: F)
68 where
69 K: Clone + Ord,
70 V: Clone + Eq,
71 F: FnMut((K, K), V),
72 {
73 if range.0 >= range.1 {
74 return;
75 }
76 let mut ins_range = range.clone();
77 if let Some((r, v)) = self.pop_left_if(&range.0, |r, v| {
78 range.0 < r.1 || range.0 == r.1 && &value == v
79 }) {
80 if range.1 < r.1 {
81 if value == v {
82 ins_range = r;
83 } else {
84 self.map.insert((r.0, range.0.clone()), v.clone());
85 self.map.insert((range.1.clone(), r.1), v.clone());
86 }
87 f(range.clone(), v);
88 } else {
89 if value == v {
90 ins_range.0 = r.0;
91 } else {
92 self.map.insert((r.0, range.0.clone()), v.clone());
93 }
94 if range.0 < r.1 {
95 f((range.0.clone(), r.1), v);
96 }
97 }
98 }
99 let mut wait = None;
100 if let Some((r, _)) = self.pop_right_if(&range.1, |r, v| range.1 == r.0 && &value == v) {
101 ins_range.1 = r.1;
102 } else if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
103 if value == v {
104 ins_range.1 = r.1;
105 } else {
106 self.map.insert((range.1.clone(), r.1), v.clone());
107 }
108 wait = Some(((r.0, range.1.clone()), v));
109 }
110 let mut f = self.drain_with_inner(range, f);
111 if let Some((r, v)) = wait {
112 f(r, v);
113 }
114 self.map.insert(ins_range, value);
115 }
116 pub fn remove(&mut self, range: (K, K))
118 where
119 K: Clone + Ord,
120 V: Clone,
121 {
122 self.drain_with(range, |_, _| {});
123 }
124 pub fn get_left_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
126 where
127 K: Clone + Ord,
128 F: FnMut(&(K, K), &V) -> bool,
129 {
130 self.map
131 .range(..(key.clone(), key.clone()))
132 .next_back()
133 .filter(|(r, v)| pred(r, v))
134 }
135 pub fn get_right_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
137 where
138 K: Clone + Ord,
139 F: FnMut(&(K, K), &V) -> bool,
140 {
141 self.map
142 .range((key.clone(), key.clone())..)
143 .next()
144 .filter(|(r, v)| pred(r, v))
145 }
146 pub fn pop_left_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
148 where
149 K: Clone + Ord,
150 F: FnMut(&(K, K), &V) -> bool,
151 {
152 match self.get_left_if(key, pred) {
153 Some((r, _)) => {
154 let r = r.clone();
155 let v = self.map.remove(&r).unwrap();
156 Some((r, v))
157 }
158 None => None,
159 }
160 }
161 pub fn pop_right_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
163 where
164 K: Clone + Ord,
165 F: FnMut(&(K, K), &V) -> bool,
166 {
167 match self.get_right_if(key, pred) {
168 Some((r, _)) => {
169 let r = r.clone();
170 let v = self.map.remove(&r).unwrap();
171 Some((r, v))
172 }
173 None => None,
174 }
175 }
176 fn drain_with_inner<F>(&mut self, range: (K, K), mut f: F) -> F
178 where
179 K: Clone + Ord,
180 F: FnMut((K, K), V),
181 {
182 while let Some((r, _)) = self
183 .map
184 .range((range.0.clone(), range.0.clone())..(range.1.clone(), range.1.clone()))
185 .next()
186 {
187 let r = r.clone();
188 let v = self.map.remove(&r).unwrap();
189 f(r, v);
190 }
191 f
192 }
193 pub fn drain_with<F>(&mut self, range: (K, K), mut f: F)
195 where
196 K: Clone + Ord,
197 V: Clone,
198 F: FnMut((K, K), V),
199 {
200 if range.0 >= range.1 {
201 return;
202 }
203 if let Some((r, v)) = self.pop_left_if(&range.0, |r, _| range.0 < r.1) {
204 if range.1 < r.1 {
205 f(range.clone(), v.clone());
206 self.map.insert((range.1.clone(), r.1), v.clone());
207 } else {
208 f((range.0.clone(), r.1), v.clone());
209 }
210 self.map.insert((r.0, range.0.clone()), v);
211 }
212 let mut wait = None;
213 if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
214 wait = Some(((r.0, range.1.clone()), v.clone()));
215 self.map.insert((range.1.clone(), r.1), v);
216 }
217 let mut f = self.drain_with_inner(range, f);
218 if let Some((r, v)) = wait {
219 f(r, v);
220 }
221 }
222 pub fn iter(&self) -> btree_map::Iter<'_, (K, K), V> {
223 self.map.iter()
224 }
225 pub fn iter_mut(&mut self) -> btree_map::IterMut<'_, (K, K), V> {
226 self.map.iter_mut()
227 }
228 pub fn keys(&self) -> btree_map::Keys<'_, (K, K), V> {
229 self.map.keys()
230 }
231 pub fn values(&self) -> btree_map::Values<'_, (K, K), V> {
232 self.map.values()
233 }
234 pub fn values_mut(&mut self) -> btree_map::ValuesMut<'_, (K, K), V> {
235 self.map.values_mut()
236 }
237}
238impl<K, V> Extend<((K, K), V)> for RangeMap<K, V>
239where
240 K: Clone + Ord,
241 V: Clone + Eq,
242{
243 fn extend<T: IntoIterator<Item = ((K, K), V)>>(&mut self, iter: T) {
244 for (range, value) in iter {
245 self.insert(range, value);
246 }
247 }
248}
249impl<K, V> FromIterator<((K, K), V)> for RangeMap<K, V>
250where
251 K: Clone + Ord,
252 V: Clone + Eq,
253{
254 fn from_iter<T: IntoIterator<Item = ((K, K), V)>>(iter: T) -> Self {
255 let mut map = Self::new();
256 map.extend(iter);
257 map
258 }
259}
260
261#[derive(Debug, Clone)]
263pub struct RangeSet<T> {
264 map: RangeMap<T, ()>,
265}
266impl<T> Default for RangeSet<T>
267where
268 T: Ord,
269{
270 fn default() -> Self {
271 Self {
272 map: Default::default(),
273 }
274 }
275}
276impl<T> RangeSet<T> {
277 pub fn new() -> Self
279 where
280 T: Ord,
281 {
282 Default::default()
283 }
284 pub fn clear(&mut self)
286 where
287 T: Ord,
288 {
289 self.map.clear();
290 }
291 pub fn contains(&self, key: &T) -> bool
293 where
294 T: Clone + Ord,
295 {
296 self.get_range(key).is_some()
297 }
298 pub fn get_range(&self, key: &T) -> Option<&(T, T)>
300 where
301 T: Clone + Ord,
302 {
303 self.map.get_range_value(key).map(|(r, _)| r)
304 }
305 pub fn insert(&mut self, range: (T, T))
307 where
308 T: Clone + Ord,
309 {
310 self.insert_with(range, |_| {});
311 }
312 pub fn insert_with<F>(&mut self, range: (T, T), mut f: F)
314 where
315 T: Clone + Ord,
316 F: FnMut((T, T)),
317 {
318 self.map.insert_with(range, (), |r, _| f(r))
319 }
320 pub fn remove(&mut self, range: (T, T))
322 where
323 T: Clone + Ord,
324 {
325 self.drain_with(range, |_| {});
326 }
327 pub fn get_left_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
329 where
330 T: Clone + Ord,
331 F: FnMut(&(T, T)) -> bool,
332 {
333 self.map.get_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
334 }
335 pub fn get_right_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
337 where
338 T: Clone + Ord,
339 F: FnMut(&(T, T)) -> bool,
340 {
341 self.map.get_right_if(key, |r, _| pred(r)).map(|(r, _)| r)
342 }
343 pub fn pop_left_if<F>(&mut self, key: &T, mut pred: F) -> Option<(T, T)>
345 where
346 T: Clone + Ord,
347 F: FnMut(&(T, T)) -> bool,
348 {
349 self.map.pop_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
350 }
351 pub fn pop_right_if<F>(&mut self, key: &T, mut pred: F) -> Option<(T, T)>
353 where
354 T: Clone + Ord,
355 F: FnMut(&(T, T)) -> bool,
356 {
357 self.map.pop_right_if(key, |r, _| pred(r)).map(|(r, _)| r)
358 }
359 pub fn drain_with<F>(&mut self, range: (T, T), mut f: F)
361 where
362 T: Clone + Ord,
363 F: FnMut((T, T)),
364 {
365 self.map.drain_with(range, |r, _| f(r));
366 }
367 pub fn iter(&self) -> btree_map::Keys<'_, (T, T), ()> {
368 self.map.keys()
369 }
370}
371impl<K> Extend<(K, K)> for RangeSet<K>
372where
373 K: Clone + Ord,
374{
375 fn extend<T: IntoIterator<Item = (K, K)>>(&mut self, iter: T) {
376 for range in iter {
377 self.insert(range);
378 }
379 }
380}
381impl<K> FromIterator<(K, K)> for RangeSet<K>
382where
383 K: Clone + Ord,
384{
385 fn from_iter<T: IntoIterator<Item = (K, K)>>(iter: T) -> Self {
386 let mut map = Self::new();
387 map.extend(iter);
388 map
389 }
390}
391
392#[cfg(test)]
393mod tests {
394 use super::*;
395 use crate::tools::{
396 WithEmptySegment, Xorshift,
397 testutil::{exhaustive_sequences, sample_usize},
398 };
399
400 fn model_ranges<T: Copy + Eq>(values: &[Option<T>]) -> Vec<((usize, usize), T)> {
401 let mut start = 0;
402 let mut ranges = Vec::new();
403 for run in values.chunk_by(|a, b| a == b) {
404 let end = start + run.len();
405 if let Some(value) = run[0] {
406 ranges.push(((start, end), value));
407 }
408 start = end;
409 }
410 ranges
411 }
412
413 fn check_map_operation(
414 map: &mut RangeMap<usize, i64>,
415 model: &mut [Option<i64>],
416 range: (usize, usize),
417 value: Option<i64>,
418 ) {
419 let expected: Vec<_> = model_ranges(&model[range.0..range.1])
420 .into_iter()
421 .map(|((l, r), value)| ((l + range.0, r + range.0), value))
422 .collect();
423 let mut notified = Vec::new();
424 let mut plain = map.clone();
425 if let Some(value) = value {
426 map.insert_with(range, value, |r, v| notified.push((r, v)));
427 plain.insert(range, value);
428 } else {
429 map.drain_with(range, |r, v| notified.push((r, v)));
430 plain.remove(range);
431 }
432 notified.sort_unstable();
433 assert_eq!(
434 notified, expected,
435 "range={range:?}, value={value:?}, before={model:?}"
436 );
437 model[range.0..range.1].fill(value);
438 let expected = model_ranges(model);
439 assert_eq!(
440 map.iter().map(|(&r, &v)| (r, v)).collect::<Vec<_>>(),
441 expected
442 );
443 assert_eq!(
444 plain.iter().map(|(&r, &v)| (r, v)).collect::<Vec<_>>(),
445 expected
446 );
447 for key in 0..=model.len() {
448 let interval = expected.iter().find(|((l, r), _)| *l <= key && key < *r);
449 assert_eq!(
450 map.get_range_value(&key),
451 interval.map(|(r, v)| (r, v)),
452 "key={key}, model={model:?}"
453 );
454 assert_eq!(map.get(&key).copied(), model.get(key).copied().flatten());
455 assert_eq!(map.contains_key(&key), interval.is_some());
456 }
457 }
458
459 #[test]
460 fn test_range_map() {
461 for n in 0..=5 {
463 for model in exhaustive_sequences([None, Some(0), Some(1)], n..=n) {
464 let mut base = RangeMap::new();
465 for (i, value) in model.iter().enumerate() {
466 if let Some(value) = value {
467 base.insert((i, i + 1), *value);
468 }
469 }
470 for l in 0..=n {
471 for r in l..=n {
472 for value in [None, Some(0), Some(1)] {
473 check_map_operation(
474 &mut base.clone(),
475 &mut model.clone(),
476 (l, r),
477 value,
478 );
479 }
480 }
481 }
482 }
483 }
484 let mut rng = Xorshift::default();
485 for n in sample_usize(&mut rng, 16, 0..=200, 30) {
486 let mut map = RangeMap::new();
487 let mut model = vec![None; n];
488 for _ in 0..1000 {
489 let range = rng.random(WithEmptySegment(n));
490 let value = (rng.random(0..4) != 0).then(|| rng.random(-100..=100));
491 check_map_operation(&mut map, &mut model, range, value);
492 }
493 }
494 }
495
496 fn check_set_operation(
497 set: &mut RangeSet<usize>,
498 model: &mut [Option<()>],
499 range: (usize, usize),
500 insert: bool,
501 ) {
502 let expected: Vec<_> = model_ranges(&model[range.0..range.1])
503 .into_iter()
504 .map(|((l, r), ())| (l + range.0, r + range.0))
505 .collect();
506 let mut notified = Vec::new();
507 let mut plain = set.clone();
508 if insert {
509 set.insert_with(range, |r| notified.push(r));
510 plain.insert(range);
511 } else {
512 set.drain_with(range, |r| notified.push(r));
513 plain.remove(range);
514 }
515 notified.sort_unstable();
516 assert_eq!(
517 notified, expected,
518 "range={range:?}, insert={insert}, before={model:?}"
519 );
520 model[range.0..range.1].fill(insert.then_some(()));
521 let expected: Vec<_> = model_ranges(model).into_iter().map(|(r, ())| r).collect();
522 assert_eq!(set.iter().copied().collect::<Vec<_>>(), expected);
523 assert_eq!(plain.iter().copied().collect::<Vec<_>>(), expected);
524 for key in 0..=model.len() {
525 let interval = expected.iter().find(|&&(l, r)| l <= key && key < r);
526 assert_eq!(set.get_range(&key), interval, "key={key}, model={model:?}");
527 assert_eq!(set.contains(&key), interval.is_some());
528 }
529 }
530
531 #[test]
532 fn test_range_set() {
533 for n in 0..=8 {
534 for model in exhaustive_sequences([None, Some(())], n..=n) {
535 let mut base = RangeSet::new();
536 for (i, value) in model.iter().enumerate() {
537 if value.is_some() {
538 base.insert((i, i + 1));
539 }
540 }
541 for l in 0..=n {
542 for r in l..=n {
543 for insert in [false, true] {
544 check_set_operation(
545 &mut base.clone(),
546 &mut model.clone(),
547 (l, r),
548 insert,
549 );
550 }
551 }
552 }
553 }
554 }
555 let mut rng = Xorshift::default();
556 for n in sample_usize(&mut rng, 16, 0..=200, 30) {
557 let mut set = RangeSet::new();
558 let mut model = vec![None; n];
559 for _ in 0..1000 {
560 let range = rng.random(WithEmptySegment(n));
561 let insert = rng.random(0..4) != 0;
562 check_set_operation(&mut set, &mut model, range, insert);
563 }
564 }
565 }
566}