textlane_core/models/
position.rs1#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
3pub struct Point(u32);
4
5const VIRTUAL_SHIFT: u32 = 30;
7const OFFSET_MASK: u32 = (1 << VIRTUAL_SHIFT) - 1;
8
9impl Point {
10 pub const MAX_OFFSET: usize = OFFSET_MASK as usize;
12
13 pub fn new(offset: usize, virtual_spaces: usize) -> Self {
14 let offset = offset.min(Self::MAX_OFFSET) as u32;
15 let virtual_spaces = virtual_spaces.min(3) as u32;
16 Self(offset | (virtual_spaces << VIRTUAL_SHIFT))
17 }
18
19 pub fn offset(self) -> usize {
20 (self.0 & OFFSET_MASK) as usize
21 }
22
23 pub fn virtual_spaces(self) -> usize {
24 (self.0 >> VIRTUAL_SHIFT) as usize
25 }
26}
27
28#[derive(Clone, Copy, Debug, PartialEq)]
31pub enum Position<'a> {
32 Span { start: Point, end: Point },
33 Unist(&'a UnistPosition),
34}
35
36#[derive(Clone, Debug, PartialEq, Eq)]
38pub struct UnistPosition {
39 pub start: UnistPoint,
40 pub end: UnistPoint,
41}
42
43#[derive(Clone, Copy, Debug, PartialEq, Eq)]
45pub struct UnistPoint {
46 pub line: usize,
47 pub column: usize,
48 pub offset: Option<usize>,
49}
50
51impl<'a> Position<'a> {
52 pub fn span(start: Point, end: Point) -> Self {
53 Self::Span { start, end }
54 }
55}