diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..d75311a --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,3 @@ +mod pos; + +pub use pos::*; diff --git a/src/pos.rs b/src/pos.rs new file mode 100644 index 0000000..632385e --- /dev/null +++ b/src/pos.rs @@ -0,0 +1,55 @@ +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub struct LinePos { + index: usize, + lineno: usize, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub struct CharPos { + line: LinePos, + col: usize, +} + +impl LinePos { + pub fn new(index: usize, lineno: usize) -> Self { + assert!(lineno >= 1); + Self { index, lineno } + } + + pub fn index(&self) -> usize { + self.index + } + + pub fn lineno(&self) -> usize { + self.lineno + } +} + +impl CharPos { + pub fn new(line: &LinePos, col: usize) -> Self { + assert!(col >= 1); + Self { line: *line, col } + } + + pub fn line(&self) -> LinePos { + self.line + } + + pub fn index(&self) -> usize { + self.line.index + } + + pub fn lineno(&self) -> usize { + self.line.lineno + } + + pub fn col(&self) -> usize { + self.col + } +} + +impl From for LinePos { + fn from(char_pos: CharPos) -> Self { + char_pos.line + } +}