speed up LineNumbers
1 files changed, 26 insertions(+), 26 deletions(-)

M cursive/src/views/gutter.rs
M cursive/src/views/gutter.rs +26 -26
@@ 7,7 7,13 @@ use {
         theme::Style,
         vec::Vec2
     },
-    ted::cache::CharCache
+    ted::{
+        cache::CharCache,
+        num::{
+            NumDigits,
+            Digits
+        }
+    }
 };
 
 pub struct LineNumbers {

          
@@ 27,39 33,27 @@ impl LineNumbers {
             pad_right: 1,
             space: CharCache::new(' '),
             size: range.sample_with(|range| Vec2::new(
-                range_width(&*range),
+                Self::range_width(&*range).into(),
                 range.end - range.start
             )),
             range
         }
     }
-}
 
-impl LineNumbers {
     fn width(&self) -> usize {
-        self.num_width() + self.pad_right
+        usize::from(self.nums_width()) + self.pad_right
     }
 
-    fn num_width(&self) -> usize {
-        self.range.sample_with(|range| range_width(&*range))
+    fn nums_width(&self) -> u8 {
+        self.range.sample_with(|range| Self::range_width(&*range))
     }
-}
 
-fn num_width(mut num: usize) -> usize {
-    // numbers are in ASCII range so one column per char
-    let mut width = 1;
-    while num >= 10 {
-        num /= 10;
-        width += 1;
-    }
-    width
-}
-
-fn range_width(range: &Range<usize>) -> usize {
-    if range.start < range.end {
-        num_width(range.end - 1)
-    } else {
-        0
+    fn range_width(range: &Range<usize>) -> u8 {
+        if range.start < range.end {
+            (range.end - 1).num_digits()
+        } else {
+            0
+        }
     }
 }
 

          
@@ 79,14 73,20 @@ impl View for LineNumbers {
 
     fn draw(&self, printer: &Printer) {
         printer.with_style(self.style, |printer| {
-            let num_width = self.size.x - self.pad_right;
+            let nums_width: usize = self.nums_width().into();
 
             for (y, line) in self.range.sample().enumerate().take(self.size.y) {
                 // print line number
-                printer.print((0, y), &format!("{:1$}", line, num_width)); // XXX cache number strings
+                let mut x = nums_width;
+                for digit in line.digits().str() {
+                    x -= 1;
+                    printer.print((x, y), digit);
+                }
+                // print left indent
+                printer.print((0, y), self.space.get(x).expect("not enough space allocated"));
 
                 // print right padding
-                printer.print((num_width, y), self.space.get(self.pad_right).expect("not enough space allocated"));
+                printer.print((nums_width, y), self.space.get(self.pad_right).expect("not enough space allocated"));
             }
         });
     }