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 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 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 let mut ans = CacheDiff::default();
128 for ann in self.start.iter() {
129 if *ann > Self::NEW_ELEM_THRESHOLD {
130 ans.start.insert(*ann - Self::NEW_ELEM_THRESHOLD);
132 } else if *ann > 0 && !self.start.contains(&-*ann) {
133 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 ans.end.insert(*ann - Self::NEW_ELEM_THRESHOLD);
148 } else if *ann > 0 && !self.end.contains(&-*ann) {
149 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#[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#[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 }
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 }
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 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 drop(spans);
314 self.tree.insert::<IndexFinder>(&pos, new_elem);
316 debug_log::group_end!();
317 return;
318 } else if spans.len() == 1 {
319 drop(spans);
322 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 }
505
506 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 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 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 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 assert!(
788 end.elem_index > start.elem_index
789 || (end.elem_index == start.elem_index && end.offset >= start.offset)
790 );
791
792 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(elements, start.elem_index, start.offset, idx)
799 } else {
800 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 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 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 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 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 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 offset = 0;
1273 index += 1;
1274 }
1275
1276 if elements.is_empty() {
1277 elements.splice(0..0, new_elements);
1278 return;
1279 }
1280
1281 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 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 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 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 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 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 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 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 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 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 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 let ans = tree.get_annotations(0, 100);
1858 assert_eq!(ans, make_spans(vec![(vec![0], 0), (vec![], 90)]));
1859
1860 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 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 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 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 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 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 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 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 tree.insert(20, 1, |_| AnnPosRelativeToInsert::Before);
2052 assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 10..20);
2053
2054 tree.insert(20, 1, |_| AnnPosRelativeToInsert::IncludeInsert);
2056 assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 10..21);
2057
2058 tree.insert(10, 1, |_| AnnPosRelativeToInsert::After);
2060 assert_eq!(tree.get_annotation_pos(id(0)).unwrap().1, 11..22);
2061
2062 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 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 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 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 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 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 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}