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