@@ -83,28 +83,22 @@ macro_rules! impl_uint_from_fill {
83
83
}
84
84
85
85
macro_rules! fill_via_chunks {
86
- ( $src: expr, $dst: expr, $size: expr) => ( {
86
+ ( $src: expr, $dst: expr, $ty : ty , $ size: expr) => ( {
87
87
let chunk_size_u8 = min( $src. len( ) * $size, $dst. len( ) ) ;
88
88
let chunk_size = ( chunk_size_u8 + $size - 1 ) / $size;
89
89
if cfg!( target_endian="little" ) {
90
- // Unsafe code copied from `byteorder::write_slice_native`.
91
90
unsafe {
92
91
copy_nonoverlapping(
93
92
$src. as_ptr( ) as * const u8 ,
94
93
$dst. as_mut_ptr( ) ,
95
94
chunk_size_u8) ;
96
95
}
97
96
} else {
98
- // Unsafe code copied from `byteorder::write_slice` and
99
- // `byteorder::write_num_bytes`, with the addition to copy only
100
- // `chunk.len()`.
101
- // Byteorder assumes we want to copy only complete integers, while
102
- // for us the destination may need only a part of the last integer.
103
97
for ( & n, chunk) in $src. iter( ) . zip( $dst. chunks_mut( $size) ) {
98
+ let tmp = n. to_le( ) ;
99
+ let src_ptr = & tmp as * const $ty as * const u8 ;
104
100
unsafe {
105
- // N.B. https://github.com/rust-lang/rust/issues/22776
106
- let bytes = transmute:: <_, [ u8 ; $size] >( n. to_le( ) ) ;
107
- copy_nonoverlapping( ( & bytes) . as_ptr( ) ,
101
+ copy_nonoverlapping( src_ptr,
108
102
chunk. as_mut_ptr( ) ,
109
103
chunk. len( ) ) ;
110
104
}
@@ -146,7 +140,7 @@ macro_rules! fill_via_chunks {
146
140
/// }
147
141
/// ```
148
142
pub fn fill_via_u32_chunks ( src : & [ u32 ] , dest : & mut [ u8 ] ) -> ( usize , usize ) {
149
- fill_via_chunks ! ( src, dest, 4 )
143
+ fill_via_chunks ! ( src, dest, u32 , 4 )
150
144
}
151
145
152
146
/// Implement `fill_bytes` by reading chunks from the output buffer of a block
@@ -160,7 +154,7 @@ pub fn fill_via_u32_chunks(src: &[u32], dest: &mut [u8]) -> (usize, usize) {
160
154
///
161
155
/// See `fill_via_u32_chunks` for an example.
162
156
pub fn fill_via_u64_chunks ( src : & [ u64 ] , dest : & mut [ u8 ] ) -> ( usize , usize ) {
163
- fill_via_chunks ! ( src, dest, 8 )
157
+ fill_via_chunks ! ( src, dest, u64 , 8 )
164
158
}
165
159
166
160
/// Implement `next_u32` via `fill_bytes`, little-endian order.
0 commit comments