Files
x/src/upcast.rs
2023-09-04 06:26:35 -04:00

79 lines
1.7 KiB
Rust

pub trait Upcast<T> {
fn upcast(self) -> T;
}
pub trait IntoUsize {
fn into_usize(self) -> usize;
}
macro_rules! gen_upcast {
($from:ty => $into:ty) => {
impl Upcast<$into> for $from {
fn upcast(self) -> $into {
self as $into
}
}
}
}
// Unsigned
gen_upcast!(u8 => u8);
gen_upcast!(u8 => u16);
gen_upcast!(u8 => u32);
gen_upcast!(u8 => u64);
gen_upcast!(u16 => u16);
gen_upcast!(u16 => u32);
gen_upcast!(u16 => u64);
gen_upcast!(u32 => u32);
gen_upcast!(u32 => u64);
gen_upcast!(u64 => u64);
// Signed
gen_upcast!(i8 => i8);
gen_upcast!(i8 => i16);
gen_upcast!(i8 => i32);
gen_upcast!(i8 => i64);
gen_upcast!(i16 => i16);
gen_upcast!(i16 => i32);
gen_upcast!(i16 => i64);
gen_upcast!(i32 => i32);
gen_upcast!(i32 => i64);
gen_upcast!(i64 => i64);
// Pointer Sized
gen_upcast!(u8 => usize);
gen_upcast!(i8 => isize);
gen_upcast!(u16 => usize);
gen_upcast!(i16 => isize);
#[cfg(any(target_pointer_width = "64", target_pointer_width = "32"))]
gen_upcast!(u32 => usize);
#[cfg(any(target_pointer_width = "64", target_pointer_width = "32"))]
gen_upcast!(i32 => isize);
gen_upcast!(isize => isize);
gen_upcast!(usize => usize);
impl IntoUsize for usize {
fn into_usize(self) -> usize { self }
}
impl<T> IntoUsize for *const T {
fn into_usize(self) -> usize { self as usize }
}
impl<T> IntoUsize for *mut T {
fn into_usize(self) -> usize { self as usize }
}
impl<T> IntoUsize for &T {
fn into_usize(self) -> usize { self as *const _ as usize }
}
impl<T> IntoUsize for &mut T {
fn into_usize(self) -> usize { self as *mut _ as usize }
}