use crate::{BoundedRange, LowerBound, Step, UpperBound};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use std::marker::PhantomData;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
pub struct EmptyRange<T> {
t: PhantomData<T>,
}
impl<T> From<EmptyRange<T>> for std::ops::Range<T>
where
T: Default,
{
fn from(_r: EmptyRange<T>) -> Self {
Default::default()
}
}
impl<T> From<EmptyRange<T>> for std::ops::RangeInclusive<T>
where
T: Copy + Default + Step,
{
fn from(_: EmptyRange<T>) -> Self {
let r = BoundedRange {
start: LowerBound::included(T::default()),
end: UpperBound::excluded(T::default()),
};
r.into()
}
}
impl<T> IntoIterator for EmptyRange<T> {
type IntoIter = std::iter::Empty<T>;
type Item = T;
fn into_iter(self) -> Self::IntoIter {
std::iter::empty()
}
}
impl<T> EmptyRange<T> {
pub fn new() -> Self {
Self {
t: PhantomData::default(),
}
}
pub fn contains(&self, _: T) -> bool {
false
}
}