aboutsummaryrefslogtreecommitdiff
path: root/src/text.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/text.rs')
-rw-r--r--src/text.rs136
1 files changed, 0 insertions, 136 deletions
diff --git a/src/text.rs b/src/text.rs
deleted file mode 100644
index 4084bf44e..000000000
--- a/src/text.rs
+++ /dev/null
@@ -1,136 +0,0 @@
1use std::fmt;
2use std::ops;
3
4/// An text position in a source file
5#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub struct TextUnit(u32);
7
8impl TextUnit {
9 /// The positional offset required for one character
10 pub fn len_of_char(c: char) -> TextUnit {
11 TextUnit(c.len_utf8() as u32)
12 }
13
14 #[allow(missing_docs)]
15 pub fn new(val: u32) -> TextUnit {
16 TextUnit(val)
17 }
18}
19
20impl fmt::Debug for TextUnit {
21 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
22 <Self as fmt::Display>::fmt(self, f)
23 }
24}
25
26impl fmt::Display for TextUnit {
27 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
28 self.0.fmt(f)
29 }
30}
31
32impl From<TextUnit> for u32 {
33 fn from(tu: TextUnit) -> u32 {
34 tu.0
35 }
36}
37
38impl From<u32> for TextUnit {
39 fn from(tu: u32) -> TextUnit {
40 TextUnit::new(tu)
41 }
42}
43
44impl ops::Add<TextUnit> for TextUnit {
45 type Output = TextUnit;
46 fn add(self, rhs: TextUnit) -> TextUnit {
47 TextUnit(self.0 + rhs.0)
48 }
49}
50
51impl ops::AddAssign<TextUnit> for TextUnit {
52 fn add_assign(&mut self, rhs: TextUnit) {
53 self.0 += rhs.0
54 }
55}
56
57impl ops::Sub<TextUnit> for TextUnit {
58 type Output = TextUnit;
59 fn sub(self, rhs: TextUnit) -> TextUnit {
60 TextUnit(self.0 - rhs.0)
61 }
62}
63
64impl ops::SubAssign<TextUnit> for TextUnit {
65 fn sub_assign(&mut self, rhs: TextUnit) {
66 self.0 -= rhs.0
67 }
68}
69
70/// A range of text in a source file
71#[derive(Clone, Copy, PartialEq, Eq)]
72pub struct TextRange {
73 start: TextUnit,
74 end: TextUnit,
75}
76
77impl fmt::Debug for TextRange {
78 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
79 <Self as fmt::Display>::fmt(self, f)
80 }
81}
82
83impl fmt::Display for TextRange {
84 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
85 write!(f, "[{}; {})", self.start(), self.end())
86 }
87}
88
89impl TextRange {
90 /// An length-0 range of text
91 pub fn empty() -> TextRange {
92 TextRange::from_to(TextUnit::new(0), TextUnit::new(0))
93 }
94
95 /// The left-inclusive range (`[from..to)`) between to points in the text
96 pub fn from_to(from: TextUnit, to: TextUnit) -> TextRange {
97 assert!(from <= to, "Invalid text range [{}; {})", from, to);
98 TextRange {
99 start: from,
100 end: to,
101 }
102 }
103
104 /// The range from some point over some length
105 pub fn from_len(from: TextUnit, len: TextUnit) -> TextRange {
106 TextRange::from_to(from, from + len)
107 }
108
109 /// The starting position of this range
110 pub fn start(&self) -> TextUnit {
111 self.start
112 }
113
114 /// The end position of this range
115 pub fn end(&self) -> TextUnit {
116 self.end
117 }
118
119 /// The length of this range
120 pub fn len(&self) -> TextUnit {
121 self.end - self.start
122 }
123
124 /// Is this range empty of any content?
125 pub fn is_empty(&self) -> bool {
126 self.start() == self.end()
127 }
128}
129
130impl ops::Index<TextRange> for str {
131 type Output = str;
132
133 fn index(&self, index: TextRange) -> &str {
134 &self[index.start().0 as usize..index.end().0 as usize]
135 }
136}