1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
pub trait PosPow<Rhs = u32> { type Output; fn pow(self, rhs: Rhs) -> Self::Output; } macro_rules! impl_pow { ($($set:ty => [$method:expr => $rhs:ty | $from:ty]);+) => { $( impl PosPow<$rhs> for $set { type Output = $set; #[inline] fn pow(self, rhs: $rhs) -> $set { ($method)(self, rhs as $from) } } )* } } impl_pow! { u8 => [u8::pow => u32 | u32]; u16 => [u16::pow => u32 | u32]; u32 => [u32::pow => u32 | u32]; u64 => [u64::pow => u32 | u32]; i8 => [i8::pow => u32 | u32]; i16 => [i16::pow => u32 | u32]; i32 => [i32::pow => u32 | u32]; i64 => [i64::pow => u32 | u32]; u128 => [u128::pow => u32 | u32]; i128 => [i128::pow => u32 | u32]; usize => [usize::pow => u32 | u32]; isize => [isize::pow => u32 | u32]; f32 => [f32::powi => u32 | i32]; f64 => [f64::powi => u32 | i32] }