Introduce Cursor::seek_start to compute VersionedOffset once

This commit is contained in:
Antonio Scandurra 2021-06-10 13:42:43 +02:00
parent 71f50ce361
commit f294bfdbd9
3 changed files with 10 additions and 20 deletions

View file

@ -1679,9 +1679,7 @@ impl Buffer {
bias, bias,
version, version,
} => { } => {
let mut cursor = self let mut cursor = self.fragments.cursor::<VersionedOffset, usize>();
.fragments
.cursor::<VersionedOffset, (VersionedOffset, usize)>();
cursor.seek( cursor.seek(
&VersionedOffset::Offset(*offset), &VersionedOffset::Offset(*offset),
*bias, *bias,
@ -1689,12 +1687,12 @@ impl Buffer {
); );
let fragment = cursor.item().unwrap(); let fragment = cursor.item().unwrap();
let overshoot = if fragment.visible { let overshoot = if fragment.visible {
offset - cursor.start().0.offset() offset - cursor.seek_start().offset()
} else { } else {
0 0
}; };
self.text_summary_for_range(0..cursor.start().1 + overshoot) self.text_summary_for_range(0..cursor.start() + overshoot)
} }
} }
} }
@ -1713,14 +1711,14 @@ impl Buffer {
} => { } => {
let mut cursor = self let mut cursor = self
.fragments .fragments
.cursor::<VersionedOffset, (VersionedOffset, FragmentTextSummary)>(); .cursor::<VersionedOffset, FragmentTextSummary>();
cursor.seek( cursor.seek(
&VersionedOffset::Offset(*offset), &VersionedOffset::Offset(*offset),
*bias, *bias,
&Some(version.clone()), &Some(version.clone()),
); );
let overshoot = offset - cursor.start().0.offset(); let overshoot = offset - cursor.seek_start().offset();
let summary = cursor.start().1; let summary = cursor.start();
summary.visible + summary.deleted + overshoot summary.visible + summary.deleted + overshoot
} }
} }

View file

@ -37,18 +37,6 @@ impl<'a, T: Summary> Dimension<'a, T> for () {
fn add_summary(&mut self, _: &'a T, _: &T::Context) {} fn add_summary(&mut self, _: &'a T, _: &T::Context) {}
} }
impl<'a, S, D1, D2> Dimension<'a, S> for (D1, D2)
where
S: Summary,
D1: Dimension<'a, S>,
D2: Dimension<'a, S>,
{
fn add_summary(&mut self, summary: &'a S, cx: &S::Context) {
self.0.add_summary(summary, cx);
self.1.add_summary(summary, cx);
}
}
pub trait SeekDimension<'a, T: Summary>: Dimension<'a, T> { pub trait SeekDimension<'a, T: Summary>: Dimension<'a, T> {
fn cmp(&self, other: &Self, cx: &T::Context) -> Ordering; fn cmp(&self, other: &Self, cx: &T::Context) -> Ordering;
} }

View file

@ -45,6 +45,10 @@ where
self.sum_dimension = U::default(); self.sum_dimension = U::default();
} }
pub fn seek_start(&self) -> &S {
&self.seek_dimension
}
pub fn start(&self) -> &U { pub fn start(&self) -> &U {
&self.sum_dimension &self.sum_dimension
} }