use std::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive};
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
pub struct TimesRange(usize, usize);
impl TimesRange {
pub fn can_call(&self, x: usize) -> bool {
x + 1 < self.1
}
pub fn contains(&self, x: usize) -> bool {
self.0 <= x && x < self.1
}
pub fn is_exact(&self) -> bool {
(self.1 - self.0) == 1
}
pub fn lower_bound(&self) -> usize {
self.0
}
pub fn upper_bound(&self) -> usize {
self.1
}
}
impl Default for TimesRange {
fn default() -> TimesRange {
TimesRange(0, usize::MAX)
}
}
impl From<usize> for TimesRange {
fn from(n: usize) -> TimesRange {
TimesRange(n, n + 1)
}
}
impl From<Range<usize>> for TimesRange {
fn from(r: Range<usize>) -> TimesRange {
assert!(r.end > r.start, "backwards range");
TimesRange(r.start, r.end)
}
}
impl From<RangeFrom<usize>> for TimesRange {
fn from(r: RangeFrom<usize>) -> TimesRange {
TimesRange(r.start, usize::MAX)
}
}
impl From<RangeFull> for TimesRange {
fn from(_: RangeFull) -> TimesRange {
TimesRange(0, usize::MAX)
}
}
impl From<RangeInclusive<usize>> for TimesRange {
fn from(r: RangeInclusive<usize>) -> TimesRange {
assert!(r.end() >= r.start(), "backwards range");
TimesRange(*r.start(), *r.end() + 1)
}
}
impl From<RangeTo<usize>> for TimesRange {
fn from(r: RangeTo<usize>) -> TimesRange {
TimesRange(0, r.end)
}
}
impl From<RangeToInclusive<usize>> for TimesRange {
fn from(r: RangeToInclusive<usize>) -> TimesRange {
TimesRange(0, r.end + 1)
}
}