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]
}