1pub type PositionComponent = u32;
5
6#[derive(Clone, Copy, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
9#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
10pub struct Position {
11 pub line: PositionComponent,
13
14 pub character: PositionComponent,
17}
18
19impl Position {
20 pub const MAX: Self = Self::new(PositionComponent::MAX, PositionComponent::MAX);
22
23 pub const MIN: Self = Self::new(PositionComponent::MIN, PositionComponent::MIN);
25
26 #[inline]
28 pub const fn new(line: PositionComponent, character: PositionComponent) -> Self {
29 Self { line, character }
30 }
31
32 #[inline]
36 pub fn offset(&mut self, lines: i32, characters: i32) {
37 self.line = self.line.saturating_add_signed(lines);
38 self.character = self.character.saturating_add_signed(characters);
39 }
40
41 #[inline]
43 pub fn set_line(&mut self, line: u32) {
44 self.line = line;
45 }
46
47 #[inline]
49 pub fn set_character(&mut self, character: u32) {
50 self.character = character;
51 }
52
53 #[inline]
55 pub fn is_in_bounds(self, start: Self, end: Self) -> bool {
56 self.is_after(start) & self.is_before(end)
57 }
58
59 #[inline]
61 pub fn is_after(self, position: Position) -> bool {
62 self.line > position.line
63 || position.line == self.line && self.character >= position.character
64 }
65
66 #[inline]
68 pub fn is_before(self, position: Position) -> bool {
69 self.line < position.line
70 || position.line == self.line && self.character <= position.character
71 }
72}