1use crate::avl::{AvlDirection, AvlItem, AvlNode, AvlSearchResult, AvlTree};
2use alloc::sync::Arc;
3use core::{
4 cell::{Cell, UnsafeCell},
5 cmp::Ordering,
6 fmt,
7};
8
9pub struct AddressTag;
10pub struct SizeTag;
11
12#[derive(Default)]
13#[repr(C)]
14pub struct RangeSeg<T: RangeTreeOps> {
15 node: UnsafeCell<AvlNode<Self, AddressTag>>,
16 pub start: Cell<u64>,
17 pub end: Cell<u64>,
18 ext_node: UnsafeCell<T::ExtNode>,
19}
20
21unsafe impl<T: RangeTreeOps> Send for RangeSeg<T> {}
22
23unsafe impl<T: RangeTreeOps> AvlItem<AddressTag> for RangeSeg<T> {
24 fn get_node(&self) -> &mut AvlNode<Self, AddressTag> {
25 unsafe { &mut *self.node.get() }
26 }
27}
28
29pub struct RangeTree<T>
30where
31 T: RangeTreeOps,
32{
33 root: AvlTree<Arc<RangeSeg<T>>, AddressTag>,
34 space: u64,
35 ops: T,
36}
37
38unsafe impl<T: RangeTreeOps> Send for RangeTree<T> {}
39
40pub trait RangeTreeOps: Sized + Default {
41 type ExtNode: Default;
42 fn op_add(&mut self, rs: Arc<RangeSeg<Self>>);
43 fn op_remove(&mut self, rs: &RangeSeg<Self>);
44
45 #[inline]
46 fn stat_decrease(&mut self, _start: u64, _end: u64) {}
47
48 #[inline]
49 fn stat_increase(&mut self, _start: u64, _end: u64) {}
50}
51
52pub type RangeTreeSimple = RangeTree<DummyAllocator>;
53
54#[derive(Default)]
55#[repr(C)]
56pub struct DummyAllocator();
57
58impl RangeTreeOps for DummyAllocator {
59 type ExtNode = ();
60 #[inline]
61 fn op_add(&mut self, _rs: Arc<RangeSeg<Self>>) {}
62
63 #[inline]
64 fn op_remove(&mut self, _rs: &RangeSeg<Self>) {}
65}
66
67impl<T: RangeTreeOps> RangeSeg<T> {
68 #[inline]
69 pub fn get_ext_node(&self) -> &mut T::ExtNode {
70 unsafe { &mut *self.ext_node.get() }
71 }
72
73 #[inline]
74 pub fn valid(&self) {
75 assert!(self.start.get() <= self.end.get(), "RangeSeg:{:?} invalid", self);
76 }
77
78 #[inline]
79 pub fn new(s: u64, e: u64) -> Arc<RangeSeg<T>> {
80 Arc::new(RangeSeg { start: Cell::new(s), end: Cell::new(e), ..Default::default() })
81 }
82
83 #[inline]
84 pub fn get_range(&self) -> (u64, u64) {
85 (self.start.get(), self.end.get())
86 }
87}
88
89impl<T: RangeTreeOps> fmt::Display for RangeSeg<T> {
90 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
91 write!(f, "RangeSeg({}-{})", self.start.get(), self.end.get())
92 }
93}
94
95impl<T: RangeTreeOps> fmt::Debug for RangeSeg<T> {
96 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
97 let _ = write!(f, "( start: {}, end:{}, ", self.start.get(), self.end.get());
98 let _ = write!(f, "node: {:?}, ", unsafe { &*self.node.get() });
99 write!(f, ")")
101 }
102}
103
104fn range_tree_segment_cmp<T: RangeTreeOps>(a: &RangeSeg<T>, b: &RangeSeg<T>) -> Ordering {
106 if a.end.get() <= b.start.get() {
107 return Ordering::Less;
108 } else if a.start.get() >= b.end.get() {
109 return Ordering::Greater;
110 } else {
111 return Ordering::Equal;
112 }
113}
114
115pub struct RangeTreeIter<'a, T: RangeTreeOps> {
116 tree: &'a RangeTree<T>,
117 current: Option<&'a RangeSeg<T>>,
118}
119
120unsafe impl<'a, T: RangeTreeOps> Send for RangeTreeIter<'a, T> {}
121
122impl<'a, T: RangeTreeOps> Iterator for RangeTreeIter<'a, T> {
123 type Item = &'a RangeSeg<T>;
124
125 fn next(&mut self) -> Option<Self::Item> {
126 let current = self.current.take();
127 if let Some(seg) = current {
128 self.current = self.tree.root.next(seg);
129 }
130 current
131 }
132}
133
134impl<'a, T: RangeTreeOps> IntoIterator for &'a RangeTree<T> {
135 type Item = &'a RangeSeg<T>;
136 type IntoIter = RangeTreeIter<'a, T>;
137
138 #[inline]
139 fn into_iter(self) -> Self::IntoIter {
140 self.iter()
141 }
142}
143
144#[allow(dead_code)]
145impl<T: RangeTreeOps> RangeTree<T> {
146 pub fn new() -> Self {
147 RangeTree {
148 root: AvlTree::<Arc<RangeSeg<T>>, AddressTag>::new(),
149 space: 0,
150 ops: T::default(),
151 }
152 }
153
154 #[inline]
155 pub fn get_ops(&mut self) -> &mut T {
156 &mut self.ops
157 }
158
159 pub fn is_empty(&self) -> bool {
160 if 0 == self.root.get_count() {
161 return true;
162 }
163 false
164 }
165
166 #[inline(always)]
167 pub fn get_space(&self) -> u64 {
168 return self.space;
169 }
170
171 #[inline(always)]
172 pub fn get_count(&self) -> i64 {
173 return self.root.get_count();
174 }
175
176 #[inline(always)]
177 pub fn add_abs(&mut self, start: u64, end: u64) {
178 assert!(start < end, "range tree add start={} end={}", start, end);
179 self.add(start, end - start);
180 }
181
182 #[inline]
188 pub fn add(&mut self, start: u64, size: u64) {
189 assert!(size > 0, "range tree add size={} error", size);
190 let rs_key = RangeSeg {
191 start: Cell::new(start),
192 end: Cell::new(start + size),
193 ..Default::default()
194 };
195 let result = self.root.find(&rs_key, range_tree_segment_cmp);
196 if result.direction.is_none() {
197 panic!("allocating allocated {} of {:?}", &rs_key, result.get_exact().unwrap());
198 }
199
200 let detached_result = unsafe { result.detach() };
201 self.space += size;
202 self.merge_seg(start, start + size, detached_result);
203 }
204
205 #[inline]
209 pub fn add_find_overlap(&mut self, start: u64, size: u64) -> Result<(), (u64, u64)> {
210 assert!(size > 0, "range tree add size={} error", size);
211 let rs_key = RangeSeg {
212 start: Cell::new(start),
213 end: Cell::new(start + size),
214 ..Default::default()
215 };
216 let result = self.root.find(&rs_key, range_tree_segment_cmp);
217 if result.direction.is_none() {
218 let ol_node = result.get_exact().unwrap();
219 let max_start = if rs_key.start.get() > ol_node.start.get() {
220 rs_key.start.get()
221 } else {
222 ol_node.start.get()
223 };
224 let min_end = if rs_key.end.get() > ol_node.end.get() {
225 ol_node.end.get()
226 } else {
227 rs_key.end.get()
228 };
229 return Err((max_start, min_end));
230 }
231
232 let detached_result = unsafe { result.detach() };
233 self.space += size;
234 self.merge_seg(start, start + size, detached_result);
235 return Ok(());
236 }
237
238 #[inline]
240 pub fn add_and_merge(&mut self, start: u64, size: u64) {
241 assert!(size > 0, "range tree add size={} error", size);
242 let mut new_start = start;
243 let mut new_end = start + size;
244
245 loop {
246 let search_key = RangeSeg {
247 start: Cell::new(new_start),
248 end: Cell::new(new_end),
249 ..Default::default()
250 };
251 let result = self.root.find(&search_key, range_tree_segment_cmp);
252
253 if result.direction.is_some() {
254 break;
256 }
257
258 let node = result.get_exact().unwrap();
259 if node.start.get() < new_start {
260 new_start = node.start.get();
261 }
262 if node.end.get() > new_end {
263 new_end = node.end.get();
264 }
265 let node_start = node.start.get();
266 let node_size = node.end.get() - node.start.get();
267
268 if !self.remove(node_start, node_size) {
269 panic!("rs[{}:{}] NOT existed", node_start, node_size);
270 }
271 }
272 let search_key =
273 RangeSeg { start: Cell::new(new_start), end: Cell::new(new_end), ..Default::default() };
274 let result = self.root.find(&search_key, range_tree_segment_cmp);
275
276 let detached_result = unsafe { result.detach() };
277 self.space += new_end - new_start;
278 self.merge_seg(new_start, new_end, detached_result);
279 }
280
281 #[inline(always)]
282 fn merge_seg(&mut self, start: u64, end: u64, result: AvlSearchResult<Arc<RangeSeg<T>>>) {
283 let before_res = unsafe { self.root.nearest(&result, AvlDirection::Left).detach() };
286 let after_res = unsafe { self.root.nearest(&result, AvlDirection::Right).detach() };
287 let mut merge_before = false;
289 let mut merge_after = false;
290 let (mut before_start, mut before_end, mut after_start, mut after_end) = (0, 0, 0, 0);
291 if let Some(before_node) = before_res.get_nearest() {
292 (before_start, before_end) = before_node.get_range();
293 merge_before = before_end == start;
294 }
295
296 if let Some(after_node) = after_res.get_nearest() {
297 (after_start, after_end) = after_node.get_range();
298 merge_after = after_start == end;
299 }
300
301 if merge_before && merge_after {
305 let before_node = self.root.remove_with(before_res).unwrap();
308 let after_node_ref = after_res.get_node_ref().unwrap();
309
310 self.ops.op_remove(&before_node);
311 self.ops.op_remove(after_node_ref); after_node_ref.start.set(before_start);
314 self.ops.op_add(after_res.get_exact().unwrap());
315 self.ops.stat_decrease(before_start, before_end);
316 self.ops.stat_decrease(after_start, after_end);
317 self.ops.stat_increase(before_start, after_end);
318 } else if merge_before {
319 let before_node_ref = before_res.get_node_ref().unwrap();
322 before_node_ref.end.set(end);
323 self.ops.op_remove(before_node_ref);
324 self.ops.op_add(before_res.get_exact().unwrap());
325
326 self.ops.stat_decrease(before_start, before_end);
327 self.ops.stat_increase(before_start, end);
328 } else if merge_after {
329 let after_node_ref = after_res.get_node_ref().unwrap();
330 self.ops.op_remove(after_node_ref);
331 after_node_ref.start.set(start);
333
334 self.ops.op_add(after_res.get_exact().unwrap());
335 self.ops.stat_decrease(after_start, after_end);
336 self.ops.stat_increase(start, after_end);
337 } else {
338 let new_node = RangeSeg::new(start, end);
340 self.ops.op_add(new_node.clone());
341
342 self.root.insert(new_node, result);
343 self.ops.stat_increase(start, end);
344 }
345 }
346
347 #[inline(always)]
351 pub fn remove_and_split(&mut self, start: u64, size: u64) -> bool {
352 let mut removed = false;
353 loop {
354 if !self.remove(start, size) {
355 break;
356 }
357 removed = true;
358 }
359 return removed;
360 }
361
362 #[inline]
367 pub fn remove(&mut self, start: u64, size: u64) -> bool {
368 let end = start + size;
369 let search_rs =
370 RangeSeg { start: Cell::new(start), end: Cell::new(end), ..Default::default() };
371 let result = self.root.find(&search_rs, range_tree_segment_cmp);
372 if !result.is_exact() {
373 return false;
374 }
375 assert!(size > 0, "range tree remove size={} error", size);
376
377 let rs_node = result.get_node_ref().unwrap();
378 let rs_start = rs_node.start.get();
379 let rs_end = rs_node.end.get();
380
381 assert!(
382 rs_start <= end && rs_end >= start,
383 "range tree remove error, rs_start={} rs_end={} start={} end={}",
384 rs_start,
385 rs_end,
386 start,
387 end
388 );
389
390 let left_over = rs_start < start;
391 let right_over = rs_end > end;
392 let size_deduce: u64;
393
394 if left_over && right_over {
395 size_deduce = size;
397 rs_node.end.set(start);
399 let new_rs = RangeSeg::new(end, rs_end);
402
403 self.ops.op_remove(&rs_node);
404 self.ops.op_add(result.get_exact().unwrap());
405 self.ops.op_add(new_rs.clone());
406 let result = unsafe { result.detach() };
407 let _ = rs_node;
408
409 self.ops.stat_decrease(rs_start, rs_end);
410 self.ops.stat_increase(rs_start, start);
411 self.ops.stat_increase(end, rs_end);
412 unsafe { self.root.insert_here(new_rs, result, AvlDirection::Right) };
415 } else if left_over {
416 size_deduce = rs_end - start;
418 rs_node.end.set(start);
420 self.ops.op_remove(&rs_node);
421 self.ops.op_add(result.get_exact().unwrap());
422 let _ = rs_node;
423
424 self.ops.stat_decrease(rs_start, rs_end);
425 self.ops.stat_increase(rs_start, start);
426 } else if right_over {
427 size_deduce = end - rs_start;
429 rs_node.start.set(end);
431
432 self.ops.op_remove(&rs_node);
433 self.ops.op_add(result.get_exact().unwrap());
434 let _ = rs_node;
435
436 self.ops.stat_decrease(rs_start, rs_end);
437 self.ops.stat_increase(end, rs_end);
438 } else {
439 size_deduce = rs_end - rs_start;
441
442 self.ops.op_remove(&rs_node);
443 let _ = rs_node;
444
445 self.root.remove_ref(&result.get_exact().unwrap());
446 self.ops.stat_decrease(rs_start, rs_end);
447 }
448
449 self.space -= size_deduce;
450 return true;
451 }
452
453 #[inline]
455 pub fn find(&self, start: u64, size: u64) -> Option<Arc<RangeSeg<T>>> {
456 if self.root.get_count() == 0 {
457 return None;
458 }
459 assert!(size > 0, "range tree find size={} error", size);
460 let end = start + size;
461 let rs = RangeSeg { start: Cell::new(start), end: Cell::new(end), ..Default::default() };
462 let result = self.root.find(&rs, range_tree_segment_cmp);
463 return result.get_exact();
464 }
465
466 #[inline]
469 pub fn find_contained(&self, start: u64, size: u64) -> Option<&RangeSeg<T>> {
470 assert!(size > 0, "range tree find size={} error", size);
471 if self.root.get_count() == 0 {
472 return None;
473 }
474 let end = start + size;
475 let rs_search =
476 RangeSeg { start: Cell::new(start), end: Cell::new(end), ..Default::default() };
477 self.root.find_contained(&rs_search, range_tree_segment_cmp)
478 }
479
480 #[inline]
481 pub fn iter(&self) -> RangeTreeIter<'_, T> {
482 RangeTreeIter { tree: self, current: self.root.first() }
483 }
484
485 #[inline]
486 pub fn walk<F: FnMut(&RangeSeg<T>)>(&self, mut cb: F) {
487 let mut node = self.root.first();
488 loop {
489 if let Some(_node) = node {
490 cb(&_node);
491 node = self.root.next(&_node);
492 } else {
493 break;
494 }
495 }
496 }
497
498 #[inline]
500 pub fn walk_conditioned<F: FnMut(&RangeSeg<T>) -> bool>(&self, mut cb: F) {
501 let mut node = self.root.first();
502 loop {
503 if let Some(_node) = node {
504 if !cb(&_node) {
505 break;
506 }
507 node = self.root.next(&_node);
508 } else {
509 break;
510 }
511 }
512 }
513
514 pub fn get_root(&self) -> &AvlTree<Arc<RangeSeg<T>>, AddressTag> {
515 return &self.root;
516 }
517
518 pub fn validate(&self) {
519 self.root.validate(|a, b| a.start.get().cmp(&b.start.get()));
520 }
521}
522
523pub fn size_tree_insert_cmp<T: RangeTreeOps>(a: &RangeSeg<T>, b: &RangeSeg<T>) -> Ordering {
524 let size_a = a.end.get() - a.start.get();
525 let size_b = b.end.get() - b.start.get();
526 if size_a < size_b {
527 return Ordering::Less;
528 } else if size_a > size_b {
529 return Ordering::Greater;
530 } else {
531 if a.start.get() < b.start.get() {
532 return Ordering::Less;
533 } else if a.start.get() > b.start.get() {
534 return Ordering::Greater;
535 } else {
536 return Ordering::Equal;
537 }
538 }
539}
540
541pub fn size_tree_find_cmp<T: RangeTreeOps>(a: &RangeSeg<T>, b: &RangeSeg<T>) -> Ordering {
542 let size_a = a.end.get() - a.start.get();
543 let size_b = b.end.get() - b.start.get();
544 return size_a.cmp(&size_b);
545}
546
547#[cfg(feature = "std")]
548pub fn range_tree_print(tree: &RangeTreeSimple) {
549 if tree.get_space() == 0 {
550 println!("tree is empty");
551 } else {
552 tree.walk(|rs| {
553 println!("\t{}-{}", rs.start.get(), rs.end.get());
554 });
555 }
556}
557
558#[cfg(test)]
559mod tests {
560 use super::*;
561
562 #[test]
563 fn range_tree_sizeof() {
564 println!("range tree sizeof {}", std::mem::size_of::<RangeTreeSimple>());
565 println!(
566 "RangeSeg<DummyAllocator> sizeof {}",
567 std::mem::size_of::<RangeSeg<DummyAllocator>>()
568 );
569 println!(
570 "avl node sizeof {}",
571 std::mem::size_of::<AvlNode<RangeSeg<DummyAllocator>, AddressTag>>()
572 );
573 println!("UnsafeCell<()> sizeof {}", std::mem::size_of::<UnsafeCell<()>>());
574 }
575
576 #[test]
577 fn range_tree_add() {
578 let mut rt = RangeTreeSimple::new();
579 assert!(rt.find(0, 10).is_none());
580 assert_eq!(0, rt.get_space());
581
582 rt.add(0, 2);
583 assert_eq!(2, rt.get_space());
584 assert_eq!(1, rt.root.get_count());
585
586 let rs = rt.find_contained(0, 1);
587 assert!(rs.is_some());
588 assert_eq!((0, 2), rs.as_ref().unwrap().get_range());
589
590 assert!(rt.find_contained(0, 3).is_some());
591
592 rt.add_and_merge(2, 5);
594 assert_eq!(7, rt.get_space());
595 assert_eq!(1, rt.root.get_count());
596
597 let rs = rt.find_contained(0, 1);
598 assert!(rs.is_some());
599 assert_eq!((0, 7), rs.unwrap().get_range());
600
601 rt.add_and_merge(10, 5);
603 assert_eq!(12, rt.get_space());
604 assert_eq!(2, rt.root.get_count());
605
606 let rs = rt.find_contained(11, 1);
607 assert!(rs.is_some());
608 assert_eq!((10, 15), rs.unwrap().get_range());
609
610 rt.add_and_merge(8, 2);
612 assert_eq!(14, rt.get_space());
613 assert_eq!(2, rt.root.get_count());
614
615 let rs = rt.find_contained(11, 1);
616 assert!(rs.is_some());
617 assert_eq!((8, 15), rs.unwrap().get_range());
618
619 rt.add_and_merge(7, 1);
621 assert_eq!(15, rt.get_space());
622 assert_eq!(1, rt.root.get_count());
623
624 let rs = rt.find_contained(11, 1);
625 assert!(rs.is_some());
626 assert_eq!((0, 15), rs.unwrap().get_range());
627
628 rt.validate();
629 }
630
631 #[test]
632 fn range_tree_add_and_merge() {
633 let mut rt = RangeTreeSimple::new();
634 assert!(rt.find(0, 10).is_none());
635 assert_eq!(0, rt.get_space());
636
637 rt.add_and_merge(0, 2);
638 assert_eq!(2, rt.get_space());
639 assert_eq!(1, rt.root.get_count());
640
641 let rs = rt.find_contained(0, 1);
642 assert!(rs.is_some());
643 assert_eq!((0, 2), rs.as_ref().unwrap().get_range());
644
645 assert!(rt.find_contained(0, 3).is_some()); rt.add_and_merge(2, 5);
649 assert_eq!(7, rt.get_space());
650 assert_eq!(1, rt.root.get_count());
651
652 let rs = rt.find_contained(0, 1);
653 assert!(rs.is_some());
654 assert_eq!((0, 7), rs.unwrap().get_range());
655
656 rt.add_and_merge(15, 5);
658 assert_eq!(12, rt.get_space());
659 assert_eq!(2, rt.root.get_count());
660
661 let rs = rt.find_contained(16, 1);
662 assert!(rs.is_some());
663 assert_eq!((15, 20), rs.unwrap().get_range());
664
665 rt.add_and_merge(13, 2);
667 assert_eq!(14, rt.get_space());
668 assert_eq!(2, rt.root.get_count());
669
670 let rs = rt.find_contained(16, 1);
671 assert!(rs.is_some());
672 assert_eq!((13, 20), rs.unwrap().get_range());
673
674 rt.add_and_merge(14, 8);
676 assert_eq!(16, rt.get_space());
677 assert_eq!(2, rt.root.get_count());
678
679 let rs = rt.find_contained(0, 1);
680 assert!(rs.is_some());
681 assert_eq!((0, 7), rs.unwrap().get_range());
682
683 let rs = rt.find_contained(16, 1);
684 assert!(rs.is_some());
685 assert_eq!((13, 22), rs.unwrap().get_range());
686
687 rt.add_and_merge(25, 5);
689 assert_eq!(21, rt.get_space());
690 assert_eq!(3, rt.root.get_count());
691
692 let rs = rt.find_contained(26, 1);
693 assert!(rs.is_some());
694 assert_eq!((25, 30), rs.unwrap().get_range());
695
696 rt.add_and_merge(12, 20);
698 assert_eq!(27, rt.get_space());
699 assert_eq!(2, rt.root.get_count());
700
701 let rs = rt.find_contained(0, 1);
702 assert!(rs.is_some());
703 assert_eq!((0, 7), rs.unwrap().get_range());
704
705 let rs = rt.find_contained(16, 1);
706 assert!(rs.is_some());
707 assert_eq!((12, 32), rs.unwrap().get_range());
708
709 rt.add_and_merge(7, 5);
711 assert_eq!(32, rt.get_space());
712 assert_eq!(1, rt.root.get_count());
713
714 let rs = rt.find_contained(11, 1);
715 assert!(rs.is_some());
716 assert_eq!((0, 32), rs.unwrap().get_range());
717
718 rt.validate();
719 }
720
721 #[test]
722 fn range_tree_remove() {
723 let mut rt = RangeTreeSimple::new();
724 rt.add(0, 15);
726 assert_eq!(15, rt.get_space());
727 assert_eq!(1, rt.root.get_count());
728
729 rt.remove(7, 1);
731 assert_eq!(14, rt.get_space());
732 assert_eq!(2, rt.root.get_count());
733
734 let rs = rt.find_contained(11, 1);
735 assert!(rs.is_some());
736 assert_eq!((8, 15), rs.unwrap().get_range());
737 rt.validate();
738
739 rt.remove(12, 3);
741 assert_eq!(11, rt.get_space());
742 assert_eq!(2, rt.root.get_count());
743
744 let rs = rt.find_contained(11, 1);
745 assert!(rs.is_some());
746 assert_eq!((8, 12), rs.unwrap().get_range());
747 rt.validate();
748
749 rt.remove(2, 3);
751 assert_eq!(8, rt.get_space());
752 assert_eq!(3, rt.root.get_count());
753
754 let rs = rt.find_contained(5, 1);
755 assert!(rs.is_some());
756 assert_eq!((5, 7), rs.unwrap().get_range());
757 rt.validate();
758
759 rt.remove(8, 2);
761 assert_eq!(6, rt.get_space());
762 assert_eq!(3, rt.root.get_count());
763
764 let rs = rt.find_contained(10, 1);
765 assert!(rs.is_some());
766 assert_eq!((10, 12), rs.unwrap().get_range());
767 rt.validate();
768
769 rt.remove(0, 2);
771 assert_eq!(4, rt.get_space());
772 assert_eq!(2, rt.root.get_count());
773
774 let rs = rt.find_contained(5, 1);
775 assert!(rs.is_some());
776 assert_eq!((5, 7), rs.unwrap().get_range());
777 rt.validate();
778 }
779
780 #[test]
781 fn range_tree_walk() {
782 let mut rt = RangeTreeSimple::new();
783 rt.add(0, 2);
784 rt.add(4, 4);
785 rt.add(12, 8);
786 rt.add(32, 16);
787 assert_eq!(30, rt.get_space());
788 assert_eq!(4, rt.root.get_count());
789
790 fn cb_print(rs: &RangeSeg<DummyAllocator>) {
791 println!("walk callback cb_print range_seg:{:?}", rs);
792 }
793
794 rt.walk(cb_print);
795 }
796
797 #[test]
798 fn range_tree_iter() {
799 let mut rt = RangeTreeSimple::new();
800 rt.add(0, 2);
801 rt.add(4, 4);
802 rt.add(12, 8);
803 rt.add(32, 16);
804
805 let mut count = 0;
806 let mut total_space = 0;
807 for rs in rt.iter() {
808 count += 1;
809 total_space += rs.end.get() - rs.start.get();
810 }
811 assert_eq!(count, rt.get_count() as usize);
812 assert_eq!(total_space, rt.get_space());
813 assert_eq!(4, count);
814 assert_eq!(30, total_space);
815
816 let ranges_from_into_iter: Vec<(u64, u64)> =
818 (&rt).into_iter().map(|rs| rs.get_range()).collect();
819 assert_eq!(ranges_from_into_iter, vec![(0, 2), (4, 8), (12, 20), (32, 48)]);
820
821 let mut ranges_from_for: Vec<(u64, u64)> = Vec::new();
823 for rs in &rt {
824 ranges_from_for.push(rs.get_range());
825 }
826 assert_eq!(ranges_from_for, vec![(0, 2), (4, 8), (12, 20), (32, 48)]);
827 }
828
829 #[test]
830 fn range_tree_find_overlap() {
831 let mut rt = RangeTreeSimple::new();
832 rt.add_abs(2044, 2052);
833 rt.add_abs(4092, 4096);
834 rt.add_abs(516096, 516098);
835 rt.add_abs(518140, 518148);
836 rt.add_abs(520188, 520194);
837 rt.add_abs(522236, 522244);
838 rt.add_abs(524284, 524288);
839 rt.add_abs(66060288, 66060290);
840 rt.add_abs(66062332, 66062340);
841 rt.add_abs(66064380, 66064384);
842 let result = rt.find_contained(0, 4096).unwrap();
843 assert_eq!(result.start.get(), 2044);
844 assert_eq!(result.end.get(), 2052);
845 for i in &[4096, 516098, 518148, 520194, 522244, 524288, 66060290, 66062340, 66064384] {
846 let result = rt.find_contained(4000, *i).unwrap();
847 assert_eq!(result.start.get(), 4092);
848 }
849 range_tree_print(&rt);
850 let _space1 = rt.get_space();
851 assert!(rt.remove(0, 66064384));
852 assert!(rt.get_space() > 0, "only remove one");
853 range_tree_print(&rt);
854 rt.remove_and_split(0, 66064384); assert_eq!(rt.get_space(), 0);
856 }
857
858 #[test]
859 fn range_tree_find_overlap_simple() {
860 let mut rt = RangeTreeSimple::new();
861 rt.add_abs(20, 80);
862 rt.add_abs(120, 180);
863 rt.add_abs(220, 280);
864 rt.add_abs(320, 380);
865 rt.add_abs(420, 480);
866 rt.add_abs(520, 580);
867 rt.add_abs(620, 680);
868 range_tree_print(&rt);
869 let result = rt.find_contained(240, 340).unwrap();
870 assert_eq!(result.start.get(), 220);
871 assert_eq!(result.end.get(), 280);
872 }
873
874 #[test]
875 fn range_tree_remove1() {
876 let mut rt = RangeTreeSimple::new();
877
878 rt.add(0, 15);
880 assert_eq!(15, rt.get_space());
881 assert_eq!(1, rt.root.get_count());
882
883 rt.remove_and_split(7, 3);
885 assert_eq!(12, rt.get_space());
886 assert_eq!(2, rt.root.get_count());
887
888 let rs = rt.find_contained(11, 1);
889 assert!(rs.is_some());
890 assert_eq!((10, 15), rs.unwrap().get_range());
891 rt.validate();
892
893 rt.remove_and_split(13, 5);
895 assert_eq!(10, rt.get_space());
896 assert_eq!(2, rt.root.get_count());
897
898 let rs = rt.find_contained(11, 1);
899 assert!(rs.is_some());
900 assert_eq!((10, 13), rs.unwrap().get_range());
901 rt.validate();
902
903 assert!(!rt.remove_and_split(9, 1));
905 assert_eq!(10, rt.get_space());
906 assert_eq!(2, rt.root.get_count());
907
908 let rs = rt.find_contained(11, 1);
909 assert!(rs.is_some());
910 assert_eq!((10, 13), rs.unwrap().get_range());
911 rt.validate();
912
913 rt.remove_and_split(9, 2);
915 assert_eq!(9, rt.get_space());
916 assert_eq!(2, rt.root.get_count());
917
918 let rs = rt.find_contained(11, 1);
919 assert!(rs.is_some());
920 assert_eq!((11, 13), rs.unwrap().get_range());
921 rt.validate();
922
923 rt.remove_and_split(6, 6);
925 assert_eq!(7, rt.get_space());
926 assert_eq!(2, rt.root.get_count());
927
928 let rs = rt.find_contained(0, 5);
929 assert!(rs.is_some());
930 assert_eq!((0, 6), rs.unwrap().get_range());
931 rt.validate();
932 }
933
934 #[test]
935 fn range_tree_remove2() {
936 let mut rt = RangeTreeSimple::new();
937
938 rt.add(1, 15);
940 assert_eq!(15, rt.get_space());
941 assert_eq!(1, rt.root.get_count());
942
943 let rs = rt.find_contained(11, 1);
944 assert!(rs.is_some());
945 assert_eq!((1, 16), rs.unwrap().get_range());
946 rt.validate();
947
948 rt.remove_and_split(0, 20);
950 assert_eq!(0, rt.get_space());
951 assert_eq!(0, rt.root.get_count());
952
953 let rs = rt.find_contained(11, 1);
954 assert!(rs.is_none());
955 rt.validate();
956
957 rt.add(1, 15);
959 assert_eq!(15, rt.get_space());
960 assert_eq!(1, rt.root.get_count());
961
962 let rs = rt.find_contained(11, 1);
963 assert!(rs.is_some());
964 assert_eq!((1, 16), rs.unwrap().get_range());
965 rt.validate();
966 }
967
968 #[test]
969 fn range_tree_remove3() {
970 let mut rt = RangeTreeSimple::new();
971
972 rt.add(1, 15);
974 assert_eq!(15, rt.get_space());
975 assert_eq!(1, rt.root.get_count());
976
977 let rs = rt.find_contained(11, 1);
978 assert!(rs.is_some());
979 assert_eq!((1, 16), rs.unwrap().get_range());
980 rt.validate();
981
982 rt.add(33, 15);
984 assert_eq!(30, rt.get_space());
985 assert_eq!(2, rt.root.get_count());
986
987 let rs = rt.find_contained(40, 1);
988 assert!(rs.is_some());
989 assert_eq!((33, 48), rs.unwrap().get_range());
990 rt.validate();
991
992 rt.add(49, 15);
994 assert_eq!(45, rt.get_space());
995 assert_eq!(3, rt.root.get_count());
996
997 let rs = rt.find_contained(50, 1);
998 assert!(rs.is_some());
999 assert_eq!((49, 64), rs.unwrap().get_range());
1000 rt.validate();
1001
1002 rt.remove_and_split(6, 50);
1004 assert_eq!(13, rt.get_space());
1005 assert_eq!(2, rt.root.get_count());
1006
1007 let rs = rt.find_contained(58, 1);
1008 assert!(rs.is_some());
1009 assert_eq!((56, 64), rs.unwrap().get_range());
1010 rt.validate();
1011
1012 let rs = rt.find_contained(3, 1);
1013 assert!(rs.is_some());
1014 assert_eq!((1, 6), rs.unwrap().get_range());
1015 rt.validate();
1016 }
1017
1018 #[test]
1019 fn range_tree_remove4() {
1020 let mut rt = RangeTreeSimple::new();
1021
1022 rt.add(1, 15);
1024 assert_eq!(15, rt.get_space());
1025 assert_eq!(1, rt.root.get_count());
1026
1027 let rs = rt.find_contained(11, 1);
1028 assert!(rs.is_some());
1029 assert_eq!((1, 16), rs.unwrap().get_range());
1030 rt.validate();
1031
1032 rt.add(33, 15);
1034 assert_eq!(30, rt.get_space());
1035 assert_eq!(2, rt.root.get_count());
1036
1037 let rs = rt.find_contained(40, 1);
1038 assert!(rs.is_some());
1039 assert_eq!((33, 48), rs.unwrap().get_range());
1040 rt.validate();
1041
1042 rt.remove_and_split(6, 50);
1044 assert_eq!(5, rt.get_space());
1045 assert_eq!(1, rt.root.get_count());
1046
1047 let rs = rt.find_contained(3, 1);
1048 assert!(rs.is_some());
1049 assert_eq!((1, 6), rs.unwrap().get_range());
1050 rt.validate();
1051 }
1052
1053 #[test]
1054 fn range_tree_remove5() {
1055 let mut rt = RangeTreeSimple::new();
1056
1057 rt.add(1, 15);
1059 assert_eq!(15, rt.get_space());
1060 assert_eq!(1, rt.root.get_count());
1061
1062 let rs = rt.find_contained(11, 1);
1063 assert!(rs.is_some());
1064 assert_eq!((1, 16), rs.unwrap().get_range());
1065 rt.validate();
1066
1067 rt.add(33, 15);
1069 assert_eq!(30, rt.get_space());
1070 assert_eq!(2, rt.root.get_count());
1071
1072 let rs = rt.find_contained(40, 1);
1073 assert!(rs.is_some());
1074 assert_eq!((33, 48), rs.unwrap().get_range());
1075 rt.validate();
1076
1077 rt.remove_and_split(0, 40);
1079 assert_eq!(8, rt.get_space());
1080 assert_eq!(1, rt.root.get_count());
1081
1082 let rs = rt.find_contained(42, 1);
1083 assert!(rs.is_some());
1084 assert_eq!((40, 48), rs.unwrap().get_range());
1085 rt.validate();
1086 }
1087
1088 pub struct TestAllocator {
1090 size_tree: AvlTree<Arc<RangeSeg<TestAllocator>>, SizeTag>,
1091 }
1092
1093 impl Default for TestAllocator {
1094 fn default() -> Self {
1095 Self::new()
1096 }
1097 }
1098
1099 impl TestAllocator {
1100 pub fn new() -> Self {
1101 TestAllocator { size_tree: AvlTree::<Arc<RangeSeg<TestAllocator>>, SizeTag>::new() }
1102 }
1103 }
1104
1105 impl Drop for TestAllocator {
1106 fn drop(&mut self) {
1107 println!("drop test allocator");
1108 }
1109 }
1110
1111 unsafe impl AvlItem<SizeTag> for RangeSeg<TestAllocator> {
1112 fn get_node(&self) -> &mut AvlNode<RangeSeg<TestAllocator>, SizeTag> {
1113 self.get_ext_node()
1114 }
1115 }
1116
1117 impl RangeTreeOps for TestAllocator {
1118 type ExtNode = AvlNode<RangeSeg<Self>, SizeTag>;
1119
1120 fn op_add(&mut self, rs: Arc<RangeSeg<Self>>) {
1121 self.size_tree.add(rs, |a, b| size_tree_insert_cmp(a, b));
1122 }
1123
1124 fn op_remove(&mut self, rs: &RangeSeg<Self>) {
1125 let search_key = RangeSeg {
1126 start: Cell::new(rs.start.get()),
1127 end: Cell::new(rs.end.get()),
1128 ..Default::default()
1129 };
1130 let result = self.size_tree.find(&search_key, size_tree_insert_cmp);
1131 if let Some(removed_arc) = result.get_exact() {
1132 self.size_tree.remove_ref(&removed_arc);
1134 } else {
1135 panic!("Attempted to remove non-existent RangeSeg from size_tree: {:?}", rs);
1136 }
1137 }
1138 }
1139
1140 #[test]
1141 fn range_tree_ops() {
1142 let mut ms_tree = RangeTree::<TestAllocator>::new();
1144
1145 assert!(ms_tree.find(0, 10).is_none());
1146 assert_eq!(0, ms_tree.get_space());
1147
1148 ms_tree.add(0, 100);
1149 assert_eq!(100, ms_tree.get_space());
1150 assert_eq!(1, ms_tree.get_count());
1151
1152 let rs = ms_tree.find(0, 1).unwrap();
1153 assert_eq!((0, 100), rs.get_range());
1154
1155 assert_eq!(3, Arc::strong_count(&rs));
1156
1157 ms_tree.remove(0, 100);
1158 assert_eq!(0, ms_tree.get_space());
1159 assert_eq!(0, ms_tree.get_count());
1160
1161 assert_eq!(1, Arc::strong_count(&rs));
1164 println!("out")
1165 }
1166}