Improved file load times.

There was a regression after switching to ropes.  Now it's pretty much
back to pre-rope load times.
This commit is contained in:
Nathan Vegdahl 2015-02-15 20:15:19 -08:00
parent de58f01b2f
commit 6eed3fcc74
3 changed files with 20 additions and 5 deletions

View File

@ -2,7 +2,7 @@
use std::mem; use std::mem;
use super::rope::{Rope, RopeGraphemeIter}; use super::rope::{Rope, RopeGraphemeIter};
use string_utils::is_line_ending; use string_utils::{is_line_ending, grapheme_count};
/// A single line of text /// A single line of text
@ -100,7 +100,7 @@ impl Line {
} }
pub fn new_from_str_unchecked(text: &str) -> Line { pub fn new_from_str_with_count_unchecked(text: &str, count: usize) -> Line {
let mut ending = LineEnding::None; let mut ending = LineEnding::None;
let bytes = text.as_bytes(); let bytes = text.as_bytes();
@ -175,8 +175,9 @@ impl Line {
} }
// Create and return Line // Create and return Line
let cnt = if ending == LineEnding::None { count } else { count - 1 };
return Line { return Line {
text: Rope::new_from_str(&text[..(bytes.len()-le_size)]), text: Rope::new_from_str_with_count(&text[..(bytes.len()-le_size)], cnt),
ending: ending, ending: ending,
}; };
} }
@ -189,7 +190,7 @@ impl Line {
// TODO: this can be smarter, and can pass the string // TODO: this can be smarter, and can pass the string
// directly to the Rope after taking off any line // directly to the Rope after taking off any line
// endings. // endings.
return Line::new_from_str_unchecked(text.as_slice()); return Line::new_from_str_with_count_unchecked(text.as_slice(), grapheme_count(text.as_slice()));
} }

View File

@ -73,7 +73,7 @@ impl Buffer {
if a != b { if a != b {
let substr = &string[a..b]; let substr = &string[a..b];
let line = Line::new_from_str_unchecked(substr); let line = Line::new_from_str_with_count_unchecked(substr, count);
let node = BufferNode::new_from_line_with_count_unchecked(line, count); let node = BufferNode::new_from_line_with_count_unchecked(line, count);
buf.append_leaf_node_unchecked(node); buf.append_leaf_node_unchecked(node);
} }

View File

@ -33,6 +33,7 @@ impl Rope {
} }
} }
/// Creates a new rope from a string slice /// Creates a new rope from a string slice
pub fn new_from_str(s: &str) -> Rope { pub fn new_from_str(s: &str) -> Rope {
let mut rope_stack: Vec<Rope> = Vec::new(); let mut rope_stack: Vec<Rope> = Vec::new();
@ -106,6 +107,19 @@ impl Rope {
return rope; return rope;
} }
pub fn new_from_str_with_count(s: &str, count: usize) -> Rope {
if count <= MAX_NODE_SIZE {
Rope {
data: RopeData::Leaf(String::from_str(s)),
grapheme_count_: count,
tree_height: 1,
}
}
else {
Rope::new_from_str(s)
}
}
/// Creates a new rope from a string, consuming the string /// Creates a new rope from a string, consuming the string
pub fn new_from_string(s: String) -> Rope { pub fn new_from_string(s: String) -> Rope {
// TODO: special case short strings? // TODO: special case short strings?