1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
#![allow(dead_code)] use std::fmt; #[derive(Copy, Clone)] pub struct Range(isize, isize); const INVALID_INDEX: isize = -1; #[inline] pub fn new() -> Range { Range(INVALID_INDEX, INVALID_INDEX) } #[inline] pub fn with_start(pos: isize) -> Range { Range(pos, pos) } #[inline] pub fn with_start_end(start: isize, end: isize) -> Range { Range(start, end) } impl Range { pub fn below(&self, pos: isize) -> bool { return (self.0 - 1) == pos; } pub fn start_pos(&mut self, pos: isize) { self.0 = pos; } #[inline] pub fn start(&self) -> isize { self.0 } #[inline] pub fn end(&self) -> isize { self.1 } } impl fmt::Display for Range { fn fmt(&self, f: &mut fmt::Formatter ) -> fmt::Result { let mut buffer = "".to_string(); if self.0 != INVALID_INDEX { buffer.push_str(&format!("{:3}", self.0 + 1)); if self.1 != INVALID_INDEX { if self.1 != self.0 { buffer.push_str(&format!(",{:<3}", self.1 + 1)); } else { buffer.push_str(&format!(",{:<3}", "-")); } } } write!(f, "({})", buffer) } }