use std::ops::Range;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Span {
pub start: usize,
pub end: usize,
}
impl Span {
pub fn new_none() -> Self {
Self {
start: usize::MAX,
end: usize::MAX,
}
}
pub fn is_none(&self) -> bool {
self.start == usize::MAX
}
pub fn is_empty(&self) -> bool {
self.start == self.end
}
pub fn new_single(point: usize) -> Self {
Self {
start: point,
end: point + 1,
}
}
pub fn new(start: usize, end: usize) -> Self {
debug_assert!(start <= end);
Self { start, end }
}
pub fn merge(&self, other: &Self) -> Self {
Self {
start: self.start.min(other.start),
end: self.end.max(other.end),
}
}
pub fn merge_ordered(&self, right: &Self) -> Self {
Self {
start: self.start,
end: right.end,
}
}
pub fn try_merge(&self, other: &Self) -> Option<Self> {
let merged = self.merge(other);
if merged.end == usize::MAX {
None
} else {
Some(merged)
}
}
}
impl From<Range<usize>> for Span {
fn from(range: Range<usize>) -> Self {
Self {
start: range.start,
end: range.end,
}
}
}
impl Into<Range<usize>> for Span {
fn into(self) -> Range<usize> {
self.start..self.end
}
}