embed_collections/
range_tree.rs

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
97// when return is overlapping, return equal
98fn 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    // Add range segment, possible adjacent, assume no overlapping with existing range
200    //
201    // # panic
202    //
203    // Panic if there's overlapping range
204    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    // Add range segment, possible adjacent, and check overlapping.
222    //
223    // If there's overlapping with existing range, return `Err((start, end))`
224    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    // Add range which may be crossed section or larger with existing, will merge the range
254    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                // No more overlapping nodes
269                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        // Detach early to get insertion point / parent check for nearest.
298
299        let before_res = unsafe { self.root.nearest(&result, AvlDirection::Left).detach() };
300        let after_res = unsafe { self.root.nearest(&result, AvlDirection::Right).detach() };
301        // Detach results to allow mutable access to self
302        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        // Use unsafe pointer access for mutations/Arc recovery
316        // We know these pointers are valid because we are in a mutable method and haven't removed them yet.
317
318        if merge_before && merge_after {
319            // Merge Both: [before] + [new] + [after]
320
321            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); // Remove old 'after' from ops
327            }
328            // modify after node start range after remove
329            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            // Merge Before Only: Extend `before.end`
340
341            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            // Merge After Only: Extend `after.start`
358            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            // No Merge. Insert new.
369            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    // Ensure remove all overlapping range
383    //
384    // Returns true if removal happens
385    #[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    // Only used when remove range overlap one segment,
398    //
399    // NOTE: If not the case (start, size) might overlaps with multiple segment,  use remove_and_split() instead.
400    // return true when one segment is removed.
401    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            // Remove the middle of segment larger than requested range
430            size_deduce = size;
431            // Update Left in-place
432            rs_node.end.set(start);
433            // Insert Right
434            // New node [end, rs_end]
435            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            // Insert new right part using insert_here optimization
451            // We construct an AvlSearchResult pointing to the current node (rs_node)
452            unsafe { self.root.insert_here(new_rs, result, AvlDirection::Right) };
453        } else if left_over {
454            // Remove Right end
455            size_deduce = rs_end - start;
456            // In-Place Update
457            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            // Remove Left end
470            size_deduce = end - rs_start;
471            // In-Place Update: Update start.
472            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            // Remove Exact / Total
486            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    // return only when segment overlaps with [start, start+size]
504    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    // return only when segment contains [start, size], if multiple segment exists, return the
516    // smallest start
517    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    // If cb returns false, break
541    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        // left join
620        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        // without join
629        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        // right join
638        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        // left and right join
647        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()); // REVERT FIX: Changed from is_none() to is_some()
673
674        // left join
675        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        // without join
684        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        // right join
693        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        // duplicate
702        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        // without join
715        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        // duplicate
724        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        // left and right join
737        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        // add [0, 15]
752        rt.add(0, 15);
753        assert_eq!(15, rt.get_space());
754        assert_eq!(1, rt.root.get_count());
755
756        // remove [7, 8] expect [0, 7] [8, 15]
757        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        // remove [12, 15] expect [0, 7] [8, 12]
767        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        // remove [2, 5] expect [0, 2] [5, 7] [8, 12]
777        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        // remove [8, 10] expect [0, 2] [5, 7] [10, 12]
787        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        // remove [0, 2] expect [5, 7] [10, 12]
797        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); // remove all
850        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        // add [0, 15]
874        rt.add(0, 15);
875        assert_eq!(15, rt.get_space());
876        assert_eq!(1, rt.root.get_count());
877
878        // remove [7, 10] expect [0, 7] [10, 15]
879        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        // remove right over [13, 18] expect [0, 7] [10, 13]
889        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        // remove nothing [9, 10] expect [0, 7] [10, 13]
899        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        // remove left over [9, 11] expect [0, 7] [11, 13]
909        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        // remove [6, 12] expect [0, 6] [12, 13]
919        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        // add [1, 16]
934        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        // remove left over and right over [0, 20] expect []
944        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        // add [1, 16]
953        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        // add [1, 16]
968        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        // add [33, 48]
978        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        // add [49, 64]
988        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        // remove left over and right over [6, 56] expect [1, 6] [56, 64]
998        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        // add [1, 16]
1018        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        // add [33, 48]
1028        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        // remove right over [6, 56] expect [1, 6]
1038        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        // add [1, 16]
1053        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        // add [33, 48]
1063        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        // remove left over [0, 40] expect [40, 48]
1073        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    // Test RangeTreeOps
1146    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                // Use get_exact to get the Arc
1176                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        // TODO test allocator size tree
1186        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            // After removal from ms_tree, the ops tree should also have removed it.
1208            // but the original arc `rs` still exists.
1209            assert_eq!(1, Arc::strong_count(&rs));
1210        }
1211        println!("out")
1212    }
1213}