#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Point(u32);
const VIRTUAL_SHIFT: u32 = 30;
const OFFSET_MASK: u32 = (1 << VIRTUAL_SHIFT) - 1;
impl Point {
pub const MAX_OFFSET: usize = OFFSET_MASK as usize;
pub fn new(offset: usize, virtual_spaces: usize) -> Self {
let offset = offset.min(Self::MAX_OFFSET) as u32;
let virtual_spaces = virtual_spaces.min(3) as u32;
Self(offset | (virtual_spaces << VIRTUAL_SHIFT))
}
pub fn offset(self) -> usize {
(self.0 & OFFSET_MASK) as usize
}
pub fn virtual_spaces(self) -> usize {
(self.0 >> VIRTUAL_SHIFT) as usize
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Position<'a> {
Span { start: Point, end: Point },
Unist(&'a UnistPosition),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct UnistPosition {
pub start: UnistPoint,
pub end: UnistPoint,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct UnistPoint {
pub line: usize,
pub column: usize,
pub offset: Option<usize>,
}
impl<'a> Position<'a> {
pub fn span(start: Point, end: Point) -> Self {
Self::Span { start, end }
}
}