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
38
39
40
41
42
43
44
// Copyright (c) 2016-2017 <daggerbot@gmail.com>
// This software is available under the terms of the zlib license.
// See COPYING.md for more information.

/// Trait for raw conversion using the `as` operator.
pub trait RawFrom<F: Sized>: Sized {
    fn raw_from (other: F) -> Self;
}

macro_rules! impl_raw_from {
    { $($($f:ty),* => $t:ty;)* } => { $($(
        impl RawFrom<$f> for $t {
            #[inline(always)]
            fn raw_from (other: $f) -> $t { other as $t }
        }
    )*)* };
}

impl_raw_from! {
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => i8;
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => i16;
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => i32;
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => i64;
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => isize;
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => u8;
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => u16;
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => u32;
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => u64;
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => usize;
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => f32;
    i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64 => f64;
}

/// Trait for raw conversion using the `as` operator.
///
/// Wraps `RawFrom`.
pub trait RawInto<T: Sized>: Sized {
    fn raw_into (self) -> T;
}

impl<F: Sized, T: RawFrom<F>> RawInto<T> for F {
    #[inline(always)]
    fn raw_into (self) -> T { T::raw_from(self) }
}