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