Merge branch 'fragment-locators' into project-diagnostics

This commit is contained in:
Antonio Scandurra 2021-12-10 14:01:17 +01:00
commit c8d5e19492
7 changed files with 34 additions and 28 deletions

View file

@ -28,16 +28,18 @@ impl Anchor {
}
}
pub fn cmp<'a>(&self, other: &Anchor, buffer: &BufferSnapshot) -> Result<Ordering> {
let offset_comparison = if self.timestamp == other.timestamp {
self.offset.cmp(&other.offset)
pub fn cmp(&self, other: &Anchor, buffer: &BufferSnapshot) -> Result<Ordering> {
let fragment_id_comparison = if self.timestamp == other.timestamp {
Ordering::Equal
} else {
buffer
.full_offset_for_anchor(self)
.cmp(&buffer.full_offset_for_anchor(other))
.fragment_id_for_anchor(self)
.cmp(&buffer.fragment_id_for_anchor(other))
};
Ok(offset_comparison.then_with(|| self.bias.cmp(&other.bias)))
Ok(fragment_id_comparison
.then_with(|| self.offset.cmp(&other.offset))
.then_with(|| self.bias.cmp(&other.bias)))
}
pub fn bias_left(&self, buffer: &BufferSnapshot) -> Anchor {

View file

@ -1,6 +1,12 @@
use lazy_static::lazy_static;
use smallvec::{smallvec, SmallVec};
use std::iter;
lazy_static! {
pub static ref MIN: Locator = Locator::min();
pub static ref MAX: Locator = Locator::max();
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Locator(SmallVec<[u64; 4]>);

View file

@ -1768,12 +1768,11 @@ impl BufferSnapshot {
}
}
fn full_offset_for_anchor(&self, anchor: &Anchor) -> FullOffset {
fn fragment_id_for_anchor(&self, anchor: &Anchor) -> &Locator {
if *anchor == Anchor::min() {
Default::default()
&locator::MIN
} else if *anchor == Anchor::max() {
let text = self.fragments.summary().text;
FullOffset(text.visible + text.deleted)
&locator::MAX
} else {
let anchor_key = InsertionFragmentKey {
timestamp: anchor.timestamp,
@ -1795,10 +1794,7 @@ impl BufferSnapshot {
}
let insertion = insertion_cursor.item().expect("invalid insertion");
debug_assert_eq!(insertion.timestamp, anchor.timestamp, "invalid insertion");
let mut fragment_cursor = self.fragments.cursor::<(Option<&Locator>, FullOffset)>();
fragment_cursor.seek(&Some(&insertion.fragment_id), Bias::Left, &None);
fragment_cursor.start().1 + (anchor.offset - insertion.split_offset)
&insertion.fragment_id
}
}