@@ -111,13 +111,15 @@ pub struct LineRanges {
111111 largest_upper_bound: usize,
112112}
113113
114−impl Default for LineRanges {
115− fn default() -> Self {
116− LineRanges::from(vec![LineRange { lower: 0, upper: 0 }])
114+impl LineRanges {
115+ pub fn none() -> LineRanges {
116+ LineRanges::from(vec![])
117+ }
118+
119+ pub fn all() -> LineRanges {
120+ LineRanges::from(vec![LineRange::default()])
117121 }
118−}
119122
120−impl LineRanges {
121123 pub fn from(ranges: Vec<LineRange>) -> LineRanges {
122124 let largest_upper_bound = ranges
123125 .iter()
@@ -131,7 +133,7 @@ impl LineRanges {
131133 }
132134
133135 pub fn check(&self, line: usize) -> RangeCheckResult {
134− if self.ranges.is_empty() || self.ranges.iter().any(|r| r.is_inside(line)) {
136+ if self.ranges.iter().any(|r| r.is_inside(line)) {
135137 RangeCheckResult::InRange
136138 } else if line < self.largest_upper_bound {
137139 RangeCheckResult::BeforeOrBetweenRanges
@@ -141,6 +143,23 @@ impl LineRanges {
141143 }
142144}
143145
146+impl Default for LineRanges {
147+ fn default() -> Self {
148+ Self::all()
149+ }
150+}
151+
152+/// Similar to LineRanges, but "empty" by default
153+#[derive(Debug, Clone)]
154+pub struct HighlightedLineRanges(pub LineRanges);
155+
156+impl Default for HighlightedLineRanges {
157+ fn default() -> Self {
158+ HighlightedLineRanges(LineRanges::none())
159+ }
160+}
161+
162+
144163#[cfg(test)]
145164fn ranges(rs: &[&str]) -> LineRanges {
146165 LineRanges::from(rs.iter().map(|r| LineRange::from(r).unwrap()).collect())
@@ -189,8 +208,15 @@ fn test_ranges_open_high() {
189208}
190209
191210#[test]
192−fn test_ranges_empty() {
193− let ranges = ranges(&[]);
211+fn test_ranges_all() {
212+ let ranges = LineRanges::all();
194213
195214 assert_eq!(RangeCheckResult::InRange, ranges.check(1));
196215}
216+
217+#[test]
218+fn test_ranges_none() {
219+ let ranges = LineRanges::none();
220+
221+ assert_ne!(RangeCheckResult::InRange, ranges.check(1));
222+}