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