pub type PositionComponent = u32;
#[derive(Clone, Copy, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct Position {
pub line: PositionComponent,
pub character: PositionComponent,
}
impl Position {
pub const MAX: Self = Self::new(PositionComponent::MAX, PositionComponent::MAX);
pub const MIN: Self = Self::new(PositionComponent::MIN, PositionComponent::MIN);
#[inline]
pub const fn new(line: PositionComponent, character: PositionComponent) -> Self {
Self { line, character }
}
#[inline]
pub fn offset(&mut self, lines: i32, characters: i32) {
self.line = self.line.saturating_add_signed(lines);
self.character = self.character.saturating_add_signed(characters);
}
#[inline]
pub fn set_line(&mut self, line: u32) {
self.line = line;
}
#[inline]
pub fn set_character(&mut self, character: u32) {
self.character = character;
}
#[inline]
pub fn is_in_bounds(self, start: Self, end: Self) -> bool {
self.is_after(start) & self.is_before(end)
}
#[inline]
pub fn is_after(self, position: Position) -> bool {
self.line > position.line
|| position.line == self.line && self.character >= position.character
}
#[inline]
pub fn is_before(self, position: Position) -> bool {
self.line < position.line
|| position.line == self.line && self.character <= position.character
}
}