use std::ops::Bound::{self, *};
use std::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive};
pub trait IsRangeEmpty {
fn is_range_empty(&self) -> bool;
}
impl IsRangeEmpty for RangeFull {
#[inline]
fn is_range_empty(&self) -> bool {
false
}
}
impl<N> IsRangeEmpty for RangeFrom<N> {
#[inline]
fn is_range_empty(&self) -> bool {
false
}
}
impl<N> IsRangeEmpty for RangeTo<N> {
#[inline]
fn is_range_empty(&self) -> bool {
false
}
}
impl<N> IsRangeEmpty for RangeToInclusive<N> {
#[inline]
fn is_range_empty(&self) -> bool {
false
}
}
impl<N: PartialOrd> IsRangeEmpty for Range<N> {
#[inline]
fn is_range_empty(&self) -> bool {
self.start >= self.end
}
}
impl<N: PartialOrd> IsRangeEmpty for RangeInclusive<N> {
#[inline]
fn is_range_empty(&self) -> bool {
self.start() > self.end()
}
}
impl<N: PartialOrd> IsRangeEmpty for (Bound<N>, Bound<N>) {
fn is_range_empty(&self) -> bool {
match self {
(Included(l), Included(r)) => l > r,
(Included(l), Excluded(r)) |
(Excluded(l), Included(r)) |
(Excluded(l), Excluded(r)) => l >= r,
_ => false,
}
}
}