Skip to content

Commit 368cb55

Browse files
mina86BurntSushi
authored andcommitted
impl: refactor write_slice macro slightly
Firstly, get rid of $size argument. The size can be determined from $ty so there’s no need to pass it as a separate argument. Secondly, change it to use to_xx_bytes methods instead of Self::write_uxx so that it resembles read_slice.
1 parent c01f0fe commit 368cb55

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

src/lib.rs

+20-14
Original file line numberDiff line numberDiff line change
@@ -1932,13 +1932,19 @@ macro_rules! read_slice {
19321932
}};
19331933
}
19341934

1935+
/// Copies a &[$ty] $src into a &mut [u8] $dst for the endianness given by
1936+
/// $from_bytes (must be either from_be_bytes or from_le_bytes).
1937+
///
1938+
/// Panics if $src.len() * size_of::<$ty>() != $dst.len().
19351939
macro_rules! write_slice {
1936-
($src:expr, $dst:expr, $ty:ty, $size:expr, $write:expr) => {{
1937-
assert!($size == ::core::mem::size_of::<$ty>());
1938-
assert_eq!($size * $src.len(), $dst.len());
1939-
1940-
for (&n, chunk) in $src.iter().zip($dst.chunks_mut($size)) {
1941-
$write(chunk, n);
1940+
($src:expr, $dst:expr, $ty:ty, $to_bytes:ident) => {{
1941+
const SIZE: usize = core::mem::size_of::<$ty>();
1942+
// Check types:
1943+
let src: &[$ty] = $src;
1944+
let dst: &mut [u8] = $dst;
1945+
assert_eq!(src.len() * SIZE, dst.len());
1946+
for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) {
1947+
dst.copy_from_slice(&src.$to_bytes());
19421948
}
19431949
}};
19441950
}
@@ -2064,22 +2070,22 @@ impl ByteOrder for BigEndian {
20642070

20652071
#[inline]
20662072
fn write_u16_into(src: &[u16], dst: &mut [u8]) {
2067-
write_slice!(src, dst, u16, 2, Self::write_u16);
2073+
write_slice!(src, dst, u16, to_be_bytes);
20682074
}
20692075

20702076
#[inline]
20712077
fn write_u32_into(src: &[u32], dst: &mut [u8]) {
2072-
write_slice!(src, dst, u32, 4, Self::write_u32);
2078+
write_slice!(src, dst, u32, to_be_bytes);
20732079
}
20742080

20752081
#[inline]
20762082
fn write_u64_into(src: &[u64], dst: &mut [u8]) {
2077-
write_slice!(src, dst, u64, 8, Self::write_u64);
2083+
write_slice!(src, dst, u64, to_be_bytes);
20782084
}
20792085

20802086
#[inline]
20812087
fn write_u128_into(src: &[u128], dst: &mut [u8]) {
2082-
write_slice!(src, dst, u128, 16, Self::write_u128);
2088+
write_slice!(src, dst, u128, to_be_bytes);
20832089
}
20842090

20852091
#[inline]
@@ -2248,22 +2254,22 @@ impl ByteOrder for LittleEndian {
22482254

22492255
#[inline]
22502256
fn write_u16_into(src: &[u16], dst: &mut [u8]) {
2251-
write_slice!(src, dst, u16, 2, Self::write_u16);
2257+
write_slice!(src, dst, u16, to_le_bytes);
22522258
}
22532259

22542260
#[inline]
22552261
fn write_u32_into(src: &[u32], dst: &mut [u8]) {
2256-
write_slice!(src, dst, u32, 4, Self::write_u32);
2262+
write_slice!(src, dst, u32, to_le_bytes);
22572263
}
22582264

22592265
#[inline]
22602266
fn write_u64_into(src: &[u64], dst: &mut [u8]) {
2261-
write_slice!(src, dst, u64, 8, Self::write_u64);
2267+
write_slice!(src, dst, u64, to_le_bytes);
22622268
}
22632269

22642270
#[inline]
22652271
fn write_u128_into(src: &[u128], dst: &mut [u8]) {
2266-
write_slice!(src, dst, u128, 16, Self::write_u128);
2272+
write_slice!(src, dst, u128, to_le_bytes);
22672273
}
22682274

22692275
#[inline]

0 commit comments

Comments
 (0)