Skip to content

Commit 027e030

Browse files
committed
Slightly simplify unsafe code
1 parent cdc09e5 commit 027e030

File tree

1 file changed

+6
-12
lines changed

1 file changed

+6
-12
lines changed

src/impls.rs

+6-12
Original file line numberDiff line numberDiff line change
@@ -83,28 +83,22 @@ macro_rules! impl_uint_from_fill {
8383
}
8484

8585
macro_rules! fill_via_chunks {
86-
($src:expr, $dst:expr, $size:expr) => ({
86+
($src:expr, $dst:expr, $ty:ty, $size:expr) => ({
8787
let chunk_size_u8 = min($src.len() * $size, $dst.len());
8888
let chunk_size = (chunk_size_u8 + $size - 1) / $size;
8989
if cfg!(target_endian="little") {
90-
// Unsafe code copied from `byteorder::write_slice_native`.
9190
unsafe {
9291
copy_nonoverlapping(
9392
$src.as_ptr() as *const u8,
9493
$dst.as_mut_ptr(),
9594
chunk_size_u8);
9695
}
9796
} 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.
10397
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;
104100
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,
108102
chunk.as_mut_ptr(),
109103
chunk.len());
110104
}
@@ -146,7 +140,7 @@ macro_rules! fill_via_chunks {
146140
/// }
147141
/// ```
148142
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)
150144
}
151145

152146
/// 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) {
160154
///
161155
/// See `fill_via_u32_chunks` for an example.
162156
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)
164158
}
165159

166160
/// Implement `next_u32` via `fill_bytes`, little-endian order.

0 commit comments

Comments
 (0)