Skip to main content

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