use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq, Serialize, Deserialize)]
pub struct Span {
pub start: usize,
pub end: usize,
}
impl Span {
#[inline]
pub fn new(start: usize, end: usize) -> Self {
Span { start, end }
}
#[inline]
pub fn is_empty(&self) -> bool {
self.start >= self.end
}
#[inline]
pub fn len(&self) -> usize {
self.end.saturating_sub(self.start)
}
#[inline]
pub fn range(self) -> std::ops::Range<usize> {
self.start..self.end
}
}
impl<T> From<std::ops::Range<T>> for Span
where
T: Into<usize>,
{
fn from(range: std::ops::Range<T>) -> Self {
Span {
start: range.start.into(),
end: range.end.into(),
}
}
}
impl<T> From<std::ops::RangeInclusive<T>> for Span
where
T: Into<usize> + Copy,
{
fn from(range: std::ops::RangeInclusive<T>) -> Self {
Span {
start: (*range.start()).into(),
end: (*range.end()).into() + 1,
}
}
}
impl<T> From<Span> for std::ops::Range<T>
where
T: From<usize>,
{
fn from(span: Span) -> Self {
span.start.into()..span.end.into()
}
}
impl<T> From<Span> for std::ops::RangeInclusive<T>
where
T: From<usize> + Copy,
{
fn from(span: Span) -> Self {
span.start.into()..=span.end.into()
}
}
impl std::fmt::Display for Span {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}..{}", self.start, self.end)
}
}