closed_interval_set/
range_case.rsuse alloc::vec::Vec;
use smallvec::SmallVec;
use crate::Backing;
use crate::Endpoint;
use crate::RangeVec;
pub struct RangeCase<T: Endpoint> {
inner: Backing<T>,
normalized: bool,
}
impl<T: Endpoint> RangeCase<T> {
#[inline(always)]
pub fn from_vec(inner: Vec<(T, T)>) -> Self {
Self {
inner: inner.into(),
normalized: false,
}
}
#[inline(always)]
pub fn from_smallvec<const N: usize>(inner: SmallVec<[(T, T); N]>) -> Self {
#[cfg_attr(
not(feature = "inline_storage"),
allow(clippy::absurd_extreme_comparisons)
)]
let inner: Backing<T> = if inner.len() <= crate::INLINE_SIZE {
inner.into_iter().collect()
} else {
inner.into_vec().into()
};
Self {
inner,
normalized: false,
}
}
#[inline(always)]
pub fn from_range_vec(set: RangeVec<T>) -> Self {
Self {
inner: set.into_inner(),
normalized: true,
}
}
#[inline(always)]
pub fn into_inner(self) -> Backing<T> {
self.inner
}
#[inline(always)]
pub fn unerase(self) -> Result<RangeVec<T>, Backing<T>> {
if self.normalized {
Ok(unsafe { RangeVec::new_unchecked(self.inner) })
} else {
Err(self.inner)
}
}
}
impl<T: Endpoint> From<RangeVec<T>> for RangeCase<T> {
#[inline(always)]
fn from(item: RangeVec<T>) -> RangeCase<T> {
RangeCase::from_range_vec(item)
}
}
impl<T: Endpoint> From<Vec<(T, T)>> for RangeCase<T> {
#[inline(always)]
fn from(item: Vec<(T, T)>) -> RangeCase<T> {
RangeCase::from_vec(item)
}
}
impl<T: Endpoint, const N: usize> From<SmallVec<[(T, T); N]>> for RangeCase<T> {
#[inline(always)]
fn from(item: SmallVec<[(T, T); N]>) -> RangeCase<T> {
RangeCase::from_smallvec(item)
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[test]
fn test_smoke() {
use alloc::vec;
use smallvec::smallvec;
let x: RangeCase<_> = vec![(1u8, 2u8)].into();
assert_eq!(x.into_inner().into_vec(), vec![(1u8, 2u8)]);
let smallvec: Backing<u8> = smallvec![(1u8, 2u8)];
let x: RangeCase<_> = smallvec.into();
assert_eq!(x.unerase().unwrap_err().into_vec(), vec![(1u8, 2u8)]);
let smallervec: SmallVec<[(u8, u8); 0]> = smallvec![(1u8, 2u8)];
let x: RangeCase<_> = smallervec.into();
assert_eq!(x.unerase().unwrap_err().into_vec(), vec![(1u8, 2u8)]);
let largervec: SmallVec<[(u8, u8); crate::INLINE_SIZE + 1]> = smallvec![(1u8, 2u8)];
let x: RangeCase<_> = largervec.into();
assert_eq!(x.unerase().unwrap_err().into_vec(), vec![(1u8, 2u8)]);
let vec = unsafe { RangeVec::new_unchecked(smallvec![(1u8, 2u8)]) };
let x: RangeCase<_> = vec.clone().into();
assert_eq!(x.unerase().unwrap(), vec);
}