#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "facet", derive(facet::Facet))]
pub struct Span {
pub start: u32,
pub end: u32,
}
impl Span {
#[inline]
pub fn new(start: u32, end: u32) -> Self {
debug_assert!(start <= end);
Self { start, end }
}
#[inline]
pub fn empty(pos: u32) -> Self {
Self {
start: pos,
end: pos,
}
}
#[inline]
pub fn len(&self) -> u32 {
self.end - self.start
}
#[inline]
pub fn is_empty(&self) -> bool {
self.start == self.end
}
#[inline]
pub fn extend(&self, other: Span) -> Span {
Span {
start: self.start.min(other.start),
end: self.end.max(other.end),
}
}
#[inline]
pub fn slice<'a>(&self, source: &'a str) -> &'a str {
&source[self.start as usize..self.end as usize]
}
}
impl From<std::ops::Range<u32>> for Span {
fn from(range: std::ops::Range<u32>) -> Self {
Span::new(range.start, range.end)
}
}
impl From<Span> for std::ops::Range<usize> {
fn from(span: Span) -> Self {
span.start as usize..span.end as usize
}
}