From 8b62f01222f9872a9ed69fa11c087209a3c43733 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Sat, 13 Dec 2014 19:16:28 -0800 Subject: [PATCH] Better node splitting for large text insertions. --- src/buffer.rs | 12 ++++++++---- src/main.rs | 11 +++++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/buffer.rs b/src/buffer.rs index b6bd602..6c8a560 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -156,13 +156,14 @@ impl TextNode { } } - /// Splits a leaf node into two roughly equal-sized children - pub fn split(&mut self) { + /// Recursively splits a leaf node into roughly equal-sized children, + /// being no larger than 'max_size'. + pub fn split(&mut self, max_size: uint) { if let TextNodeData::Branch(_, _) = self.data { panic!("TextNode::split(): attempt to split a non-leaf node."); } - if self.byte_count > 1 { + if self.byte_count > max_size { // Split data into two new text blocks let mut tn1 = box TextNode::new(); let mut tn2 = box TextNode::new(); @@ -172,6 +173,9 @@ impl TextNode { tn2 = box TextNode::new_from_str(tb.as_str().slice(pos, tb.len())); } + tn1.split(max_size); + tn2.split(max_size); + // Swap the old and new data let mut new_data = TextNodeData::Branch(tn1, tn2); mem::swap(&mut self.data, &mut new_data); @@ -218,7 +222,7 @@ impl TextNode { } if self.byte_count > MAX_LEAF_SIZE { - self.split(); + self.split(MAX_LEAF_SIZE); } }, diff --git a/src/main.rs b/src/main.rs index a7dfbeb..7bfca76 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,14 +32,17 @@ fn main() { let mut tb = TextBuffer::new(); - for _ in range(0i, 1000) { + for _ in range(0i, 100) { tb.insert_text(args.arg_file.as_slice(), 0); - if tb.len() > 1024 { - tb.remove_text(27, 27+3); - } } tb.remove_text(3, 6); + tb.remove_text(8, 9); + tb.remove_text(40, 43); + + if tb.len() > 300 { + tb.remove_text(67, 285); + } println!("{}", tb); } \ No newline at end of file