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