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