multi_buffer: Reuse buffer chunks iterator when seeking across folds within an excerpt (#15532)
Release Notes: - N/A --------- Co-authored-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
This commit is contained in:
parent
7259d092a7
commit
7a0149f17c
1 changed files with 21 additions and 4 deletions
|
@ -298,6 +298,7 @@ pub struct ReversedMultiBufferBytes<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ExcerptChunks<'a> {
|
struct ExcerptChunks<'a> {
|
||||||
|
excerpt_id: ExcerptId,
|
||||||
content_chunks: BufferChunks<'a>,
|
content_chunks: BufferChunks<'a>,
|
||||||
footer_height: usize,
|
footer_height: usize,
|
||||||
}
|
}
|
||||||
|
@ -4145,11 +4146,18 @@ impl Excerpt {
|
||||||
let content_chunks = self.buffer.chunks(chunks_start..chunks_end, language_aware);
|
let content_chunks = self.buffer.chunks(chunks_start..chunks_end, language_aware);
|
||||||
|
|
||||||
ExcerptChunks {
|
ExcerptChunks {
|
||||||
|
excerpt_id: self.id,
|
||||||
content_chunks,
|
content_chunks,
|
||||||
footer_height,
|
footer_height,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn seek_chunks(&self, excerpt_chunks: &mut ExcerptChunks, offset: usize) {
|
||||||
|
let content_start = self.range.context.start.to_offset(&self.buffer);
|
||||||
|
let chunks_start = content_start + offset;
|
||||||
|
excerpt_chunks.content_chunks.seek(chunks_start);
|
||||||
|
}
|
||||||
|
|
||||||
fn bytes_in_range(&self, range: Range<usize>) -> ExcerptBytes {
|
fn bytes_in_range(&self, range: Range<usize>) -> ExcerptBytes {
|
||||||
let content_start = self.range.context.start.to_offset(&self.buffer);
|
let content_start = self.range.context.start.to_offset(&self.buffer);
|
||||||
let bytes_start = content_start + range.start;
|
let bytes_start = content_start + range.start;
|
||||||
|
@ -4488,10 +4496,19 @@ impl<'a> MultiBufferChunks<'a> {
|
||||||
self.range.start = offset;
|
self.range.start = offset;
|
||||||
self.excerpts.seek(&offset, Bias::Right, &());
|
self.excerpts.seek(&offset, Bias::Right, &());
|
||||||
if let Some(excerpt) = self.excerpts.item() {
|
if let Some(excerpt) = self.excerpts.item() {
|
||||||
self.excerpt_chunks = Some(excerpt.chunks_in_range(
|
let excerpt_start = self.excerpts.start();
|
||||||
self.range.start - self.excerpts.start()..self.range.end - self.excerpts.start(),
|
if let Some(excerpt_chunks) = self
|
||||||
self.language_aware,
|
.excerpt_chunks
|
||||||
));
|
.as_mut()
|
||||||
|
.filter(|chunks| excerpt.id == chunks.excerpt_id)
|
||||||
|
{
|
||||||
|
excerpt.seek_chunks(excerpt_chunks, self.range.start - excerpt_start);
|
||||||
|
} else {
|
||||||
|
self.excerpt_chunks = Some(excerpt.chunks_in_range(
|
||||||
|
self.range.start - excerpt_start..self.range.end - excerpt_start,
|
||||||
|
self.language_aware,
|
||||||
|
));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
self.excerpt_chunks = None;
|
self.excerpt_chunks = None;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue