pub trait To<T> {
fn to(self) -> T;
}
impl<T> To<T> for T {
#[inline(always)]
fn to(self) -> Self {
self
}
}
macro_rules! impl_to {
($ty1:ty, $($ty:ty,)*) => {
$(
impl To<$ty> for $ty1 {
#[inline(always)]
fn to(self) -> $ty {
self as $ty
}
}
impl To<$ty1> for $ty {
#[inline(always)]
fn to(self) -> $ty1 {
self as $ty1
}
}
)*
impl_to!($($ty,)*);
};
() => {};
}
impl_to!(u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, f32, f64,);
#[cfg(feature = "half")]
mod half_impl {
use super::*;
macro_rules! impl_to_half {
($ty1:ty, $($ty:ty,)*) => {
impl To<half::f16> for $ty1 {
#[inline(always)]
fn to(self) -> half::f16 {
(self as f32).to()
}
}
impl To<half::bf16> for $ty1 {
#[inline(always)]
fn to(self) -> half::bf16 {
(self as f32).to()
}
}
impl To<$ty1> for half::f16 {
#[inline(always)]
fn to(self) -> $ty1 {
self.to_f32().to()
}
}
impl To<$ty1> for half::bf16 {
#[inline(always)]
fn to(self) -> $ty1 {
self.to_f32().to()
}
}
impl_to_half!($($ty,)*);
};
() => {};
}
impl_to_half!(u8, i8, u16, i16, u32, i32, u64, i64, u128, i128,);
impl To<half::f16> for f32 {
#[inline(always)]
fn to(self) -> half::f16 {
half::f16::from_f32(self)
}
}
impl To<half::bf16> for f32 {
#[inline(always)]
fn to(self) -> half::bf16 {
half::bf16::from_f32(self)
}
}
impl To<half::f16> for f64 {
#[inline(always)]
fn to(self) -> half::f16 {
half::f16::from_f64(self)
}
}
impl To<half::bf16> for f64 {
#[inline(always)]
fn to(self) -> half::bf16 {
half::bf16::from_f64(self)
}
}
impl To<f32> for half::f16 {
#[inline(always)]
fn to(self) -> f32 {
self.to_f32()
}
}
impl To<f32> for half::bf16 {
#[inline(always)]
fn to(self) -> f32 {
self.to_f32()
}
}
impl To<f64> for half::f16 {
#[inline(always)]
fn to(self) -> f64 {
self.to_f64()
}
}
impl To<f64> for half::bf16 {
#[inline(always)]
fn to(self) -> f64 {
self.to_f64()
}
}
}