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