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
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
99// when return is overlapping, return equal
100fn 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    /// Add range segment, possible adjacent, assume no overlapping with existing range
231    ///
232    /// # panic
233    ///
234    /// Panic if there's overlapping range
235    #[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    /// Add range segment, possible adjacent, and check overlapping.
254    ///
255    /// If there's overlapping with existing range, return `Err((start, end))`
256    #[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    /// Add range which may be crossed section or larger with existing, will merge the range
287    #[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                // No more overlapping nodes
303                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        // Detach early to get insertion point / parent check for nearest.
332
333        let before_res = unsafe { self.root.nearest(&result, AvlDirection::Left).detach() };
334        let after_res = unsafe { self.root.nearest(&result, AvlDirection::Right).detach() };
335        // Detach results to allow mutable access to self
336        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        // Use unsafe pointer access for mutations/Arc recovery
350        // We know these pointers are valid because we are in a mutable method and haven't removed them yet.
351
352        if merge_before && merge_after {
353            // Merge Both: [before] + [new] + [after]
354
355            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); // Remove old 'after' from ops
361            }
362            // modify after node start range after remove
363            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            // Merge Before Only: Extend `before.end`
374
375            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            // Merge After Only: Extend `after.start`
392            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            // No Merge. Insert new.
403            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    /// Ensure remove all overlapping range
417    ///
418    /// Returns true if removal happens
419    #[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    /// Only used when remove range overlap one segment,
432    ///
433    /// NOTE: If not the case (start, size) might overlaps with multiple segment,  use remove_and_split() instead.
434    /// return true when one segment is removed.
435    #[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            // Remove the middle of segment larger than requested range
465            size_deduce = size;
466            // Update Left in-place
467            rs_node.end.set(start);
468            // Insert Right
469            // New node [end, rs_end]
470            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            // Insert new right part using insert_here optimization
486            // We construct an AvlSearchResult pointing to the current node (rs_node)
487            unsafe { self.root.insert_here(new_rs, result, AvlDirection::Right) };
488        } else if left_over {
489            // Remove Right end
490            size_deduce = rs_end - start;
491            // In-Place Update
492            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            // Remove Left end
505            size_deduce = end - rs_start;
506            // In-Place Update: Update start.
507            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            // Remove Exact / Total
521            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    /// return only when segment overlaps with [start, start+size]
539    #[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    /// return only when segment contains [start, size], if multiple segment exists, return the
552    /// smallest start
553    #[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    /// If cb returns false, break
584    #[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        // left join
664        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        // without join
673        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        // right join
682        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        // left and right join
691        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()); // REVERT FIX: Changed from is_none() to is_some()
717
718        // left join
719        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        // without join
728        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        // right join
737        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        // duplicate
746        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        // without join
759        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        // duplicate
768        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        // left and right join
781        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        // add [0, 15]
796        rt.add(0, 15);
797        assert_eq!(15, rt.get_space());
798        assert_eq!(1, rt.root.get_count());
799
800        // remove [7, 8] expect [0, 7] [8, 15]
801        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        // remove [12, 15] expect [0, 7] [8, 12]
811        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        // remove [2, 5] expect [0, 2] [5, 7] [8, 12]
821        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        // remove [8, 10] expect [0, 2] [5, 7] [10, 12]
831        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        // remove [0, 2] expect [5, 7] [10, 12]
841        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        // Test IntoIterator
888        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        // Test for loop on reference
893        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); // remove all
926        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        // add [0, 15]
950        rt.add(0, 15);
951        assert_eq!(15, rt.get_space());
952        assert_eq!(1, rt.root.get_count());
953
954        // remove [7, 10] expect [0, 7] [10, 15]
955        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        // remove right over [13, 18] expect [0, 7] [10, 13]
965        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        // remove nothing [9, 10] expect [0, 7] [10, 13]
975        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        // remove left over [9, 11] expect [0, 7] [11, 13]
985        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        // remove [6, 12] expect [0, 6] [12, 13]
995        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        // add [1, 16]
1010        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        // remove left over and right over [0, 20] expect []
1020        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        // add [1, 16]
1029        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        // add [1, 16]
1044        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        // add [33, 48]
1054        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        // add [49, 64]
1064        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        // remove left over and right over [6, 56] expect [1, 6] [56, 64]
1074        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        // add [1, 16]
1094        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        // add [33, 48]
1104        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        // remove right over [6, 56] expect [1, 6]
1114        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        // add [1, 16]
1129        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        // add [33, 48]
1139        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        // remove left over [0, 40] expect [40, 48]
1149        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    // Test RangeTreeOps
1222    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                // Use get_exact to get the Arc
1252                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        // TODO test allocator size tree
1262        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            // After removal from ms_tree, the ops tree should also have removed it.
1284            // but the original arc `rs` still exists.
1285            assert_eq!(1, Arc::strong_count(&rs));
1286        }
1287        println!("out")
1288    }
1289}