From 4b07517d9f5cf448cd9de98086fb5b95340c752f Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Sat, 8 Apr 2023 22:15:11 +0400 Subject: [PATCH] Implement position structs --- src/lib.rs | 3 +++ src/pos.rs | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/lib.rs create mode 100644 src/pos.rs 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 + } +}