pub trait CastFrom<T> {
#[must_use = crate::doc::must_use_op!()]
fn cast_from(value: T) -> Self;
}
#[cfg(test)]
pub(crate) trait CastTo<U> {
fn cast_to(self) -> U;
}
#[cfg(test)]
impl<T, U> CastTo<U> for T
where
U: CastFrom<T>,
{
fn cast_to(self) -> U {
U::cast_from(self)
}
}
pub trait As {
fn as_<T>(self) -> T
where
T: CastFrom<Self>,
Self: Sized;
}
impl<U> As for U {
#[inline]
fn as_<T>(self) -> T
where
T: CastFrom<Self>,
Self: Sized,
{
T::cast_from(self)
}
}
macro_rules! primitive_cast_impl {
($from: ty as [$($ty: ty), *]) => {
$(
impl CastFrom<$from> for $ty {
#[inline]
fn cast_from(value: $from) -> Self {
value as Self
}
}
)*
};
}
macro_rules! multiple_impls {
($($from: ty), *) => {
$(
primitive_cast_impl!($from as [u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64]);
#[cfg(all(test, nightly))]
primitive_cast_impl!($from as [f16, f128]);
)*
};
}
primitive_cast_impl!(bool as [u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, bool]);
primitive_cast_impl!(char as [u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, char]);
primitive_cast_impl!(u8 as [u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64, char]);
multiple_impls!(
u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64
);
pub(crate) mod float;