diff options
Diffstat (limited to 'libeditor/src/line_index.rs')
-rw-r--r-- | libeditor/src/line_index.rs | 62 |
1 files changed, 0 insertions, 62 deletions
diff --git a/libeditor/src/line_index.rs b/libeditor/src/line_index.rs deleted file mode 100644 index 801726aa5..000000000 --- a/libeditor/src/line_index.rs +++ /dev/null | |||
@@ -1,62 +0,0 @@ | |||
1 | use superslice::Ext; | ||
2 | use ::TextUnit; | ||
3 | |||
4 | #[derive(Clone, Debug)] | ||
5 | pub struct LineIndex { | ||
6 | newlines: Vec<TextUnit>, | ||
7 | } | ||
8 | |||
9 | #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] | ||
10 | pub struct LineCol { | ||
11 | pub line: u32, | ||
12 | pub col: TextUnit, | ||
13 | } | ||
14 | |||
15 | impl LineIndex { | ||
16 | pub fn new(text: &str) -> LineIndex { | ||
17 | let mut newlines = vec![0.into()]; | ||
18 | let mut curr = 0.into(); | ||
19 | for c in text.chars() { | ||
20 | curr += TextUnit::of_char(c); | ||
21 | if c == '\n' { | ||
22 | newlines.push(curr); | ||
23 | } | ||
24 | } | ||
25 | LineIndex { newlines } | ||
26 | } | ||
27 | |||
28 | pub fn line_col(&self, offset: TextUnit) -> LineCol { | ||
29 | let line = self.newlines.upper_bound(&offset) - 1; | ||
30 | let line_start_offset = self.newlines[line]; | ||
31 | let col = offset - line_start_offset; | ||
32 | return LineCol { line: line as u32, col }; | ||
33 | } | ||
34 | |||
35 | pub fn offset(&self, line_col: LineCol) -> TextUnit { | ||
36 | //TODO: return Result | ||
37 | self.newlines[line_col.line as usize] + line_col.col | ||
38 | } | ||
39 | } | ||
40 | |||
41 | #[test] | ||
42 | fn test_line_index() { | ||
43 | let text = "hello\nworld"; | ||
44 | let index = LineIndex::new(text); | ||
45 | assert_eq!(index.line_col(0.into()), LineCol { line: 0, col: 0.into() }); | ||
46 | assert_eq!(index.line_col(1.into()), LineCol { line: 0, col: 1.into() }); | ||
47 | assert_eq!(index.line_col(5.into()), LineCol { line: 0, col: 5.into() }); | ||
48 | assert_eq!(index.line_col(6.into()), LineCol { line: 1, col: 0.into() }); | ||
49 | assert_eq!(index.line_col(7.into()), LineCol { line: 1, col: 1.into() }); | ||
50 | assert_eq!(index.line_col(8.into()), LineCol { line: 1, col: 2.into() }); | ||
51 | assert_eq!(index.line_col(10.into()), LineCol { line: 1, col: 4.into() }); | ||
52 | assert_eq!(index.line_col(11.into()), LineCol { line: 1, col: 5.into() }); | ||
53 | assert_eq!(index.line_col(12.into()), LineCol { line: 1, col: 6.into() }); | ||
54 | |||
55 | let text = "\nhello\nworld"; | ||
56 | let index = LineIndex::new(text); | ||
57 | assert_eq!(index.line_col(0.into()), LineCol { line: 0, col: 0.into() }); | ||
58 | assert_eq!(index.line_col(1.into()), LineCol { line: 1, col: 0.into() }); | ||
59 | assert_eq!(index.line_col(2.into()), LineCol { line: 1, col: 1.into() }); | ||
60 | assert_eq!(index.line_col(6.into()), LineCol { line: 1, col: 5.into() }); | ||
61 | assert_eq!(index.line_col(7.into()), LineCol { line: 2, col: 0.into() }); | ||
62 | } | ||