@@ -46,12 +46,8 @@ pub struct LittleEndian;
46
46
macro_rules! generate_load {
47
47
( $name: ident, $int_type: ident, $from_func: ident) => (
48
48
fn $name( buf: & [ u8 ] , offset: usize ) -> $int_type {
49
- // Check if the specified range of the slice is valid
50
- // before transmute(). This will also detect the
51
- // wrap-around of (offset + size_of) in the release mode.
52
- let buf = & buf[ offset .. offset + mem:: size_of:: <$int_type>( ) ] ;
53
- let ptr = buf. as_ptr( ) as * const $int_type;
54
- let num = unsafe { mem:: transmute( * ptr) } ;
49
+ let mut num = [ 0u8 ; mem:: size_of:: <$int_type>( ) ] ;
50
+ num. copy_from_slice( & buf[ offset .. offset + mem:: size_of:: <$int_type>( ) ] ) ;
55
51
$int_type:: $from_func( num)
56
52
}
57
53
)
@@ -61,29 +57,28 @@ macro_rules! generate_write {
61
57
( $name: ident, $int_type: ident, $type_size: expr, $to_func: ident) => (
62
58
fn $name<W >( w: & mut W , num: $int_type)
63
59
-> io:: Result <( ) > where W : io:: Write {
64
- let buf: [ u8 ; $type_size] =
65
- unsafe { mem:: transmute( num. $to_func( ) ) } ;
60
+ let buf = num. $to_func( ) ;
66
61
w. write_all( & buf)
67
62
}
68
63
)
69
64
}
70
65
71
66
impl Endian for BigEndian {
72
- generate_load ! ( loadu16, u16 , from_be ) ;
73
- generate_load ! ( loadu32, u32 , from_be ) ;
74
- generate_load ! ( loadu64, u64 , from_be ) ;
75
- generate_write ! ( writeu16, u16 , 2 , to_be ) ;
76
- generate_write ! ( writeu32, u32 , 4 , to_be ) ;
77
- generate_write ! ( writeu64, u64 , 8 , to_be ) ;
67
+ generate_load ! ( loadu16, u16 , from_be_bytes ) ;
68
+ generate_load ! ( loadu32, u32 , from_be_bytes ) ;
69
+ generate_load ! ( loadu64, u64 , from_be_bytes ) ;
70
+ generate_write ! ( writeu16, u16 , 2 , to_be_bytes ) ;
71
+ generate_write ! ( writeu32, u32 , 4 , to_be_bytes ) ;
72
+ generate_write ! ( writeu64, u64 , 8 , to_be_bytes ) ;
78
73
}
79
74
80
75
impl Endian for LittleEndian {
81
- generate_load ! ( loadu16, u16 , from_le ) ;
82
- generate_load ! ( loadu32, u32 , from_le ) ;
83
- generate_load ! ( loadu64, u64 , from_le ) ;
84
- generate_write ! ( writeu16, u16 , 2 , to_le ) ;
85
- generate_write ! ( writeu32, u32 , 4 , to_le ) ;
86
- generate_write ! ( writeu64, u64 , 8 , to_le ) ;
76
+ generate_load ! ( loadu16, u16 , from_le_bytes ) ;
77
+ generate_load ! ( loadu32, u32 , from_le_bytes ) ;
78
+ generate_load ! ( loadu64, u64 , from_le_bytes ) ;
79
+ generate_write ! ( writeu16, u16 , 2 , to_le_bytes ) ;
80
+ generate_write ! ( writeu32, u32 , 4 , to_le_bytes ) ;
81
+ generate_write ! ( writeu64, u64 , 8 , to_le_bytes ) ;
87
82
}
88
83
89
84
#[ cfg( test) ]
0 commit comments