crdt_richtext/legacy/range_map/
tree_impl.rs

1use generic_btree::{
2    rle::{HasLength, Mergeable, Sliceable},
3    BTree, BTreeTrait, ElemSlice, FindResult, HeapVec, Query, QueryResult, SmallElemVec, StackVec,
4};
5use std::{
6    collections::BTreeSet,
7    mem::take,
8    ops::{Range, RangeInclusive},
9    sync::Arc,
10};
11
12use crate::{
13    legacy::range_map::AnnPosRelativeToInsert, small_set::SmallSetI32, Annotation, Counter,
14    InternalString, OpID,
15};
16use fxhash::{FxHashMap, FxHashSet};
17
18use super::{RangeMap, Span};
19
20type AnnIdx = i32;
21
22#[derive(Debug)]
23pub struct TreeRangeMap {
24    tree: BTree<TreeTrait>,
25    id_to_idx: FxHashMap<OpID, AnnIdx>,
26    idx_to_ann: Vec<Arc<Annotation>>,
27    expected_root_cache: Elem,
28}
29
30#[derive(Debug, PartialEq, Eq, Clone, Default)]
31pub struct AnchorSet {
32    pub(crate) start: FxHashSet<AnnIdx>,
33    /// this is inclusive end. The
34    pub(crate) end: FxHashSet<AnnIdx>,
35}
36
37impl AnchorSet {
38    pub fn union_(&mut self, other: &Self) {
39        if other.is_empty() {
40            return;
41        }
42
43        self.start.extend(other.start.iter());
44        self.end.extend(other.end.iter());
45    }
46
47    #[inline(always)]
48    pub fn is_empty(&self) -> bool {
49        self.start.is_empty() && self.end.is_empty()
50    }
51
52    pub fn difference(&self, old: &AnchorSet, output: &mut CacheDiff) {
53        for ann in self.start.difference(&old.start) {
54            output.start.insert(*ann);
55        }
56        for ann in self.end.difference(&old.end) {
57            output.end.insert(*ann);
58        }
59        for ann in old.start.difference(&self.start) {
60            output.start.insert(-*ann);
61        }
62        for ann in old.end.difference(&self.end) {
63            output.end.insert(-*ann);
64        }
65    }
66
67    pub fn apply_diff(&mut self, diff: &CacheDiff) {
68        for ann in diff.start.iter() {
69            if ann >= 0 {
70                self.start.insert(ann);
71            } else {
72                self.start.remove(&(-ann));
73            }
74        }
75        for ann in diff.end.iter() {
76            if ann >= 0 {
77                self.end.insert(ann);
78            } else {
79                self.end.remove(&(-ann));
80            }
81        }
82    }
83
84    pub const NEW_ELEM_THRESHOLD: i32 = i32::MAX / 2;
85
86    pub fn process_diff(&mut self, child: &AnchorSet) {
87        if child.is_empty() {
88            return;
89        }
90        // if the child has an element that is not in the parent, then it is a new element,
91        // it will have ann + Self::NEW_ELEM_THRESHOLD
92
93        // if the child has an element that is in the parent,
94        // we will mark it as -ann
95
96        // if the parent has an element that is not in the children,
97        // then it should be between 1~Self::NEW_ELEM_THRESHOLD
98        for &ann in child.start.iter() {
99            if self.start.contains(&ann) {
100                self.start.insert(-ann);
101            } else {
102                self.start.insert(ann + Self::NEW_ELEM_THRESHOLD);
103            }
104        }
105        for &ann in child.end.iter() {
106            if self.end.contains(&ann) {
107                self.end.insert(-ann);
108            } else {
109                self.end.insert(ann + Self::NEW_ELEM_THRESHOLD);
110            }
111        }
112    }
113
114    pub fn finish_diff_calc(&mut self) -> CacheDiff {
115        if self.is_empty() {
116            return Default::default();
117        }
118
119        // if the child has an element that is not in the parent, then it is a new element,
120        // it will have ann + Self::NEW_ELEM_THRESHOLD
121
122        // if the child has an element that is in the parent,
123        // we will mark it as -ann
124
125        // if the parent has an element that is not in the children,
126        // then it should be between 1~Self::NEW_ELEM_THRESHOLD
127        let mut ans = CacheDiff::default();
128        for ann in self.start.iter() {
129            if *ann > Self::NEW_ELEM_THRESHOLD {
130                // this is a new element
131                ans.start.insert(*ann - Self::NEW_ELEM_THRESHOLD);
132            } else if *ann > 0 && !self.start.contains(&-*ann) {
133                // this is a deleted element
134                ans.start.insert(-*ann);
135            }
136        }
137        for ann in ans.start.iter() {
138            if ann < 0 {
139                self.start.remove(&-ann);
140            } else {
141                self.start.insert(ann);
142            }
143        }
144        for ann in self.end.iter() {
145            if *ann > Self::NEW_ELEM_THRESHOLD {
146                // this is a new element
147                ans.end.insert(*ann - Self::NEW_ELEM_THRESHOLD);
148            } else if *ann > 0 && !self.end.contains(&-*ann) {
149                // this is a deleted element
150                ans.end.insert(-*ann);
151            }
152        }
153        for ann in ans.end.iter() {
154            if ann < 0 {
155                self.end.remove(&-ann);
156            } else {
157                self.end.insert(ann);
158            }
159        }
160
161        self.start
162            .retain(|x| *x > 0 && *x < Self::NEW_ELEM_THRESHOLD);
163        self.end.retain(|x| *x > 0 && *x < Self::NEW_ELEM_THRESHOLD);
164        ans
165    }
166
167    pub fn clear(&mut self) {
168        self.start.clear();
169        self.end.clear();
170    }
171}
172
173/// If a annotation is inside anchor set, it's either
174///
175/// - start at the 0 offset position
176/// - or end at the len offset position
177#[derive(Debug, PartialEq, Eq, Clone, Default)]
178struct Elem {
179    anchor_set: AnchorSet,
180    len: usize,
181}
182impl Elem {
183    fn new(len: usize) -> Elem {
184        Elem {
185            anchor_set: Default::default(),
186            len,
187        }
188    }
189
190    fn split_right(&mut self, offset: usize) -> Elem {
191        let ans = Elem {
192            anchor_set: AnchorSet {
193                start: Default::default(),
194                end: take(&mut self.anchor_set.end),
195            },
196            len: self.len - offset,
197        };
198        self.len = offset;
199        ans
200    }
201
202    fn apply_diff(&mut self, diff: &CacheDiff) {
203        self.anchor_set.apply_diff(diff);
204        self.len = (self.len as isize + diff.len_diff) as usize;
205    }
206}
207
208/// The diffing value between two caches.
209///
210/// It use negative [AnnIdx] to represent subtraction,
211/// positive [AnnIdx] to represent addition
212#[derive(Default, Debug)]
213pub struct CacheDiff {
214    pub start: SmallSetI32,
215    pub end: SmallSetI32,
216    pub len_diff: isize,
217}
218
219impl TreeRangeMap {
220    fn check(&self) {
221        if cfg!(debug_assertions) {
222            assert_eq!(&self.expected_root_cache, self.tree.root_cache());
223        }
224        // self.check_isolated_ann()
225    }
226
227    #[allow(unused)]
228    pub(crate) fn log_inner(&self) {
229        if cfg!(debug_assertions) {
230            let mut inner_spans = vec![];
231            let mut cache = FxHashSet::default();
232            let mut pending_deletion = FxHashSet::default();
233            for span in self.tree.iter() {
234                for ann in span.anchor_set.start.iter() {
235                    assert!(!cache.contains(ann));
236                    if !pending_deletion.contains(ann) {
237                        cache.insert(*ann);
238                    } else {
239                        // TODO: Log EMPTY SPAN
240                    }
241                }
242                for ann in span.anchor_set.end.iter() {
243                    if !cache.remove(ann) {
244                        pending_deletion.insert(*ann);
245                    }
246                }
247                let v: Vec<_> = cache
248                    .iter()
249                    .map(|x| self.idx_to_ann[*x as usize].clone())
250                    .collect();
251                inner_spans.push((v, span.len));
252            }
253
254            debug_log::debug_dbg!(inner_spans);
255        }
256    }
257
258    fn insert_elem<F>(&mut self, pos: usize, mut new_elem: Elem, mut f: F)
259    where
260        F: FnMut(&Annotation) -> super::AnnPosRelativeToInsert,
261    {
262        let neighbor_range = self
263            .tree
264            .range::<IndexFinder>(pos.saturating_sub(1)..(pos + 1).min(self.len()));
265        let mut spans = self
266            .tree
267            .iter_range(neighbor_range.clone())
268            .collect::<StackVec<_>>();
269        if !spans.is_empty() {
270            // pop redundant end if there are any
271            loop {
272                if spans.len() == 1 {
273                    break;
274                }
275
276                let last = spans.last().unwrap();
277                let len = last.elem.len;
278                if (last.end == Some(0) && len != 0)
279                    || (len == 0 && spans.len() >= 3)
280                    || get_slice_len(&spans[0]) == 2
281                {
282                    spans.pop();
283                } else {
284                    break;
285                }
286            }
287            loop {
288                if spans.len() == 1 {
289                    break;
290                }
291
292                let first = spans.first().unwrap();
293                let len = first.elem.len;
294                if (first.start == Some(first.elem.len) && len != 0)
295                    || (len == 0 && spans.len() >= 3)
296                    || get_slice_len(spans.last().unwrap()) == 2
297                {
298                    spans.drain(0..1);
299                } else {
300                    break;
301                }
302            }
303        }
304        debug_assert!(
305            spans
306                .iter()
307                .map(|x| { x.end.unwrap_or(x.elem.len) - x.start.unwrap_or(0) })
308                .sum::<usize>()
309                <= 2
310        );
311        if spans.is_empty() {
312            // empty tree, insert directly
313            drop(spans);
314            // TODO: Perf reuse the query
315            self.tree.insert::<IndexFinder>(&pos, new_elem);
316            debug_log::group_end!();
317            return;
318        } else if spans.len() == 1 {
319            // single span, so we know what the annotations of new insertion
320            // insert directly
321            drop(spans);
322            // TODO: Perf reuse the query
323            let result = self.tree.query::<IndexFinder>(&pos);
324            self.tree.insert_by_query_result(result, new_elem);
325            debug_log::group_end!();
326            return;
327        }
328        let mut middles = StackVec::new();
329        let mut left = None;
330        let mut right = None;
331        if spans[0].elem.len == 0 {
332            for span in spans.iter() {
333                if span.elem.len == 0 {
334                    middles.push(span);
335                } else {
336                    assert!(right.is_none());
337                    right = Some(span);
338                }
339            }
340        } else {
341            for span in spans.iter() {
342                if left.is_none() {
343                    left = Some(span);
344                } else if span.elem.len == 0 {
345                    middles.push(span);
346                } else {
347                    assert!(right.is_none());
348                    right = Some(span);
349                }
350            }
351        }
352
353        let mut next_anchor_set = AnchorSet::default();
354        if new_elem.len == 0 && !middles.is_empty() {
355            let trim_start = spans[0].elem.len != 0;
356            drop(middles);
357            drop(spans);
358            self.set_middle_empty_spans_annotations(
359                neighbor_range,
360                new_elem.anchor_set,
361                trim_start,
362            );
363            return;
364        }
365        let mut middle_annotations = AnchorSet::default();
366        let mut use_next = false;
367        for middle in middles.iter() {
368            for &ann in middle.elem.anchor_set.start.iter() {
369                match f(self.idx_to_ann(ann)) {
370                    AnnPosRelativeToInsert::Before => {
371                        middle_annotations.start.insert(ann);
372                    }
373                    AnnPosRelativeToInsert::After => {
374                        use_next = true;
375                        next_anchor_set.start.insert(ann);
376                    }
377                    AnnPosRelativeToInsert::IncludeInsert => {
378                        middle_annotations.start.insert(ann);
379                    }
380                }
381            }
382            for &ann in middle.elem.anchor_set.end.iter() {
383                match f(self.idx_to_ann(ann)) {
384                    AnnPosRelativeToInsert::Before => {
385                        middle_annotations.end.insert(ann);
386                    }
387                    AnnPosRelativeToInsert::After => {
388                        new_elem.anchor_set.end.insert(ann);
389                    }
390                    AnnPosRelativeToInsert::IncludeInsert => {
391                        new_elem.anchor_set.end.insert(ann);
392                    }
393                }
394            }
395        }
396
397        let use_next = use_next;
398        let mut new_end_set = Vec::new();
399        if let Some(left) = left {
400            for &ann in left.elem.anchor_set.end.iter() {
401                match f(self.idx_to_ann(ann)) {
402                    AnnPosRelativeToInsert::Before => {}
403                    AnnPosRelativeToInsert::After => {
404                        new_end_set.push(ann);
405                    }
406                    AnnPosRelativeToInsert::IncludeInsert => {
407                        new_end_set.push(ann);
408                    }
409                }
410            }
411        }
412        let mut new_start_set = Vec::new();
413        if let Some(right) = right {
414            for &ann in right.elem.anchor_set.start.iter() {
415                match f(self.idx_to_ann(ann)) {
416                    AnnPosRelativeToInsert::Before => {
417                        new_start_set.push(ann);
418                    }
419                    AnnPosRelativeToInsert::After => {}
420                    AnnPosRelativeToInsert::IncludeInsert => {
421                        new_start_set.push(ann);
422                    }
423                }
424            }
425        }
426        let right_path = right.map(|x| *x.path());
427        let left_path = left.map(|x| *x.path());
428        let path = right
429            .map(|x| *x.path())
430            .unwrap_or_else(|| *middles.last().unwrap().path());
431        let middle_len = middles.len();
432        if middles.last().is_some() {
433            let trim_start = spans[0].elem.len != 0;
434            drop(middles);
435            drop(spans);
436            self.set_middle_empty_spans_annotations(neighbor_range, middle_annotations, trim_start);
437        } else {
438            drop(middles);
439            drop(spans);
440        }
441
442        for ann in new_start_set {
443            let right_path = &right_path.as_ref().unwrap();
444            self.tree
445                .get_elem_mut(right_path)
446                .unwrap()
447                .anchor_set
448                .start
449                .remove(&ann);
450            self.tree
451                .recursive_update_cache(right_path.leaf, true, None);
452            new_elem.anchor_set.start.insert(ann);
453        }
454        for ann in new_end_set {
455            let left_path = &left_path.as_ref().unwrap();
456            self.tree
457                .get_elem_mut(left_path)
458                .unwrap()
459                .anchor_set
460                .end
461                .remove(&ann);
462            self.tree.recursive_update_cache(left_path.leaf, true, None);
463            new_elem.anchor_set.end.insert(ann);
464        }
465        if use_next {
466            self.tree.insert_many_by_query_result(
467                &path,
468                [
469                    new_elem,
470                    Elem {
471                        anchor_set: next_anchor_set,
472                        len: 0,
473                    },
474                ],
475            );
476        } else {
477            self.tree.insert_by_query_result(path, new_elem);
478        }
479        if middle_len > 1 {
480            self.purge_redundant_empty_spans(pos)
481        }
482    }
483
484    fn purge_redundant_empty_spans(&mut self, _start_from: usize) {
485        // TODO: purge
486        // self.tree
487        //     .update(&neighbor_range.start..&neighbor_range.end, &mut |slice| {
488        //         let mut start = slice.start.unwrap_or((0, 0));
489        //         let mut end = slice.end.unwrap_or((slice.elements.len() - 1, 0));
490        //         start.0 = start.0.min(slice.elements.len() - 1);
491        //         end.0 = end.0.min(slice.elements.len() - 1);
492        //         if slice.elements[start.0..=end.0]
493        //             .iter()
494        //             .any(|x| x.len == 0 && x.anchor_set.is_empty())
495        //         {
496        //             slice
497        //                 .elements
498        //                 .retain(|x| x.len != 0 || !x.anchor_set.is_empty());
499        //             true
500        //         } else {
501        //             false
502        //         }
503        //     });
504    }
505
506    /// Set the annotations of the middle empty spans. This method will only keep one empty span
507    ///
508    /// - Need to skip the first few non empty spans, (if skip_start_empty_spans=true)
509    /// - Annotate all the continuous empty spans after the first non empty spans
510    /// - Stop when meet the first non empty span after the continuous empty spans
511    fn set_middle_empty_spans_annotations(
512        &mut self,
513        neighbor_range: Range<QueryResult>,
514        middle_anchor_set: AnchorSet,
515        skip_start_empty_spans: bool,
516    ) {
517        let mut meet_non_empty_span = !skip_start_empty_spans;
518        let mut visited_zero_span = false;
519        let mut done = false;
520        self.tree
521            .update(&neighbor_range.start..&neighbor_range.end, &mut |slice| {
522                if done {
523                    return (false, None);
524                }
525
526                let start = slice.start.unwrap_or((0, 0));
527                let end = slice.end.unwrap_or((slice.elements.len(), 0));
528                let mut updated = false;
529                for index in start.0..=end.0 {
530                    if slice.elements.len() <= index {
531                        break;
532                    }
533
534                    // skip the first empty spans
535                    if slice.elements[index].len == 0 {
536                        if !meet_non_empty_span {
537                            continue;
538                        }
539                    } else {
540                        meet_non_empty_span = true;
541                    }
542
543                    if visited_zero_span && slice.elements[index].len != 0 {
544                        // it's the end of the continuous empty spans, terminate here
545                        done = true;
546                        break;
547                    }
548
549                    if slice.elements[index].len == 0 {
550                        if visited_zero_span {
551                            if !slice.elements[index].anchor_set.is_empty() {
552                                updated = true;
553                                slice.elements[index].anchor_set.clear();
554                            }
555                        } else if slice.elements[index].anchor_set != middle_anchor_set {
556                            updated = true;
557                            slice.elements[index].anchor_set = middle_anchor_set.clone();
558                        }
559                        visited_zero_span = true;
560                    }
561                }
562
563                (updated, None)
564            });
565        assert!(visited_zero_span);
566    }
567
568    pub(crate) fn get_all_alive_ann(&self) -> BTreeSet<Arc<Annotation>> {
569        self.tree
570            .root_cache()
571            .anchor_set
572            .start
573            .iter()
574            .map(|x| self.idx_to_ann[*x as usize].clone())
575            .collect()
576    }
577
578    fn set_anchor_set(&mut self, pos: usize, anchor_set: AnchorSet) {
579        if anchor_set.is_empty() {
580            return;
581        }
582
583        let path = self.tree.query::<IndexFinder>(&pos);
584        self.tree.update_leaf(path.leaf, |elements| {
585            (set_anchor_set(anchor_set, path, elements), None)
586        })
587    }
588}
589
590fn set_anchor_set(anchor_set: AnchorSet, path: QueryResult, elements: &mut Vec<Elem>) -> bool {
591    let mut elem_index = path.elem_index;
592    let mut offset = path.offset;
593    if !anchor_set.start.is_empty() {
594        if elem_index < elements.len() && elements[elem_index].len == offset {
595            elem_index += 1;
596            offset = 0;
597        }
598        if elem_index >= elements.len() {
599            let mut new_anchor_set = AnchorSet::default();
600            for &idx in anchor_set.start.iter() {
601                new_anchor_set.start.insert(idx);
602            }
603            elements.push(Elem {
604                anchor_set: new_anchor_set,
605                len: 0,
606            });
607            elem_index = elements.len() - 1;
608            offset = 0;
609        } else if offset == 0 {
610            for &idx in anchor_set.start.iter() {
611                elements[elem_index].anchor_set.start.insert(idx);
612            }
613        } else {
614            let mut new_elem = elements[elem_index].split_right(offset);
615            for &idx in anchor_set.start.iter() {
616                new_elem.anchor_set.start.insert(idx);
617            }
618            elements.insert(elem_index + 1, new_elem);
619            elem_index += 1;
620            offset = 0;
621        }
622    }
623    if !anchor_set.end.is_empty() {
624        if offset == 0 && elem_index > 0 {
625            elem_index -= 1;
626            offset = elements[elem_index].len;
627        }
628        if elem_index == 0 && offset == 0 {
629            if !elements.is_empty() && elements[0].len == 0 {
630                for &idx in anchor_set.end.iter() {
631                    elements[0].anchor_set.end.insert(idx);
632                }
633            } else {
634                let mut new_anchor_set = AnchorSet::default();
635                for &idx in anchor_set.end.iter() {
636                    new_anchor_set.end.insert(idx);
637                }
638                elements.insert(
639                    0,
640                    Elem {
641                        anchor_set: new_anchor_set,
642                        len: 0,
643                    },
644                );
645            }
646        } else if offset == elements[elem_index].len {
647            for &idx in anchor_set.end.iter() {
648                elements[elem_index].anchor_set.end.insert(idx);
649            }
650        } else {
651            let new_elem = elements[elem_index].split_right(offset);
652            for &idx in anchor_set.end.iter() {
653                elements[elem_index].anchor_set.end.insert(idx);
654            }
655            elements.insert(elem_index + 1, new_elem);
656        }
657    }
658
659    true
660}
661
662fn set_end(elements: &mut Vec<Elem>, mut elem_index: usize, mut offset: usize, idx: i32) -> bool {
663    if offset == 0 && elem_index > 0 {
664        elem_index -= 1;
665        offset = elements[elem_index].len;
666    }
667    if elem_index == 0 && offset == 0 {
668        let mut anchor_set = AnchorSet::default();
669        anchor_set.end.insert(idx);
670        elements.insert(0, Elem { anchor_set, len: 0 });
671    } else if offset == elements[elem_index].len {
672        elements[elem_index].anchor_set.end.insert(idx);
673    } else {
674        assert!(offset < elements[elem_index].len);
675        let new_elem = elements[elem_index].split_right(offset);
676        elements[elem_index].anchor_set.end.insert(idx);
677        elements.insert(elem_index + 1, new_elem);
678    }
679
680    true
681}
682
683fn set_start(elements: &mut Vec<Elem>, mut elem_index: usize, mut offset: usize, idx: i32) -> bool {
684    if elem_index < elements.len() && elements[elem_index].len == offset {
685        elem_index += 1;
686        offset = 0;
687    }
688    if elem_index >= elements.len() {
689        let mut anchor_set = AnchorSet::default();
690        anchor_set.start.insert(idx);
691        elements.push(Elem { anchor_set, len: 0 });
692    } else if offset == 0 {
693        elements[elem_index].anchor_set.start.insert(idx);
694    } else {
695        let mut new_elem = elements[elem_index].split_right(offset);
696        new_elem.anchor_set.start.insert(idx);
697        elements.insert(elem_index + 1, new_elem);
698    }
699
700    true
701}
702
703impl TreeRangeMap {
704    pub fn new() -> Self {
705        let placeholder: Annotation = Annotation {
706            id: OpID::new(u64::MAX, Counter::MAX),
707            range_lamport: (88, OpID::new(888, 888)),
708            range: crate::AnchorRange {
709                start: crate::Anchor {
710                    id: None,
711                    type_: crate::AnchorType::After,
712                },
713                end: crate::Anchor {
714                    id: None,
715                    type_: crate::AnchorType::After,
716                },
717            },
718            behavior: crate::Behavior::Delete,
719            type_: InternalString::from(""),
720            meta: None,
721        };
722        // Need to make 0 idx unavailable, so insert a placeholder to take the 0 idx.
723        let idx_to_ann = vec![Arc::new(placeholder)];
724
725        Self {
726            tree: BTree::new(),
727            id_to_idx: FxHashMap::default(),
728            idx_to_ann,
729            expected_root_cache: Default::default(),
730        }
731    }
732
733    fn try_add_ann(&mut self, ann: Arc<Annotation>) -> AnnIdx {
734        let id = ann.id;
735        if let Some(idx) = self.id_to_idx.get(&id) {
736            *idx
737        } else {
738            let idx = self.idx_to_ann.len() as AnnIdx;
739            self.id_to_idx.insert(id, idx);
740            self.idx_to_ann.push(ann);
741            self.expected_root_cache.anchor_set.start.insert(idx);
742            self.expected_root_cache.anchor_set.end.insert(idx);
743            idx
744        }
745    }
746
747    #[inline(always)]
748    fn get_ann_idx(&self, id: OpID) -> Option<AnnIdx> {
749        self.id_to_idx.get(&id).copied()
750    }
751
752    fn get_annotation_range(
753        &self,
754        id: OpID,
755    ) -> Option<(RangeInclusive<QueryResult>, Range<usize>)> {
756        let index = self.get_ann_idx(id)?;
757        let (start, start_finder) = self
758            .tree
759            .query_with_finder_return::<AnnotationFinderStart>(&(index));
760        let (end, end_finder) = self
761            .tree
762            .query_with_finder_return::<AnnotationFinderEnd>(&(index));
763
764        if !start.found {
765            None
766        } else {
767            assert!(end.found);
768            let start_index = start_finder.visited_len;
769            let end_index = self.tree.root_cache().len - end_finder.visited_len;
770            Some((start..=end, start_index..end_index))
771        }
772    }
773
774    fn idx_to_ann(&self, ann_bit_index: AnnIdx) -> &Arc<Annotation> {
775        let annotation = self.idx_to_ann.get(ann_bit_index as usize).unwrap();
776        annotation
777    }
778
779    fn insert_ann_range(&mut self, range: Range<&QueryResult>, idx: AnnIdx) {
780        let start = range.start;
781        let end = range.end;
782        self.tree
783            .update2_leaf(start.leaf, range.end.leaf, |elements, target| {
784                let shared_target = target.is_none();
785                if shared_target {
786                    // start and end are at the same leaf
787                    assert!(
788                        end.elem_index > start.elem_index
789                            || (end.elem_index == start.elem_index && end.offset >= start.offset)
790                    );
791
792                    // Assumption: set_end won't affect start path
793                    let a = set_end(elements, end.elem_index, end.offset, idx);
794                    let b = set_start(elements, start.elem_index, start.offset, idx);
795                    a || b
796                } else if target.unwrap() == start.leaf {
797                    // set start
798                    set_start(elements, start.elem_index, start.offset, idx)
799                } else {
800                    // set end
801                    set_end(elements, end.elem_index, end.offset, idx)
802                }
803            })
804    }
805
806    fn id_to_ann(&self, id: OpID) -> Option<&Arc<Annotation>> {
807        let index = self.get_ann_idx(id)?;
808        self.idx_to_ann.get(index as usize)
809    }
810
811    fn id_to_ann_mut(&mut self, id: OpID) -> Option<&mut Arc<Annotation>> {
812        let index = self.get_ann_idx(id)?;
813        self.idx_to_ann.get_mut(index as usize)
814    }
815
816    fn insert_or_delete_ann(&mut self, range: Range<&QueryResult>, index: AnnIdx, is_insert: bool) {
817        if is_insert {
818            self.insert_ann_range(range, index);
819        } else {
820            self.tree.update2_leaf(
821                range.start.leaf,
822                range.end.leaf,
823                |elements: &mut Vec<Elem>, target| match target {
824                    Some(target) => {
825                        if target == range.start.leaf {
826                            let e = &mut elements[range.start.elem_index];
827                            assert!(e.anchor_set.start.remove(&index));
828                            true
829                        } else {
830                            let e = &mut elements[range.end.elem_index];
831                            assert!(e.anchor_set.end.remove(&index));
832                            true
833                        }
834                    }
835                    None => {
836                        let e = &mut elements[range.start.elem_index];
837                        assert!(e.anchor_set.start.remove(&index));
838                        let e = &mut elements[range.end.elem_index];
839                        assert!(e.anchor_set.end.remove(&index));
840                        true
841                    }
842                },
843            );
844        }
845    }
846}
847
848impl Default for TreeRangeMap {
849    fn default() -> Self {
850        Self::new()
851    }
852}
853
854impl HasLength for Elem {
855    fn rle_len(&self) -> usize {
856        self.len
857    }
858}
859
860impl Sliceable for Elem {
861    fn slice(&self, range: impl std::ops::RangeBounds<usize>) -> Self {
862        let start = match range.start_bound() {
863            std::ops::Bound::Included(x) => *x,
864            std::ops::Bound::Excluded(x) => *x + 1,
865            std::ops::Bound::Unbounded => 0,
866        };
867        let end = match range.end_bound() {
868            std::ops::Bound::Included(x) => *x + 1,
869            std::ops::Bound::Excluded(x) => *x,
870            std::ops::Bound::Unbounded => self.len,
871        };
872        let len = end - start;
873        Self {
874            anchor_set: AnchorSet {
875                start: if start == 0 {
876                    self.anchor_set.start.clone()
877                } else {
878                    Default::default()
879                },
880                end: if end == self.len {
881                    self.anchor_set.end.clone()
882                } else {
883                    Default::default()
884                },
885            },
886            len,
887        }
888    }
889
890    fn slice_(&mut self, range: impl std::ops::RangeBounds<usize>)
891    where
892        Self: Sized,
893    {
894        let start = match range.start_bound() {
895            std::ops::Bound::Included(x) => *x,
896            std::ops::Bound::Excluded(x) => *x + 1,
897            std::ops::Bound::Unbounded => 0,
898        };
899        let end = match range.end_bound() {
900            std::ops::Bound::Included(x) => *x + 1,
901            std::ops::Bound::Excluded(x) => *x,
902            std::ops::Bound::Unbounded => self.len,
903        };
904        let len = end - start;
905        if start != 0 {
906            self.anchor_set.start.clear();
907        }
908        if end != self.len {
909            self.anchor_set.end.clear();
910        }
911        self.len = len;
912    }
913}
914
915impl Mergeable for Elem {
916    fn can_merge(&self, rhs: &Self) -> bool {
917        (self.len == 0 && rhs.len == 0)
918            || (self.anchor_set.end.is_empty() && rhs.anchor_set.start.is_empty())
919    }
920
921    fn merge_right(&mut self, rhs: &Self) {
922        debug_assert!(self.can_merge(rhs));
923        self.len += rhs.len;
924        if self.len == 0 {
925            self.anchor_set.start.extend(rhs.anchor_set.start.iter());
926            self.anchor_set.end.extend(rhs.anchor_set.end.iter());
927        } else {
928            self.anchor_set.end = rhs.anchor_set.end.clone();
929        }
930    }
931
932    fn merge_left(&mut self, left: &Self) {
933        debug_assert!(left.can_merge(self));
934        self.len += left.len;
935        if self.len == 0 {
936            self.anchor_set.start.extend(left.anchor_set.start.iter());
937            self.anchor_set.end.extend(left.anchor_set.end.iter());
938        } else {
939            self.anchor_set.start = left.anchor_set.start.clone();
940        }
941    }
942}
943
944impl RangeMap for TreeRangeMap {
945    #[inline(always)]
946    fn init() -> Self {
947        Self::new()
948    }
949
950    // TODO: refactor: split this method
951    fn insert<F>(&mut self, pos: usize, len: usize, f: F)
952    where
953        F: FnMut(&Annotation) -> super::AnnPosRelativeToInsert,
954    {
955        debug_log::group!("TreeImpl Insert");
956        self.check();
957        self.expected_root_cache.len += len;
958        let new_elem = Elem::new(len);
959
960        self.insert_elem(pos, new_elem, f);
961
962        self.check();
963        debug_log::group_end!();
964    }
965
966    fn delete(&mut self, pos: usize, len: usize) {
967        self.check();
968        self.expected_root_cache.len -= len;
969        assert!(pos + len <= self.len());
970        let mut anchor_set = AnchorSet::default();
971
972        for span in self.tree.drain::<IndexFinder>(pos..pos + len) {
973            anchor_set.union_(&span.anchor_set);
974        }
975
976        if !anchor_set.is_empty() {
977            self.set_anchor_set(pos, anchor_set);
978        }
979
980        self.check();
981    }
982
983    fn annotate(&mut self, pos: usize, len: usize, annotation: Annotation) {
984        self.check();
985        let range = self.tree.range::<IndexFinder>(pos..pos + len);
986        let ann = Arc::new(annotation);
987        let idx = self.try_add_ann(ann);
988        self.insert_ann_range(&range.start..&range.end, idx);
989        self.check();
990    }
991
992    fn adjust_annotation(
993        &mut self,
994        target_id: OpID,
995        lamport: crate::Lamport,
996        patch_id: OpID,
997        start_shift: Option<(isize, Option<OpID>)>,
998        end_shift: Option<(isize, Option<OpID>)>,
999    ) {
1000        self.check();
1001        debug_log::group!("AdjustAnnotation {:?}", target_id);
1002        if let Some(ann) = self.id_to_ann(target_id) {
1003            // skip update if the current lamport is larger
1004            if ann.range_lamport > (lamport, patch_id) {
1005                return;
1006            }
1007            ann
1008        } else {
1009            return;
1010        };
1011        let idx = self.get_ann_idx(target_id).unwrap();
1012        let Some(( range, index_range )) = self.get_annotation_range(target_id) else { return };
1013        let (start, end) = range.into_inner();
1014        self.insert_or_delete_ann(&start..&end, idx, false);
1015
1016        let new_start = if let Some((index_shift, _)) = start_shift {
1017            (index_range.start as isize + index_shift) as usize
1018        } else {
1019            index_range.start
1020        };
1021        let new_end = if let Some((index_shift, _)) = end_shift {
1022            (index_range.end as isize + index_shift) as usize
1023        } else {
1024            index_range.end
1025        };
1026
1027        self.log_inner();
1028        assert!(self.get_annotation_range(target_id).is_none());
1029        debug_log::debug_log!("Insert new range");
1030        let new_range = self.tree.range::<IndexFinder>(new_start..new_end);
1031        self.insert_or_delete_ann(&new_range.start..&new_range.end, idx, true);
1032        self.log_inner();
1033
1034        // update annotation's anchors
1035        // TODO: Perf remove Arc requirement on RangeMap
1036        let ann = self.id_to_ann_mut(target_id).unwrap();
1037        let mut new_ann = (**ann).clone();
1038        new_ann.range_lamport = (lamport, patch_id);
1039        if let Some((_, start)) = start_shift {
1040            new_ann.range.start.id = start;
1041        }
1042        if let Some((_, end)) = end_shift {
1043            new_ann.range.end.id = end;
1044        }
1045
1046        *ann = Arc::new(new_ann);
1047        self.check();
1048        debug_log::group_end!();
1049    }
1050
1051    fn delete_annotation(&mut self, id: OpID) {
1052        self.check();
1053        self.expected_root_cache
1054            .anchor_set
1055            .start
1056            .remove(self.id_to_idx.get(&id).unwrap());
1057        self.expected_root_cache
1058            .anchor_set
1059            .end
1060            .remove(self.id_to_idx.get(&id).unwrap());
1061
1062        let index = self.get_ann_idx(id).unwrap();
1063        let (range, _) = self.get_annotation_range(id).unwrap();
1064        self.insert_or_delete_ann(range.start()..range.end(), index, false);
1065        self.check();
1066    }
1067
1068    fn get_annotations(&mut self, mut pos: usize, mut len: usize) -> Vec<super::Span> {
1069        self.check();
1070        pos = pos.min(self.len());
1071        len = len.min(self.len() - pos);
1072        let (result, finder) = self
1073            .tree
1074            .query_with_finder_return::<IndexFinderWithStyles>(&pos);
1075        let mut styles = finder.started_styles;
1076        let mut to_delete = FxHashSet::default();
1077        let old_to_delete = finder.pending_delete;
1078        for style in old_to_delete {
1079            if !styles.remove(&style) {
1080                to_delete.insert(style);
1081            }
1082        }
1083        let end = self.tree.query::<IndexFinder>(&(pos + len));
1084        let mut ans = Vec::new();
1085
1086        for elem in self.tree.iter_range(result..end) {
1087            let mut empty_span_annotations = FxHashSet::default();
1088            for ann in elem.elem.anchor_set.start.iter() {
1089                if !to_delete.contains(ann) {
1090                    styles.insert(*ann);
1091                } else {
1092                    empty_span_annotations.insert(*ann);
1093                }
1094            }
1095            if !empty_span_annotations.is_empty() {
1096                let annotations = empty_span_annotations
1097                    .union(&styles)
1098                    .map(|x| self.idx_to_ann[*x as usize].clone())
1099                    .collect();
1100                push_to_mergeable_vec_end(
1101                    &mut ans,
1102                    Span {
1103                        annotations,
1104                        len: 0,
1105                    },
1106                );
1107            }
1108            let annotations = styles
1109                .iter()
1110                .map(|x| self.idx_to_ann[*x as usize].clone())
1111                .collect();
1112            let start = elem.start.unwrap_or(0);
1113            let end = elem.end.unwrap_or(elem.elem.len);
1114            let len = end - start;
1115            push_to_mergeable_vec_end(&mut ans, Span { annotations, len });
1116            for ann in elem.elem.anchor_set.end.iter() {
1117                if !styles.remove(ann) {
1118                    to_delete.insert(*ann);
1119                }
1120            }
1121        }
1122        self.check();
1123        ans
1124    }
1125
1126    fn get_annotation_pos(&self, id: OpID) -> Option<(Arc<Annotation>, std::ops::Range<usize>)> {
1127        // use annotation finder to delete
1128        let (_, index_range) = self.get_annotation_range(id)?;
1129        let ann = self.id_to_ann(id).unwrap();
1130        Some((ann.clone(), index_range.start..index_range.end))
1131    }
1132
1133    #[inline(always)]
1134    fn len(&self) -> usize {
1135        self.tree.root_cache().len
1136    }
1137}
1138
1139fn get_slice_len(slice: &ElemSlice<Elem>) -> usize {
1140    let start = slice.start.unwrap_or(0);
1141    let end = slice.end.unwrap_or(slice.elem.len);
1142    end - start
1143}
1144
1145#[derive(Debug)]
1146struct TreeTrait;
1147
1148impl BTreeTrait for TreeTrait {
1149    type Elem = Elem;
1150    type Cache = Elem;
1151
1152    const MAX_LEN: usize = 8;
1153
1154    fn calc_cache_internal(
1155        cache: &mut Self::Cache,
1156        caches: &[generic_btree::Child<Self>],
1157        diff: Option<CacheDiff>,
1158    ) -> Option<CacheDiff> {
1159        match diff {
1160            Some(diff) => {
1161                cache.apply_diff(&diff);
1162                Some(diff)
1163            }
1164            None => {
1165                cache.len = 0;
1166                cache.anchor_set.clear();
1167                for child in caches.iter() {
1168                    cache.len += child.cache.len;
1169                    cache.anchor_set.union_(&child.cache.anchor_set);
1170                }
1171                None
1172            }
1173        }
1174    }
1175
1176    fn calc_cache_leaf(
1177        cache: &mut Self::Cache,
1178        caches: &[Self::Elem],
1179        _diff: Option<Self::CacheDiff>,
1180    ) -> CacheDiff {
1181        let mut len = 0;
1182        for child in caches.iter() {
1183            len += child.len;
1184            cache.anchor_set.process_diff(&child.anchor_set);
1185        }
1186
1187        let mut diff = cache.anchor_set.finish_diff_calc();
1188        diff.len_diff = len as isize - cache.len as isize;
1189        cache.len = len;
1190        diff
1191    }
1192
1193    fn insert(
1194        elements: &mut HeapVec<Self::Elem>,
1195        mut index: usize,
1196        mut offset: usize,
1197        mut elem: Self::Elem,
1198    ) {
1199        while index < elements.len() && elements[index].len == 0 {
1200            // always inserting after zero-len element.
1201            // because this is the behavior depended by RangeMap::insert impl
1202            offset = 0;
1203            index += 1;
1204        }
1205
1206        let index = index;
1207        let offset = offset;
1208        if elements.is_empty() {
1209            elements.push(elem);
1210            return;
1211        }
1212
1213        if index == elements.len() {
1214            debug_assert_eq!(offset, 0);
1215            let last = elements.last_mut().unwrap();
1216            if last.can_merge(&elem) {
1217                last.merge_right(&elem);
1218            } else {
1219                elements.push(elem);
1220            }
1221
1222            return;
1223        }
1224
1225        if elements[index].anchor_set.is_empty() && elem.anchor_set.is_empty() {
1226            elements[index].len += elem.len;
1227        } else if offset == 0 {
1228            let target = elements.get_mut(index).unwrap();
1229            if elem.can_merge(target) {
1230                target.merge_left(&elem);
1231            } else {
1232                elements.insert(index, elem);
1233            }
1234        } else if offset == elements[index].rle_len() {
1235            let target = elements.get_mut(index).unwrap();
1236            if target.can_merge(&elem) {
1237                target.merge_right(&elem);
1238            } else {
1239                elements.insert(index + 1, elem);
1240            }
1241        } else {
1242            let right = elements[index].slice(offset..);
1243            elements[index].slice_(..offset);
1244            let left = elements.get_mut(index).unwrap();
1245            if left.can_merge(&elem) {
1246                left.merge_right(&elem);
1247                if left.can_merge(&right) {
1248                    left.merge_right(&right);
1249                } else {
1250                    elements.insert(index + 1, right);
1251                }
1252            } else if elem.can_merge(&right) {
1253                elem.merge_right(&right);
1254                elements.insert(index + 1, elem);
1255            } else {
1256                elements.splice(index + 1..index + 1, [elem, right]);
1257            }
1258        }
1259    }
1260
1261    fn insert_batch(
1262        elements: &mut HeapVec<Self::Elem>,
1263        mut index: usize,
1264        mut offset: usize,
1265        new_elements: impl IntoIterator<Item = Self::Elem>,
1266    ) where
1267        Self::Elem: Clone,
1268    {
1269        while index < elements.len() && elements[index].len == 0 {
1270            // always inserting after zero-len element.
1271            // because this is the behavior depended by RangeMap::insert impl
1272            offset = 0;
1273            index += 1;
1274        }
1275
1276        if elements.is_empty() {
1277            elements.splice(0..0, new_elements);
1278            return;
1279        }
1280
1281        // TODO: try merging
1282        if offset == 0 {
1283            elements.splice(index..index, new_elements);
1284        } else if offset == elements[index].rle_len() {
1285            elements.splice(index + 1..index + 1, new_elements);
1286        } else {
1287            let right = elements[index].slice(offset..);
1288            elements[index].slice_(..offset);
1289            elements.splice(
1290                index..index,
1291                new_elements.into_iter().chain(Some(right).into_iter()),
1292            );
1293        }
1294    }
1295
1296    type CacheDiff = CacheDiff;
1297
1298    fn merge_cache_diff(diff1: &mut Self::CacheDiff, diff2: &Self::CacheDiff) {
1299        for ann in diff2.start.iter() {
1300            if diff1.start.contains(-ann) {
1301                diff1.start.remove(-ann);
1302            } else {
1303                diff1.start.insert(ann);
1304            }
1305        }
1306        for ann in diff2.end.iter() {
1307            if diff1.end.contains(-ann) {
1308                diff1.end.remove(-ann);
1309            } else {
1310                diff1.end.insert(ann);
1311            }
1312        }
1313    }
1314}
1315
1316fn push_to_mergeable_vec_end<T: Mergeable>(vec: &mut Vec<T>, elem: T) {
1317    if let Some(last) = vec.last_mut() {
1318        if last.can_merge(&elem) {
1319            last.merge_right(&elem);
1320            return;
1321        }
1322    }
1323    vec.push(elem);
1324}
1325
1326struct IndexFinder {
1327    left: usize,
1328}
1329
1330impl Query<TreeTrait> for IndexFinder {
1331    type QueryArg = usize;
1332
1333    fn init(target: &Self::QueryArg) -> Self {
1334        IndexFinder { left: *target }
1335    }
1336
1337    /// should prefer zero len element
1338    fn find_node(
1339        &mut self,
1340        _: &Self::QueryArg,
1341        child_caches: &[generic_btree::Child<TreeTrait>],
1342    ) -> generic_btree::FindResult {
1343        if child_caches.is_empty() {
1344            return FindResult::new_missing(0, self.left);
1345        }
1346
1347        let mut last_left = self.left;
1348        for (i, cache) in child_caches.iter().enumerate() {
1349            if cache.cache.len == 0 && self.left == 0 {
1350                return FindResult::new_found(i, self.left);
1351            }
1352
1353            if self.left >= cache.cache.len {
1354                last_left = self.left;
1355                self.left -= cache.cache.len;
1356            } else {
1357                return FindResult::new_found(i, self.left);
1358            }
1359        }
1360
1361        self.left = last_left;
1362        FindResult::new_missing(child_caches.len() - 1, last_left)
1363    }
1364
1365    /// should prefer zero len element
1366    fn find_element(&mut self, _: &Self::QueryArg, elements: &[Elem]) -> generic_btree::FindResult {
1367        if elements.is_empty() {
1368            return FindResult::new_missing(0, self.left);
1369        }
1370
1371        let mut last_left = self.left;
1372        for (i, cache) in elements.iter().enumerate() {
1373            if cache.len == 0 && self.left == 0 {
1374                return FindResult::new_found(i, self.left);
1375            }
1376
1377            if self.left >= cache.len {
1378                last_left = self.left;
1379                self.left -= cache.len;
1380            } else {
1381                return FindResult::new_found(i, self.left);
1382            }
1383        }
1384
1385        self.left = last_left;
1386        FindResult::new_missing(elements.len() - 1, last_left)
1387    }
1388
1389    fn delete(
1390        _: &mut HeapVec<<TreeTrait as BTreeTrait>::Elem>,
1391        _: &Self::QueryArg,
1392        _: usize,
1393        _: usize,
1394    ) -> Option<<TreeTrait as BTreeTrait>::Elem> {
1395        unimplemented!("Not supported")
1396    }
1397
1398    /// If start or end is zero len element, we should drain it.
1399    ///
1400    /// Because IndexFinder scan from left to right and return when left length is zero,
1401    /// the start is guarantee to include the zero len element.
1402    ///
1403    /// The returned annotation set is not accurate on end points, to make the algorithm simpler
1404    fn drain_range<'a>(
1405        elements: &'a mut HeapVec<<TreeTrait as BTreeTrait>::Elem>,
1406        _: &'_ Self::QueryArg,
1407        _: &'_ Self::QueryArg,
1408        start: Option<generic_btree::QueryResult>,
1409        end: Option<generic_btree::QueryResult>,
1410    ) -> Box<dyn Iterator<Item = Elem> + 'a> {
1411        fn drain_start(start: QueryResult, elements: &mut [Elem]) -> usize {
1412            if start.offset == 0 || start.elem_index >= elements.len() {
1413                start.elem_index
1414            } else if start.offset == elements[start.elem_index].len {
1415                start.elem_index + 1
1416            } else {
1417                elements[start.elem_index].len = start.offset;
1418                start.elem_index + 1
1419            }
1420        }
1421
1422        fn drain_end(end: QueryResult, elements: &mut [Elem]) -> usize {
1423            let end_index = if end.elem_index >= elements.len() {
1424                end.elem_index
1425            } else if elements[end.elem_index].len == end.offset {
1426                end.elem_index + 1
1427            } else if end.offset == 0 {
1428                end.elem_index
1429            } else {
1430                elements[end.elem_index].len -= end.offset;
1431                end.elem_index
1432            };
1433
1434            // if end is zero len element, we should drain it
1435            if let Some(end) = elements.get(end_index) {
1436                if end.len == 0 {
1437                    end_index + 1
1438                } else {
1439                    end_index
1440                }
1441            } else {
1442                end_index
1443            }
1444        }
1445
1446        let mut ans = SmallElemVec::new();
1447        match (start, end) {
1448            (None, None) => {
1449                ans.extend(elements.drain(..));
1450            }
1451            (None, Some(end)) => {
1452                let end = drain_end(end, elements);
1453                ans.extend(elements.drain(..end));
1454            }
1455            (Some(start), None) => {
1456                let start = drain_start(start, elements);
1457                ans.extend(elements.drain(start..));
1458            }
1459            (Some(start), Some(end)) => {
1460                if start.elem_index == end.elem_index {
1461                    let len = end.offset - start.offset;
1462                    elements[start.elem_index].len -= len;
1463                    let new_elem = Elem {
1464                        anchor_set: Default::default(),
1465                        len,
1466                    };
1467                    ans.push(new_elem)
1468                } else {
1469                    let start = drain_start(start, elements);
1470                    let end = drain_end(end, elements);
1471                    ans.extend(elements.drain(start..end));
1472                }
1473            }
1474        }
1475        Box::new(ans.into_iter())
1476    }
1477}
1478
1479struct IndexFinderWithStyles {
1480    left: usize,
1481    started_styles: FxHashSet<AnnIdx>,
1482    pending_delete: FxHashSet<AnnIdx>,
1483}
1484
1485impl Query<TreeTrait> for IndexFinderWithStyles {
1486    type QueryArg = usize;
1487
1488    fn init(target: &Self::QueryArg) -> Self {
1489        IndexFinderWithStyles {
1490            left: *target,
1491            started_styles: Default::default(),
1492            pending_delete: Default::default(),
1493        }
1494    }
1495
1496    /// should prefer zero len element
1497    fn find_node(
1498        &mut self,
1499        _: &Self::QueryArg,
1500        child_caches: &[generic_btree::Child<TreeTrait>],
1501    ) -> generic_btree::FindResult {
1502        if child_caches.is_empty() {
1503            return FindResult::new_missing(0, self.left);
1504        }
1505
1506        let mut last_left = self.left;
1507        for (i, cache) in child_caches.iter().enumerate() {
1508            if cache.cache.len == 0 && self.left == 0 {
1509                return FindResult::new_found(i, self.left);
1510            }
1511
1512            if self.left >= cache.cache.len {
1513                last_left = self.left;
1514                self.left -= cache.cache.len;
1515            } else {
1516                return FindResult::new_found(i, self.left);
1517            }
1518
1519            for &ann in cache.cache.anchor_set.start.iter() {
1520                self.started_styles.insert(ann);
1521            }
1522            for ann in cache.cache.anchor_set.end.iter() {
1523                if !self.started_styles.remove(ann) {
1524                    self.pending_delete.insert(*ann);
1525                }
1526            }
1527        }
1528
1529        self.left = last_left;
1530        FindResult::new_missing(child_caches.len() - 1, last_left)
1531    }
1532
1533    /// should prefer zero len element
1534    fn find_element(&mut self, _: &Self::QueryArg, elements: &[Elem]) -> generic_btree::FindResult {
1535        if elements.is_empty() {
1536            return FindResult::new_missing(0, self.left);
1537        }
1538
1539        let mut last_left = self.left;
1540        for (i, cache) in elements.iter().enumerate() {
1541            if cache.len == 0 && self.left == 0 {
1542                return FindResult::new_found(i, self.left);
1543            }
1544
1545            if self.left >= cache.len {
1546                last_left = self.left;
1547                self.left -= cache.len;
1548            } else {
1549                return FindResult::new_found(i, self.left);
1550            }
1551
1552            for &ann in cache.anchor_set.start.iter() {
1553                self.started_styles.insert(ann);
1554            }
1555            for ann in cache.anchor_set.end.iter() {
1556                if !self.started_styles.remove(ann) {
1557                    self.pending_delete.insert(*ann);
1558                }
1559            }
1560        }
1561
1562        self.left = last_left;
1563        FindResult::new_missing(elements.len() - 1, last_left)
1564    }
1565}
1566
1567struct AnnotationFinderStart {
1568    target: AnnIdx,
1569    visited_len: usize,
1570}
1571
1572struct AnnotationFinderEnd {
1573    target: AnnIdx,
1574    visited_len: usize,
1575}
1576
1577impl Query<TreeTrait> for AnnotationFinderStart {
1578    type QueryArg = AnnIdx;
1579
1580    fn init(target: &Self::QueryArg) -> Self {
1581        Self {
1582            target: *target,
1583            visited_len: 0,
1584        }
1585    }
1586
1587    fn find_node(
1588        &mut self,
1589        _: &Self::QueryArg,
1590        child_caches: &[generic_btree::Child<TreeTrait>],
1591    ) -> FindResult {
1592        for (i, cache) in child_caches.iter().enumerate() {
1593            if cache.cache.anchor_set.start.contains(&self.target) {
1594                return FindResult::new_found(i, 0);
1595            }
1596            self.visited_len += cache.cache.len;
1597        }
1598
1599        FindResult::new_missing(0, 0)
1600    }
1601
1602    fn find_element(
1603        &mut self,
1604        _: &Self::QueryArg,
1605        elements: &[<TreeTrait as BTreeTrait>::Elem],
1606    ) -> FindResult {
1607        for (i, cache) in elements.iter().enumerate() {
1608            if cache.anchor_set.start.contains(&self.target) {
1609                return FindResult::new_found(i, 0);
1610            }
1611            self.visited_len += cache.len;
1612        }
1613
1614        FindResult::new_missing(0, 0)
1615    }
1616}
1617
1618impl Query<TreeTrait> for AnnotationFinderEnd {
1619    type QueryArg = AnnIdx;
1620
1621    fn init(target: &Self::QueryArg) -> Self {
1622        Self {
1623            target: *target,
1624            visited_len: 0,
1625        }
1626    }
1627
1628    fn find_node(
1629        &mut self,
1630        _: &Self::QueryArg,
1631        child_caches: &[generic_btree::Child<TreeTrait>],
1632    ) -> FindResult {
1633        for (i, cache) in child_caches.iter().enumerate().rev() {
1634            if cache.cache.anchor_set.end.contains(&self.target) {
1635                return FindResult::new_found(i, cache.cache.len);
1636            }
1637            self.visited_len += cache.cache.len;
1638        }
1639
1640        FindResult::new_missing(0, 0)
1641    }
1642
1643    fn find_element(
1644        &mut self,
1645        _: &Self::QueryArg,
1646        elements: &[<TreeTrait as BTreeTrait>::Elem],
1647    ) -> FindResult {
1648        for (i, cache) in elements.iter().enumerate().rev() {
1649            if cache.anchor_set.end.contains(&self.target) {
1650                return FindResult::new_found(i, cache.len);
1651            }
1652            self.visited_len += cache.len;
1653        }
1654
1655        FindResult::new_missing(0, 0)
1656    }
1657}
1658
1659impl Mergeable for Span {
1660    fn can_merge(&self, rhs: &Self) -> bool {
1661        self.annotations == rhs.annotations || (self.len == 0 && rhs.len == 0)
1662    }
1663
1664    fn merge_right(&mut self, rhs: &Self) {
1665        if self.len == 0 && rhs.len == 0 {
1666            for v in rhs.annotations.iter() {
1667                self.annotations.insert(v.clone());
1668            }
1669        } else {
1670            self.len += rhs.len
1671        }
1672    }
1673
1674    fn merge_left(&mut self, left: &Self) {
1675        if self.len == 0 && left.len == 0 {
1676            for v in left.annotations.iter() {
1677                self.annotations.insert(v.clone());
1678            }
1679        } else {
1680            self.len += left.len
1681        }
1682    }
1683}
1684
1685#[cfg(test)]
1686#[cfg(feature = "test")]
1687mod tree_impl_tests {
1688    use std::collections::{BTreeSet, HashMap};
1689
1690    use crate::{legacy::range_map::AnnPosRelativeToInsert, Anchor, AnchorType};
1691
1692    use super::*;
1693
1694    fn as_str(arr: Vec<Span>) -> Vec<String> {
1695        arr.iter()
1696            .map(|x| {
1697                let mut s = x
1698                    .annotations
1699                    .iter()
1700                    .map(|x| x.id.client.to_string())
1701                    .collect::<Vec<_>>()
1702                    .join(",");
1703                s.push(';');
1704                s.push_str(&x.len.to_string());
1705                s
1706            })
1707            .collect()
1708    }
1709
1710    fn assert_span_eq(a: Vec<Span>, b: Vec<Span>) {
1711        assert_eq!(as_str(a), as_str(b));
1712    }
1713
1714    fn id(k: u64) -> OpID {
1715        OpID::new(k, 0)
1716    }
1717
1718    fn a(n: u64) -> Annotation {
1719        Annotation {
1720            id: id(n),
1721            range_lamport: (0, id(n)),
1722            range: crate::AnchorRange {
1723                start: Anchor {
1724                    id: Some(id(n)),
1725                    type_: AnchorType::Before,
1726                },
1727                end: Anchor {
1728                    id: Some(id(n)),
1729                    type_: AnchorType::Before,
1730                },
1731            },
1732            behavior: crate::Behavior::Merge,
1733            type_: InternalString::from(""),
1734            meta: None,
1735        }
1736    }
1737
1738    fn make_spans(spans: Vec<(Vec<u64>, usize)>) -> Vec<Span> {
1739        let mut map = HashMap::new();
1740        let mut ans = Vec::new();
1741        for (annotations, len) in spans.iter() {
1742            let mut new_annotations = BTreeSet::new();
1743            for ann in annotations {
1744                let a = map.entry(*ann).or_insert_with(|| Arc::new(a(*ann))).clone();
1745                new_annotations.insert(a);
1746            }
1747            ans.push(Span {
1748                annotations: new_annotations,
1749                len: *len,
1750            });
1751        }
1752
1753        ans
1754    }
1755
1756    #[test]
1757    fn annotate() {
1758        let mut tree = TreeRangeMap::new();
1759        tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1760        tree.annotate(10, 10, a(2));
1761        assert_eq!(tree.len(), 100);
1762        let range = tree.get_annotation_range(id(2));
1763        assert_eq!(range.unwrap().1, 10..20);
1764        let ans = tree.get_annotations(0, 100);
1765        assert_eq!(
1766            ans,
1767            make_spans(vec![(vec![], 10), (vec![2], 10), (vec![], 80)])
1768        );
1769    }
1770
1771    mod delete {
1772        use super::*;
1773
1774        #[test]
1775        fn delete_text_to_empty() {
1776            let mut tree = TreeRangeMap::new();
1777            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1778            tree.delete(10, 10);
1779            assert_eq!(tree.len(), 90);
1780            tree.delete(0, 90);
1781            assert_eq!(tree.len(), 0);
1782            let ans = tree.get_annotations(0, 100);
1783            assert_eq!(ans, make_spans(vec![(vec![], 0)]));
1784        }
1785
1786        #[test]
1787        fn delete_text_with_annotation_to_empty() {
1788            let mut tree = TreeRangeMap::new();
1789            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1790            tree.annotate(0, 10, a(0));
1791            tree.annotate(5, 10, a(1));
1792            tree.annotate(95, 5, a(5));
1793            tree.delete(0, 100);
1794            assert_eq!(tree.len(), 0);
1795            let ans = tree.get_annotations(0, 100);
1796            assert_eq!(ans, make_spans(vec![(vec![0, 1, 5], 0)]));
1797        }
1798
1799        #[test]
1800        fn delete_text_with_empty_span_at_edge() {
1801            let mut tree = TreeRangeMap::new();
1802            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1803            tree.annotate(10, 10, a(0));
1804            tree.delete(10, 10);
1805            // now we have an empty span
1806            let ans = tree.get_annotations(0, 100);
1807            assert_span_eq(
1808                ans,
1809                make_spans(vec![(vec![], 10), (vec![0], 0), (vec![], 80)]),
1810            );
1811
1812            // should not create another empty span
1813            tree.delete(10, 10);
1814            let ans = tree.get_annotations(0, 100);
1815            assert_eq!(
1816                ans,
1817                make_spans(vec![(vec![], 10), (vec![0], 0), (vec![], 70),])
1818            );
1819
1820            // should not create another empty span
1821            tree.delete(0, 10);
1822            let ans = tree.get_annotations(0, 100);
1823            assert_eq!(ans, make_spans(vec![(vec![0], 0), (vec![], 70),]));
1824        }
1825
1826        #[test]
1827        fn delete_a_part_of_annotation() {
1828            let mut tree = TreeRangeMap::new();
1829            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1830            tree.annotate(5, 10, a(0));
1831            tree.delete(10, 10);
1832            let ans = tree.get_annotations(0, 100);
1833            // should not create empty span
1834            assert_eq!(
1835                ans,
1836                make_spans(vec![(vec![], 5), (vec![0], 5), (vec![], 80),])
1837            );
1838        }
1839
1840        #[test]
1841        fn delete_annotation() {
1842            let mut tree = TreeRangeMap::new();
1843            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1844            tree.annotate(5, 10, a(0));
1845            tree.delete_annotation(id(0));
1846            let ans = tree.get_annotations(0, 100);
1847            assert_eq!(ans, make_spans(vec![(vec![], 100)]));
1848        }
1849
1850        #[test]
1851        fn delete_annotation_in_zero_len_span() {
1852            let mut tree = TreeRangeMap::new();
1853            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1854            tree.annotate(0, 10, a(0));
1855            tree.delete(0, 10);
1856            // now we have an empty span
1857            let ans = tree.get_annotations(0, 100);
1858            assert_eq!(ans, make_spans(vec![(vec![0], 0), (vec![], 90)]));
1859
1860            // annotation on the empty span is gone
1861            tree.delete_annotation(id(0));
1862            let ans = tree.get_annotations(0, 100);
1863            assert_eq!(ans, make_spans(vec![(vec![], 90)]));
1864        }
1865
1866        #[test]
1867        fn delete_across_several_span() {
1868            let mut tree = TreeRangeMap::new();
1869            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1870            tree.annotate(0, 10, a(0));
1871            tree.annotate(5, 10, a(1));
1872            tree.annotate(6, 10, a(2));
1873            tree.annotate(7, 10, a(3));
1874            tree.annotate(8, 10, a(4));
1875            tree.annotate(9, 10, a(5));
1876            tree.annotate(10, 10, a(6));
1877            assert!(tree.get_annotation_range(id(0)).is_some());
1878            tree.delete_annotation(id(0));
1879            assert!(tree.get_annotation_range(id(0)).is_none());
1880            assert!(tree.get_annotation_range(id(1)).is_some());
1881            tree.delete_annotation(id(1));
1882            assert!(tree.get_annotation_range(id(1)).is_none());
1883        }
1884    }
1885
1886    mod adjust_annotation_range {
1887        use super::*;
1888        #[test]
1889        fn expand() {
1890            let mut tree = TreeRangeMap::new();
1891            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1892            tree.annotate(1, 9, a(0));
1893            // expand end
1894            tree.adjust_annotation(id(0), 1, id(1), None, Some((1, Some(id(0)))));
1895            let ans = tree.get_annotations(0, 100);
1896            assert_span_eq(
1897                ans,
1898                make_spans(vec![(vec![], 1), (vec![0], 10), (vec![], 89)]),
1899            );
1900
1901            // expand start
1902            tree.adjust_annotation(id(0), 1, id(1), Some((-1, Some(id(0)))), None);
1903            let ans = tree.get_annotations(0, 100);
1904            assert_span_eq(ans, make_spans(vec![(vec![0], 11), (vec![], 89)]));
1905        }
1906
1907        #[test]
1908        fn should_change_anchor_id() {
1909            let mut tree = TreeRangeMap::new();
1910            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1911            tree.annotate(0, 10, a(0));
1912            tree.adjust_annotation(id(0), 1, id(1), None, Some((1, Some(id(4)))));
1913            let span = tree.get_annotations(2, 1)[0].clone();
1914            let ann = span.annotations.into_iter().next().unwrap();
1915            assert_eq!(ann.range.end.id, Some(id(4)));
1916        }
1917
1918        #[test]
1919        fn shrink() {
1920            let mut tree = TreeRangeMap::new();
1921            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1922            tree.annotate(0, 10, a(0));
1923            // shrink end
1924            tree.adjust_annotation(id(0), 1, id(1), None, Some((-1, Some(id(0)))));
1925            let ans = tree.get_annotations(0, 100);
1926            assert_span_eq(ans, make_spans(vec![(vec![0], 9), (vec![], 91)]));
1927
1928            // shrink start
1929            tree.adjust_annotation(id(0), 1, id(1), Some((1, Some(id(0)))), None);
1930            let ans = tree.get_annotations(0, 100);
1931            assert_span_eq(
1932                ans,
1933                make_spans(vec![(vec![], 1), (vec![0], 8), (vec![], 91)]),
1934            );
1935        }
1936
1937        #[test]
1938        fn expand_over_empty_span() {
1939            let mut tree = TreeRangeMap::new();
1940            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1941            tree.annotate(10, 10, a(0));
1942            tree.delete(10, 10);
1943            tree.annotate(9, 1, a(1));
1944            tree.adjust_annotation(id(1), 1, id(2), None, Some((2, Some(id(2)))));
1945            let ans = tree.get_annotations(0, 100);
1946            assert_span_eq(
1947                ans,
1948                make_spans(vec![
1949                    (vec![], 9),
1950                    (vec![1], 1),
1951                    (vec![0, 1], 0),
1952                    (vec![1], 2),
1953                    (vec![], 78),
1954                ]),
1955            );
1956        }
1957
1958        #[test]
1959        fn expand_from_empty_span_over_empty_span() {
1960            let mut tree = TreeRangeMap::new();
1961            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1962            tree.annotate(10, 10, a(0));
1963            tree.delete(10, 10);
1964            let ans = tree.get_annotations(0, 100);
1965            assert_span_eq(
1966                ans,
1967                make_spans(vec![(vec![], 10), (vec![0], 0), (vec![], 80)]),
1968            );
1969            tree.adjust_annotation(id(0), 1, id(3), None, Some((2, Some(id(3)))));
1970            let ans = tree.get_annotations(0, 100);
1971            assert_span_eq(
1972                ans,
1973                make_spans(vec![(vec![], 10), (vec![0], 2), (vec![], 78)]),
1974            );
1975        }
1976
1977        #[test]
1978        fn should_ignore_adjustment_if_lamport_is_too_small() {
1979            let mut tree = TreeRangeMap::new();
1980            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
1981            tree.annotate(10, 10, a(0));
1982            // set lamport to 2 but not change the range
1983            tree.adjust_annotation(
1984                id(0),
1985                2,
1986                id(3),
1987                Some((0, Some(id(1)))),
1988                Some((0, Some(id(3)))),
1989            );
1990            let ans = tree.get_annotations(0, 100);
1991            assert_span_eq(
1992                ans,
1993                make_spans(vec![(vec![], 10), (vec![0], 10), (vec![], 80)]),
1994            );
1995
1996            // this operation should have no effect, because lamport 1 < the current lamport 2
1997            tree.adjust_annotation(
1998                id(0),
1999                1,
2000                id(3),
2001                Some((-2, Some(id(1)))),
2002                Some((10, Some(id(3)))),
2003            );
2004            let ans = tree.get_annotations(0, 100);
2005            assert_span_eq(
2006                ans,
2007                make_spans(vec![(vec![], 10), (vec![0], 10), (vec![], 80)]),
2008            );
2009
2010            // this operation should have effect, because lamport 3 < the current lamport 2
2011            tree.adjust_annotation(
2012                id(0),
2013                3,
2014                id(3),
2015                Some((-2, Some(id(1)))),
2016                Some((10, Some(id(3)))),
2017            );
2018            let ans = tree.get_annotations(0, 100);
2019            assert_span_eq(
2020                ans,
2021                make_spans(vec![(vec![], 8), (vec![0], 22), (vec![], 70)]),
2022            );
2023        }
2024    }
2025
2026    mod insert {
2027        use super::*;
2028
2029        #[test]
2030        fn test_insert_to_annotation() {
2031            let mut tree = TreeRangeMap::new();
2032            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
2033            tree.annotate(10, 10, a(0));
2034            tree.insert(20, 1, |_| AnnPosRelativeToInsert::Before);
2035            assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 10..20);
2036
2037            tree.insert(19, 1, |_| unreachable!());
2038            assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 10..21);
2039
2040            tree.insert(10, 1, |_| AnnPosRelativeToInsert::After);
2041            assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 11..22);
2042        }
2043
2044        #[test]
2045        fn insert_at_edge_with_diff_mark() {
2046            let mut tree = TreeRangeMap::new();
2047            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
2048            tree.annotate(10, 10, a(0));
2049
2050            // not included in annotated range
2051            tree.insert(20, 1, |_| AnnPosRelativeToInsert::Before);
2052            assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 10..20);
2053
2054            // included in annotated range
2055            tree.insert(20, 1, |_| AnnPosRelativeToInsert::IncludeInsert);
2056            assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 10..21);
2057
2058            // not included in annotated range
2059            tree.insert(10, 1, |_| AnnPosRelativeToInsert::After);
2060            assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 11..22);
2061
2062            // included in annotated range
2063            tree.insert(11, 1, |_| AnnPosRelativeToInsert::IncludeInsert);
2064            assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 11..23);
2065        }
2066
2067        #[test]
2068        fn test_insert_to_zero_len_position() {
2069            let mut tree = TreeRangeMap::new();
2070            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
2071            tree.annotate(10, 10, a(0));
2072            tree.delete(10, 10);
2073            tree.insert(10, 1, |_| AnnPosRelativeToInsert::Before);
2074            assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 10..10);
2075            tree.insert(10, 1, |_| AnnPosRelativeToInsert::After);
2076            assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 11..11);
2077            tree.insert(11, 1, |_| AnnPosRelativeToInsert::IncludeInsert);
2078            assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 11..12);
2079        }
2080
2081        #[test]
2082        fn test_insert_to_middle_among_tombstones() {
2083            let mut tree = TreeRangeMap::new();
2084            tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
2085            tree.annotate(0, 100, a(8));
2086            tree.annotate(10, 1, a(0));
2087            tree.annotate(11, 1, a(1));
2088            tree.annotate(12, 1, a(2));
2089            tree.delete(10, 3);
2090            tree.insert(10, 1, |ann| {
2091                if ann.id == id(0) {
2092                    AnnPosRelativeToInsert::Before
2093                } else if ann.id == id(2) {
2094                    AnnPosRelativeToInsert::IncludeInsert
2095                } else {
2096                    AnnPosRelativeToInsert::After
2097                }
2098            });
2099            assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 10..10);
2100            assert_eq!(tree.get_annotation_pos(id(1)).unwrap().1, 11..11);
2101            assert_eq!(tree.get_annotation_pos(id(2)).unwrap().1, 10..11);
2102            assert_eq!(tree.get_annotation_pos(id(8)).unwrap().1, 0..98);
2103            for ann in tree.get_annotations(0, 98) {
2104                assert!(ann.annotations.iter().any(|x| x.id == id(8)));
2105            }
2106        }
2107
2108        #[test]
2109        fn insert_to_beginning_with_empty_span() {
2110            {
2111                // after
2112                let mut tree = TreeRangeMap::new();
2113                tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
2114                tree.annotate(0, 1, a(0));
2115                tree.delete(0, 1);
2116                tree.insert(0, 1, |_| AnnPosRelativeToInsert::After);
2117                assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 1..1);
2118            }
2119            {
2120                // include
2121                let mut tree = TreeRangeMap::new();
2122                tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
2123                tree.annotate(0, 1, a(0));
2124                tree.delete(0, 1);
2125                tree.insert(0, 1, |_| AnnPosRelativeToInsert::IncludeInsert);
2126                assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 0..1);
2127            }
2128            {
2129                // before
2130                let mut tree = TreeRangeMap::new();
2131                tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
2132                tree.annotate(0, 1, a(0));
2133                tree.delete(0, 1);
2134                tree.insert(0, 1, |_| AnnPosRelativeToInsert::Before);
2135                assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 0..0);
2136            }
2137        }
2138
2139        #[test]
2140        fn insert_to_end_with_empty_span() {
2141            {
2142                // after
2143                let mut tree = TreeRangeMap::new();
2144                tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
2145                tree.annotate(99, 1, a(0));
2146                tree.delete(99, 1);
2147                assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 99..99);
2148                tree.insert(99, 1, |_| AnnPosRelativeToInsert::After);
2149                assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 100..100);
2150            }
2151            {
2152                // include
2153                let mut tree = TreeRangeMap::new();
2154                tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
2155                tree.annotate(99, 1, a(0));
2156                tree.delete(99, 1);
2157                tree.insert(99, 1, |_| AnnPosRelativeToInsert::IncludeInsert);
2158                assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 99..100);
2159            }
2160            {
2161                // before
2162                let mut tree = TreeRangeMap::new();
2163                tree.insert(0, 100, |_| AnnPosRelativeToInsert::After);
2164                tree.annotate(99, 1, a(0));
2165                tree.delete(99, 1);
2166                tree.insert(99, 1, |_| AnnPosRelativeToInsert::Before);
2167                assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 99..99);
2168            }
2169        }
2170    }
2171}