1#![deny(missing_docs)]
71#![cfg_attr(not(feature = "std"), no_std)]
72#![cfg_attr(miri, allow(dead_code, unused_macros))]
75
76use core::{
77 convert::TryInto, fmt::Debug, hash::Hash, mem::align_of,
78 ptr::copy_nonoverlapping, slice,
79};
80
81#[cfg(feature = "std")]
82pub use crate::io::{ReadBytesExt, WriteBytesExt};
83
84#[cfg(feature = "std")]
85mod io;
86
87#[inline]
88fn extend_sign(val: u64, nbytes: usize) -> i64 {
89 let shift = (8 - nbytes) * 8;
90 (val << shift) as i64 >> shift
91}
92
93#[inline]
94fn extend_sign128(val: u128, nbytes: usize) -> i128 {
95 let shift = (16 - nbytes) * 8;
96 (val << shift) as i128 >> shift
97}
98
99#[inline]
100fn unextend_sign(val: i64, nbytes: usize) -> u64 {
101 let shift = (8 - nbytes) * 8;
102 (val << shift) as u64 >> shift
103}
104
105#[inline]
106fn unextend_sign128(val: i128, nbytes: usize) -> u128 {
107 let shift = (16 - nbytes) * 8;
108 (val << shift) as u128 >> shift
109}
110
111#[inline]
112fn pack_size(n: u64) -> usize {
113 if n < 1 << 8 {
114 1
115 } else if n < 1 << 16 {
116 2
117 } else if n < 1 << 24 {
118 3
119 } else if n < 1 << 32 {
120 4
121 } else if n < 1 << 40 {
122 5
123 } else if n < 1 << 48 {
124 6
125 } else if n < 1 << 56 {
126 7
127 } else {
128 8
129 }
130}
131
132#[inline]
133fn pack_size128(n: u128) -> usize {
134 if n < 1 << 8 {
135 1
136 } else if n < 1 << 16 {
137 2
138 } else if n < 1 << 24 {
139 3
140 } else if n < 1 << 32 {
141 4
142 } else if n < 1 << 40 {
143 5
144 } else if n < 1 << 48 {
145 6
146 } else if n < 1 << 56 {
147 7
148 } else if n < 1 << 64 {
149 8
150 } else if n < 1 << 72 {
151 9
152 } else if n < 1 << 80 {
153 10
154 } else if n < 1 << 88 {
155 11
156 } else if n < 1 << 96 {
157 12
158 } else if n < 1 << 104 {
159 13
160 } else if n < 1 << 112 {
161 14
162 } else if n < 1 << 120 {
163 15
164 } else {
165 16
166 }
167}
168
169mod private {
170 pub trait Sealed {}
173 impl Sealed for super::LittleEndian {}
174 impl Sealed for super::BigEndian {}
175}
176
177pub trait ByteOrder:
213 Clone
214 + Copy
215 + Debug
216 + Default
217 + Eq
218 + Hash
219 + Ord
220 + PartialEq
221 + PartialOrd
222 + private::Sealed
223{
224 fn read_u16(buf: &[u8]) -> u16;
230
231 fn read_u24(buf: &[u8]) -> u32 {
249 Self::read_uint(buf, 3) as u32
250 }
251
252 fn read_u32(buf: &[u8]) -> u32;
270
271 fn read_u48(buf: &[u8]) -> u64 {
289 Self::read_uint(buf, 6) as u64
290 }
291
292 fn read_u64(buf: &[u8]) -> u64;
310
311 fn read_u128(buf: &[u8]) -> u128;
329
330 fn read_uint(buf: &[u8], nbytes: usize) -> u64;
349
350 fn read_uint128(buf: &[u8], nbytes: usize) -> u128;
369
370 fn write_u16(buf: &mut [u8], n: u16);
388
389 fn write_u24(buf: &mut [u8], n: u32) {
407 Self::write_uint(buf, n as u64, 3)
408 }
409
410 fn write_u32(buf: &mut [u8], n: u32);
428
429 fn write_u48(buf: &mut [u8], n: u64) {
447 Self::write_uint(buf, n as u64, 6)
448 }
449
450 fn write_u64(buf: &mut [u8], n: u64);
468
469 fn write_u128(buf: &mut [u8], n: u128);
487
488 fn write_uint(buf: &mut [u8], n: u64, nbytes: usize);
507
508 fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize);
527
528 #[inline]
546 fn read_i16(buf: &[u8]) -> i16 {
547 Self::read_u16(buf) as i16
548 }
549
550 #[inline]
568 fn read_i24(buf: &[u8]) -> i32 {
569 Self::read_int(buf, 3) as i32
570 }
571
572 #[inline]
590 fn read_i32(buf: &[u8]) -> i32 {
591 Self::read_u32(buf) as i32
592 }
593
594 #[inline]
612 fn read_i48(buf: &[u8]) -> i64 {
613 Self::read_int(buf, 6) as i64
614 }
615
616 #[inline]
634 fn read_i64(buf: &[u8]) -> i64 {
635 Self::read_u64(buf) as i64
636 }
637
638 #[inline]
656 fn read_i128(buf: &[u8]) -> i128 {
657 Self::read_u128(buf) as i128
658 }
659
660 #[inline]
679 fn read_int(buf: &[u8], nbytes: usize) -> i64 {
680 extend_sign(Self::read_uint(buf, nbytes), nbytes)
681 }
682
683 #[inline]
702 fn read_int128(buf: &[u8], nbytes: usize) -> i128 {
703 extend_sign128(Self::read_uint128(buf, nbytes), nbytes)
704 }
705
706 #[inline]
725 fn read_f32(buf: &[u8]) -> f32 {
726 f32::from_bits(Self::read_u32(buf))
727 }
728
729 #[inline]
748 fn read_f64(buf: &[u8]) -> f64 {
749 f64::from_bits(Self::read_u64(buf))
750 }
751
752 #[inline]
770 fn write_i16(buf: &mut [u8], n: i16) {
771 Self::write_u16(buf, n as u16)
772 }
773
774 #[inline]
792 fn write_i24(buf: &mut [u8], n: i32) {
793 Self::write_int(buf, n as i64, 3)
794 }
795
796 #[inline]
814 fn write_i32(buf: &mut [u8], n: i32) {
815 Self::write_u32(buf, n as u32)
816 }
817
818 #[inline]
836 fn write_i48(buf: &mut [u8], n: i64) {
837 Self::write_int(buf, n as i64, 6)
838 }
839
840 #[inline]
858 fn write_i64(buf: &mut [u8], n: i64) {
859 Self::write_u64(buf, n as u64)
860 }
861
862 #[inline]
880 fn write_i128(buf: &mut [u8], n: i128) {
881 Self::write_u128(buf, n as u128)
882 }
883
884 #[inline]
903 fn write_int(buf: &mut [u8], n: i64, nbytes: usize) {
904 Self::write_uint(buf, unextend_sign(n, nbytes), nbytes)
905 }
906
907 #[inline]
926 fn write_int128(buf: &mut [u8], n: i128, nbytes: usize) {
927 Self::write_uint128(buf, unextend_sign128(n, nbytes), nbytes)
928 }
929
930 #[inline]
949 fn write_f32(buf: &mut [u8], n: f32) {
950 Self::write_u32(buf, n.to_bits())
951 }
952
953 #[inline]
972 fn write_f64(buf: &mut [u8], n: f64) {
973 Self::write_u64(buf, n.to_bits())
974 }
975
976 fn read_u16_into(src: &[u8], dst: &mut [u16]);
998
999 fn read_u32_into(src: &[u8], dst: &mut [u32]);
1021
1022 fn read_u64_into(src: &[u8], dst: &mut [u64]);
1044
1045 fn read_u128_into(src: &[u8], dst: &mut [u128]);
1067
1068 #[inline]
1090 fn read_i16_into(src: &[u8], dst: &mut [i16]) {
1091 let dst = unsafe {
1092 slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u16, dst.len())
1093 };
1094 Self::read_u16_into(src, dst)
1095 }
1096
1097 #[inline]
1119 fn read_i32_into(src: &[u8], dst: &mut [i32]) {
1120 let dst = unsafe {
1121 slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u32, dst.len())
1122 };
1123 Self::read_u32_into(src, dst);
1124 }
1125
1126 #[inline]
1148 fn read_i64_into(src: &[u8], dst: &mut [i64]) {
1149 let dst = unsafe {
1150 slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u64, dst.len())
1151 };
1152 Self::read_u64_into(src, dst);
1153 }
1154
1155 #[inline]
1177 fn read_i128_into(src: &[u8], dst: &mut [i128]) {
1178 let dst = unsafe {
1179 slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u128, dst.len())
1180 };
1181 Self::read_u128_into(src, dst);
1182 }
1183
1184 #[inline]
1207 fn read_f32_into(src: &[u8], dst: &mut [f32]) {
1208 let dst = unsafe {
1209 const _: () = if !(align_of::<u32>() <= align_of::<f32>()) {
::core::panicking::panic("assertion failed: align_of::<u32>() <= align_of::<f32>()")
}assert!(align_of::<u32>() <= align_of::<f32>());
1210 slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u32, dst.len())
1211 };
1212 Self::read_u32_into(src, dst);
1213 }
1214
1215 #[inline]
1241 #[deprecated(since = "1.3.0", note = "please use `read_f32_into` instead")]
1242 fn read_f32_into_unchecked(src: &[u8], dst: &mut [f32]) {
1243 Self::read_f32_into(src, dst);
1244 }
1245
1246 #[inline]
1269 fn read_f64_into(src: &[u8], dst: &mut [f64]) {
1270 let dst = unsafe {
1271 const _: () = if !(align_of::<u64>() <= align_of::<f64>()) {
::core::panicking::panic("assertion failed: align_of::<u64>() <= align_of::<f64>()")
}assert!(align_of::<u64>() <= align_of::<f64>());
1272 slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u64, dst.len())
1273 };
1274 Self::read_u64_into(src, dst);
1275 }
1276
1277 #[inline]
1304 #[deprecated(since = "1.3.0", note = "please use `read_f64_into` instead")]
1305 fn read_f64_into_unchecked(src: &[u8], dst: &mut [f64]) {
1306 Self::read_f64_into(src, dst);
1307 }
1308
1309 fn write_u16_into(src: &[u16], dst: &mut [u8]);
1331
1332 fn write_u32_into(src: &[u32], dst: &mut [u8]);
1354
1355 fn write_u64_into(src: &[u64], dst: &mut [u8]);
1377
1378 fn write_u128_into(src: &[u128], dst: &mut [u8]);
1400
1401 fn write_i8_into(src: &[i8], dst: &mut [u8]) {
1429 let src = unsafe {
1430 slice::from_raw_parts(src.as_ptr() as *const u8, src.len())
1431 };
1432 dst.copy_from_slice(src);
1433 }
1434
1435 fn write_i16_into(src: &[i16], dst: &mut [u8]) {
1457 let src = unsafe {
1458 slice::from_raw_parts(src.as_ptr() as *const u16, src.len())
1459 };
1460 Self::write_u16_into(src, dst);
1461 }
1462
1463 fn write_i32_into(src: &[i32], dst: &mut [u8]) {
1485 let src = unsafe {
1486 slice::from_raw_parts(src.as_ptr() as *const u32, src.len())
1487 };
1488 Self::write_u32_into(src, dst);
1489 }
1490
1491 fn write_i64_into(src: &[i64], dst: &mut [u8]) {
1513 let src = unsafe {
1514 slice::from_raw_parts(src.as_ptr() as *const u64, src.len())
1515 };
1516 Self::write_u64_into(src, dst);
1517 }
1518
1519 fn write_i128_into(src: &[i128], dst: &mut [u8]) {
1541 let src = unsafe {
1542 slice::from_raw_parts(src.as_ptr() as *const u128, src.len())
1543 };
1544 Self::write_u128_into(src, dst);
1545 }
1546
1547 fn write_f32_into(src: &[f32], dst: &mut [u8]) {
1570 let src = unsafe {
1571 slice::from_raw_parts(src.as_ptr() as *const u32, src.len())
1572 };
1573 Self::write_u32_into(src, dst);
1574 }
1575
1576 fn write_f64_into(src: &[f64], dst: &mut [u8]) {
1599 let src = unsafe {
1600 slice::from_raw_parts(src.as_ptr() as *const u64, src.len())
1601 };
1602 Self::write_u64_into(src, dst);
1603 }
1604
1605 fn from_slice_u16(numbers: &mut [u16]);
1623
1624 fn from_slice_u32(numbers: &mut [u32]);
1642
1643 fn from_slice_u64(numbers: &mut [u64]);
1661
1662 fn from_slice_u128(numbers: &mut [u128]);
1680
1681 #[inline]
1699 fn from_slice_i16(src: &mut [i16]) {
1700 let src = unsafe {
1701 slice::from_raw_parts_mut(src.as_mut_ptr() as *mut u16, src.len())
1702 };
1703 Self::from_slice_u16(src);
1704 }
1705
1706 #[inline]
1724 fn from_slice_i32(src: &mut [i32]) {
1725 let src = unsafe {
1726 slice::from_raw_parts_mut(src.as_mut_ptr() as *mut u32, src.len())
1727 };
1728 Self::from_slice_u32(src);
1729 }
1730
1731 #[inline]
1749 fn from_slice_i64(src: &mut [i64]) {
1750 let src = unsafe {
1751 slice::from_raw_parts_mut(src.as_mut_ptr() as *mut u64, src.len())
1752 };
1753 Self::from_slice_u64(src);
1754 }
1755
1756 #[inline]
1774 fn from_slice_i128(src: &mut [i128]) {
1775 let src = unsafe {
1776 slice::from_raw_parts_mut(src.as_mut_ptr() as *mut u128, src.len())
1777 };
1778 Self::from_slice_u128(src);
1779 }
1780
1781 fn from_slice_f32(numbers: &mut [f32]);
1787
1788 fn from_slice_f64(numbers: &mut [f64]);
1794}
1795
1796)]
1813pub enum BigEndian {}
1814
1815impl Default for BigEndian {
1816 fn default() -> BigEndian {
1817 { ::core::panicking::panic_fmt(format_args!("BigEndian default")); }panic!("BigEndian default")
1818 }
1819}
1820
1821pub type BE = BigEndian;
1825
1826)]
1843pub enum LittleEndian {}
1844
1845impl Default for LittleEndian {
1846 fn default() -> LittleEndian {
1847 { ::core::panicking::panic_fmt(format_args!("LittleEndian default")); }panic!("LittleEndian default")
1848 }
1849}
1850
1851pub type LE = LittleEndian;
1855
1856pub type NetworkEndian = BigEndian;
1881
1882#[cfg(target_endian = "little")]
1891pub type NativeEndian = LittleEndian;
1892
1893#[cfg(target_endian = "big")]
1902pub type NativeEndian = BigEndian;
1903
1904macro_rules! read_slice {
1909 ($src:expr, $dst:expr, $ty:ty, $from_bytes:ident) => {{
1910 const SIZE: usize = core::mem::size_of::<$ty>();
1911 let src: &[u8] = $src;
1913 let dst: &mut [$ty] = $dst;
1914 assert_eq!(src.len(), dst.len() * SIZE);
1915 for (src, dst) in src.chunks_exact(SIZE).zip(dst.iter_mut()) {
1916 *dst = <$ty>::$from_bytes(src.try_into().unwrap());
1917 }
1918 }};
1919}
1920
1921macro_rules! write_slice {
1926 ($src:expr, $dst:expr, $ty:ty, $to_bytes:ident) => {{
1927 const SIZE: usize = core::mem::size_of::<$ty>();
1928 let src: &[$ty] = $src;
1930 let dst: &mut [u8] = $dst;
1931 assert_eq!(src.len() * SIZE, dst.len());
1932 for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) {
1933 dst.copy_from_slice(&src.$to_bytes());
1934 }
1935 }};
1936}
1937
1938impl ByteOrder for BigEndian {
1939 #[inline]
1940 fn read_u16(buf: &[u8]) -> u16 {
1941 u16::from_be_bytes(buf[..2].try_into().unwrap())
1942 }
1943
1944 #[inline]
1945 fn read_u32(buf: &[u8]) -> u32 {
1946 u32::from_be_bytes(buf[..4].try_into().unwrap())
1947 }
1948
1949 #[inline]
1950 fn read_u64(buf: &[u8]) -> u64 {
1951 u64::from_be_bytes(buf[..8].try_into().unwrap())
1952 }
1953
1954 #[inline]
1955 fn read_u128(buf: &[u8]) -> u128 {
1956 u128::from_be_bytes(buf[..16].try_into().unwrap())
1957 }
1958
1959 #[inline]
1960 fn read_uint(buf: &[u8], nbytes: usize) -> u64 {
1961 let mut out = [0; 8];
1962 if !(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()) {
::core::panicking::panic("assertion failed: 1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()")
};assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
1963 let start = out.len() - nbytes;
1964 out[start..].copy_from_slice(&buf[..nbytes]);
1965 u64::from_be_bytes(out)
1966 }
1967
1968 #[inline]
1969 fn read_uint128(buf: &[u8], nbytes: usize) -> u128 {
1970 let mut out = [0; 16];
1971 if !(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()) {
::core::panicking::panic("assertion failed: 1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()")
};assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
1972 let start = out.len() - nbytes;
1973 out[start..].copy_from_slice(&buf[..nbytes]);
1974 u128::from_be_bytes(out)
1975 }
1976
1977 #[inline]
1978 fn write_u16(buf: &mut [u8], n: u16) {
1979 buf[..2].copy_from_slice(&n.to_be_bytes());
1980 }
1981
1982 #[inline]
1983 fn write_u32(buf: &mut [u8], n: u32) {
1984 buf[..4].copy_from_slice(&n.to_be_bytes());
1985 }
1986
1987 #[inline]
1988 fn write_u64(buf: &mut [u8], n: u64) {
1989 buf[..8].copy_from_slice(&n.to_be_bytes());
1990 }
1991
1992 #[inline]
1993 fn write_u128(buf: &mut [u8], n: u128) {
1994 buf[..16].copy_from_slice(&n.to_be_bytes());
1995 }
1996
1997 #[inline]
1998 fn write_uint(buf: &mut [u8], n: u64, nbytes: usize) {
1999 if !(pack_size(n) <= nbytes && nbytes <= 8) {
::core::panicking::panic("assertion failed: pack_size(n) <= nbytes && nbytes <= 8")
};assert!(pack_size(n) <= nbytes && nbytes <= 8);
2000 if !(nbytes <= buf.len()) {
::core::panicking::panic("assertion failed: nbytes <= buf.len()")
};assert!(nbytes <= buf.len());
2001 unsafe {
2002 let bytes = *(&n.to_be() as *const u64 as *const [u8; 8]);
2003 copy_nonoverlapping(
2004 bytes.as_ptr().offset((8 - nbytes) as isize),
2005 buf.as_mut_ptr(),
2006 nbytes,
2007 );
2008 }
2009 }
2010
2011 #[inline]
2012 fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize) {
2013 if !(pack_size128(n) <= nbytes && nbytes <= 16) {
::core::panicking::panic("assertion failed: pack_size128(n) <= nbytes && nbytes <= 16")
};assert!(pack_size128(n) <= nbytes && nbytes <= 16);
2014 if !(nbytes <= buf.len()) {
::core::panicking::panic("assertion failed: nbytes <= buf.len()")
};assert!(nbytes <= buf.len());
2015 unsafe {
2016 let bytes = *(&n.to_be() as *const u128 as *const [u8; 16]);
2017 copy_nonoverlapping(
2018 bytes.as_ptr().offset((16 - nbytes) as isize),
2019 buf.as_mut_ptr(),
2020 nbytes,
2021 );
2022 }
2023 }
2024
2025 #[inline]
2026 fn read_u16_into(src: &[u8], dst: &mut [u16]) {
2027 {
const SIZE: usize = core::mem::size_of::<u16>();
let src: &[u8] = src;
let dst: &mut [u16] = dst;
match (&src.len(), &(dst.len() * SIZE)) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.chunks_exact(SIZE).zip(dst.iter_mut()) {
*dst = <u16>::from_be_bytes(src.try_into().unwrap());
}
};read_slice!(src, dst, u16, from_be_bytes);
2028 }
2029
2030 #[inline]
2031 fn read_u32_into(src: &[u8], dst: &mut [u32]) {
2032 {
const SIZE: usize = core::mem::size_of::<u32>();
let src: &[u8] = src;
let dst: &mut [u32] = dst;
match (&src.len(), &(dst.len() * SIZE)) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.chunks_exact(SIZE).zip(dst.iter_mut()) {
*dst = <u32>::from_be_bytes(src.try_into().unwrap());
}
};read_slice!(src, dst, u32, from_be_bytes);
2033 }
2034
2035 #[inline]
2036 fn read_u64_into(src: &[u8], dst: &mut [u64]) {
2037 {
const SIZE: usize = core::mem::size_of::<u64>();
let src: &[u8] = src;
let dst: &mut [u64] = dst;
match (&src.len(), &(dst.len() * SIZE)) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.chunks_exact(SIZE).zip(dst.iter_mut()) {
*dst = <u64>::from_be_bytes(src.try_into().unwrap());
}
};read_slice!(src, dst, u64, from_be_bytes);
2038 }
2039
2040 #[inline]
2041 fn read_u128_into(src: &[u8], dst: &mut [u128]) {
2042 {
const SIZE: usize = core::mem::size_of::<u128>();
let src: &[u8] = src;
let dst: &mut [u128] = dst;
match (&src.len(), &(dst.len() * SIZE)) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.chunks_exact(SIZE).zip(dst.iter_mut()) {
*dst = <u128>::from_be_bytes(src.try_into().unwrap());
}
};read_slice!(src, dst, u128, from_be_bytes);
2043 }
2044
2045 #[inline]
2046 fn write_u16_into(src: &[u16], dst: &mut [u8]) {
2047 {
const SIZE: usize = core::mem::size_of::<u16>();
let src: &[u16] = src;
let dst: &mut [u8] = dst;
match (&(src.len() * SIZE), &dst.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) {
dst.copy_from_slice(&src.to_be_bytes());
}
};write_slice!(src, dst, u16, to_be_bytes);
2048 }
2049
2050 #[inline]
2051 fn write_u32_into(src: &[u32], dst: &mut [u8]) {
2052 {
const SIZE: usize = core::mem::size_of::<u32>();
let src: &[u32] = src;
let dst: &mut [u8] = dst;
match (&(src.len() * SIZE), &dst.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) {
dst.copy_from_slice(&src.to_be_bytes());
}
};write_slice!(src, dst, u32, to_be_bytes);
2053 }
2054
2055 #[inline]
2056 fn write_u64_into(src: &[u64], dst: &mut [u8]) {
2057 {
const SIZE: usize = core::mem::size_of::<u64>();
let src: &[u64] = src;
let dst: &mut [u8] = dst;
match (&(src.len() * SIZE), &dst.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) {
dst.copy_from_slice(&src.to_be_bytes());
}
};write_slice!(src, dst, u64, to_be_bytes);
2058 }
2059
2060 #[inline]
2061 fn write_u128_into(src: &[u128], dst: &mut [u8]) {
2062 {
const SIZE: usize = core::mem::size_of::<u128>();
let src: &[u128] = src;
let dst: &mut [u8] = dst;
match (&(src.len() * SIZE), &dst.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) {
dst.copy_from_slice(&src.to_be_bytes());
}
};write_slice!(src, dst, u128, to_be_bytes);
2063 }
2064
2065 #[inline]
2066 fn from_slice_u16(numbers: &mut [u16]) {
2067 if truecfg!(target_endian = "little") {
2068 for n in numbers {
2069 *n = n.to_be();
2070 }
2071 }
2072 }
2073
2074 #[inline]
2075 fn from_slice_u32(numbers: &mut [u32]) {
2076 if truecfg!(target_endian = "little") {
2077 for n in numbers {
2078 *n = n.to_be();
2079 }
2080 }
2081 }
2082
2083 #[inline]
2084 fn from_slice_u64(numbers: &mut [u64]) {
2085 if truecfg!(target_endian = "little") {
2086 for n in numbers {
2087 *n = n.to_be();
2088 }
2089 }
2090 }
2091
2092 #[inline]
2093 fn from_slice_u128(numbers: &mut [u128]) {
2094 if truecfg!(target_endian = "little") {
2095 for n in numbers {
2096 *n = n.to_be();
2097 }
2098 }
2099 }
2100
2101 #[inline]
2102 fn from_slice_f32(numbers: &mut [f32]) {
2103 if truecfg!(target_endian = "little") {
2104 for n in numbers {
2105 unsafe {
2106 let int = *(n as *const f32 as *const u32);
2107 *n = *(&int.to_be() as *const u32 as *const f32);
2108 }
2109 }
2110 }
2111 }
2112
2113 #[inline]
2114 fn from_slice_f64(numbers: &mut [f64]) {
2115 if truecfg!(target_endian = "little") {
2116 for n in numbers {
2117 unsafe {
2118 let int = *(n as *const f64 as *const u64);
2119 *n = *(&int.to_be() as *const u64 as *const f64);
2120 }
2121 }
2122 }
2123 }
2124}
2125
2126impl ByteOrder for LittleEndian {
2127 #[inline]
2128 fn read_u16(buf: &[u8]) -> u16 {
2129 u16::from_le_bytes(buf[..2].try_into().unwrap())
2130 }
2131
2132 #[inline]
2133 fn read_u32(buf: &[u8]) -> u32 {
2134 u32::from_le_bytes(buf[..4].try_into().unwrap())
2135 }
2136
2137 #[inline]
2138 fn read_u64(buf: &[u8]) -> u64 {
2139 u64::from_le_bytes(buf[..8].try_into().unwrap())
2140 }
2141
2142 #[inline]
2143 fn read_u128(buf: &[u8]) -> u128 {
2144 u128::from_le_bytes(buf[..16].try_into().unwrap())
2145 }
2146
2147 #[inline]
2148 fn read_uint(buf: &[u8], nbytes: usize) -> u64 {
2149 let mut out = [0; 8];
2150 if !(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()) {
::core::panicking::panic("assertion failed: 1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()")
};assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
2151 out[..nbytes].copy_from_slice(&buf[..nbytes]);
2152 u64::from_le_bytes(out)
2153 }
2154
2155 #[inline]
2156 fn read_uint128(buf: &[u8], nbytes: usize) -> u128 {
2157 let mut out = [0; 16];
2158 if !(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()) {
::core::panicking::panic("assertion failed: 1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()")
};assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
2159 out[..nbytes].copy_from_slice(&buf[..nbytes]);
2160 u128::from_le_bytes(out)
2161 }
2162
2163 #[inline]
2164 fn write_u16(buf: &mut [u8], n: u16) {
2165 buf[..2].copy_from_slice(&n.to_le_bytes());
2166 }
2167
2168 #[inline]
2169 fn write_u32(buf: &mut [u8], n: u32) {
2170 buf[..4].copy_from_slice(&n.to_le_bytes());
2171 }
2172
2173 #[inline]
2174 fn write_u64(buf: &mut [u8], n: u64) {
2175 buf[..8].copy_from_slice(&n.to_le_bytes());
2176 }
2177
2178 #[inline]
2179 fn write_u128(buf: &mut [u8], n: u128) {
2180 buf[..16].copy_from_slice(&n.to_le_bytes());
2181 }
2182
2183 #[inline]
2184 fn write_uint(buf: &mut [u8], n: u64, nbytes: usize) {
2185 if !(pack_size(n as u64) <= nbytes && nbytes <= 8) {
::core::panicking::panic("assertion failed: pack_size(n as u64) <= nbytes && nbytes <= 8")
};assert!(pack_size(n as u64) <= nbytes && nbytes <= 8);
2186 if !(nbytes <= buf.len()) {
::core::panicking::panic("assertion failed: nbytes <= buf.len()")
};assert!(nbytes <= buf.len());
2187 unsafe {
2188 let bytes = *(&n.to_le() as *const u64 as *const [u8; 8]);
2189 copy_nonoverlapping(bytes.as_ptr(), buf.as_mut_ptr(), nbytes);
2190 }
2191 }
2192
2193 #[inline]
2194 fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize) {
2195 if !(pack_size128(n as u128) <= nbytes && nbytes <= 16) {
::core::panicking::panic("assertion failed: pack_size128(n as u128) <= nbytes && nbytes <= 16")
};assert!(pack_size128(n as u128) <= nbytes && nbytes <= 16);
2196 if !(nbytes <= buf.len()) {
::core::panicking::panic("assertion failed: nbytes <= buf.len()")
};assert!(nbytes <= buf.len());
2197 unsafe {
2198 let bytes = *(&n.to_le() as *const u128 as *const [u8; 16]);
2199 copy_nonoverlapping(bytes.as_ptr(), buf.as_mut_ptr(), nbytes);
2200 }
2201 }
2202
2203 #[inline]
2204 fn read_u16_into(src: &[u8], dst: &mut [u16]) {
2205 {
const SIZE: usize = core::mem::size_of::<u16>();
let src: &[u8] = src;
let dst: &mut [u16] = dst;
match (&src.len(), &(dst.len() * SIZE)) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.chunks_exact(SIZE).zip(dst.iter_mut()) {
*dst = <u16>::from_le_bytes(src.try_into().unwrap());
}
};read_slice!(src, dst, u16, from_le_bytes);
2206 }
2207
2208 #[inline]
2209 fn read_u32_into(src: &[u8], dst: &mut [u32]) {
2210 {
const SIZE: usize = core::mem::size_of::<u32>();
let src: &[u8] = src;
let dst: &mut [u32] = dst;
match (&src.len(), &(dst.len() * SIZE)) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.chunks_exact(SIZE).zip(dst.iter_mut()) {
*dst = <u32>::from_le_bytes(src.try_into().unwrap());
}
};read_slice!(src, dst, u32, from_le_bytes);
2211 }
2212
2213 #[inline]
2214 fn read_u64_into(src: &[u8], dst: &mut [u64]) {
2215 {
const SIZE: usize = core::mem::size_of::<u64>();
let src: &[u8] = src;
let dst: &mut [u64] = dst;
match (&src.len(), &(dst.len() * SIZE)) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.chunks_exact(SIZE).zip(dst.iter_mut()) {
*dst = <u64>::from_le_bytes(src.try_into().unwrap());
}
};read_slice!(src, dst, u64, from_le_bytes);
2216 }
2217
2218 #[inline]
2219 fn read_u128_into(src: &[u8], dst: &mut [u128]) {
2220 {
const SIZE: usize = core::mem::size_of::<u128>();
let src: &[u8] = src;
let dst: &mut [u128] = dst;
match (&src.len(), &(dst.len() * SIZE)) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.chunks_exact(SIZE).zip(dst.iter_mut()) {
*dst = <u128>::from_le_bytes(src.try_into().unwrap());
}
};read_slice!(src, dst, u128, from_le_bytes);
2221 }
2222
2223 #[inline]
2224 fn write_u16_into(src: &[u16], dst: &mut [u8]) {
2225 {
const SIZE: usize = core::mem::size_of::<u16>();
let src: &[u16] = src;
let dst: &mut [u8] = dst;
match (&(src.len() * SIZE), &dst.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) {
dst.copy_from_slice(&src.to_le_bytes());
}
};write_slice!(src, dst, u16, to_le_bytes);
2226 }
2227
2228 #[inline]
2229 fn write_u32_into(src: &[u32], dst: &mut [u8]) {
2230 {
const SIZE: usize = core::mem::size_of::<u32>();
let src: &[u32] = src;
let dst: &mut [u8] = dst;
match (&(src.len() * SIZE), &dst.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) {
dst.copy_from_slice(&src.to_le_bytes());
}
};write_slice!(src, dst, u32, to_le_bytes);
2231 }
2232
2233 #[inline]
2234 fn write_u64_into(src: &[u64], dst: &mut [u8]) {
2235 {
const SIZE: usize = core::mem::size_of::<u64>();
let src: &[u64] = src;
let dst: &mut [u8] = dst;
match (&(src.len() * SIZE), &dst.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) {
dst.copy_from_slice(&src.to_le_bytes());
}
};write_slice!(src, dst, u64, to_le_bytes);
2236 }
2237
2238 #[inline]
2239 fn write_u128_into(src: &[u128], dst: &mut [u8]) {
2240 {
const SIZE: usize = core::mem::size_of::<u128>();
let src: &[u128] = src;
let dst: &mut [u8] = dst;
match (&(src.len() * SIZE), &dst.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) {
dst.copy_from_slice(&src.to_le_bytes());
}
};write_slice!(src, dst, u128, to_le_bytes);
2241 }
2242
2243 #[inline]
2244 fn from_slice_u16(numbers: &mut [u16]) {
2245 if falsecfg!(target_endian = "big") {
2246 for n in numbers {
2247 *n = n.to_le();
2248 }
2249 }
2250 }
2251
2252 #[inline]
2253 fn from_slice_u32(numbers: &mut [u32]) {
2254 if falsecfg!(target_endian = "big") {
2255 for n in numbers {
2256 *n = n.to_le();
2257 }
2258 }
2259 }
2260
2261 #[inline]
2262 fn from_slice_u64(numbers: &mut [u64]) {
2263 if falsecfg!(target_endian = "big") {
2264 for n in numbers {
2265 *n = n.to_le();
2266 }
2267 }
2268 }
2269
2270 #[inline]
2271 fn from_slice_u128(numbers: &mut [u128]) {
2272 if falsecfg!(target_endian = "big") {
2273 for n in numbers {
2274 *n = n.to_le();
2275 }
2276 }
2277 }
2278
2279 #[inline]
2280 fn from_slice_f32(numbers: &mut [f32]) {
2281 if falsecfg!(target_endian = "big") {
2282 for n in numbers {
2283 unsafe {
2284 let int = *(n as *const f32 as *const u32);
2285 *n = *(&int.to_le() as *const u32 as *const f32);
2286 }
2287 }
2288 }
2289 }
2290
2291 #[inline]
2292 fn from_slice_f64(numbers: &mut [f64]) {
2293 if falsecfg!(target_endian = "big") {
2294 for n in numbers {
2295 unsafe {
2296 let int = *(n as *const f64 as *const u64);
2297 *n = *(&int.to_le() as *const u64 as *const f64);
2298 }
2299 }
2300 }
2301 }
2302}
2303
2304#[cfg(test)]
2305mod test {
2306 use quickcheck::{Arbitrary, Gen, QuickCheck, StdGen, Testable};
2307 use rand::{thread_rng, Rng};
2308
2309 pub const U24_MAX: u32 = 16_777_215;
2310 pub const I24_MAX: i32 = 8_388_607;
2311 pub const U48_MAX: u64 = 281_474_976_710_655;
2312 pub const I48_MAX: i64 = 140_737_488_355_327;
2313
2314 pub const U64_MAX: u64 = ::core::u64::MAX;
2315 pub const I64_MAX: u64 = ::core::i64::MAX as u64;
2316
2317 macro_rules! calc_max {
2318 ($max:expr, $bytes:expr) => {
2319 calc_max!($max, $bytes, 8)
2320 };
2321 ($max:expr, $bytes:expr, $maxbytes:expr) => {
2322 ($max - 1) >> (8 * ($maxbytes - $bytes))
2323 };
2324 }
2325
2326 #[derive(Clone, Debug)]
2327 pub struct Wi128<T>(pub T);
2328
2329 impl<T: Clone> Wi128<T> {
2330 pub fn clone(&self) -> T {
2331 self.0.clone()
2332 }
2333 }
2334
2335 impl<T: PartialEq> PartialEq<T> for Wi128<T> {
2336 fn eq(&self, other: &T) -> bool {
2337 self.0.eq(other)
2338 }
2339 }
2340
2341 impl Arbitrary for Wi128<u128> {
2342 fn arbitrary<G: Gen>(gen: &mut G) -> Wi128<u128> {
2343 let max = calc_max!(::core::u128::MAX, gen.size(), 16);
2344 let output = (gen.gen::<u64>() as u128)
2345 | ((gen.gen::<u64>() as u128) << 64);
2346 Wi128(output & (max - 1))
2347 }
2348 }
2349
2350 impl Arbitrary for Wi128<i128> {
2351 fn arbitrary<G: Gen>(gen: &mut G) -> Wi128<i128> {
2352 let max = calc_max!(::core::i128::MAX, gen.size(), 16);
2353 let output = (gen.gen::<i64>() as i128)
2354 | ((gen.gen::<i64>() as i128) << 64);
2355 Wi128(output & (max - 1))
2356 }
2357 }
2358
2359 pub fn qc_sized<A: Testable>(f: A, size: u64) {
2360 QuickCheck::new()
2361 .gen(StdGen::new(thread_rng(), size as usize))
2362 .tests(1_00)
2363 .max_tests(10_000)
2364 .quickcheck(f);
2365 }
2366
2367 macro_rules! qc_byte_order {
2368 ($name:ident, $ty_int:ty, $max:expr,
2369 $bytes:expr, $read:ident, $write:ident) => {
2370 #[cfg(not(miri))]
2371 mod $name {
2372 #[allow(unused_imports)]
2373 use super::{qc_sized, Wi128};
2374 use crate::{
2375 BigEndian, ByteOrder, LittleEndian, NativeEndian,
2376 };
2377
2378 #[test]
2379 fn big_endian() {
2380 fn prop(n: $ty_int) -> bool {
2381 let mut buf = [0; 16];
2382 BigEndian::$write(&mut buf, n.clone(), $bytes);
2383 n == BigEndian::$read(&buf[..$bytes], $bytes)
2384 }
2385 qc_sized(prop as fn($ty_int) -> bool, $max);
2386 }
2387
2388 #[test]
2389 fn little_endian() {
2390 fn prop(n: $ty_int) -> bool {
2391 let mut buf = [0; 16];
2392 LittleEndian::$write(&mut buf, n.clone(), $bytes);
2393 n == LittleEndian::$read(&buf[..$bytes], $bytes)
2394 }
2395 qc_sized(prop as fn($ty_int) -> bool, $max);
2396 }
2397
2398 #[test]
2399 fn native_endian() {
2400 fn prop(n: $ty_int) -> bool {
2401 let mut buf = [0; 16];
2402 NativeEndian::$write(&mut buf, n.clone(), $bytes);
2403 n == NativeEndian::$read(&buf[..$bytes], $bytes)
2404 }
2405 qc_sized(prop as fn($ty_int) -> bool, $max);
2406 }
2407 }
2408 };
2409 ($name:ident, $ty_int:ty, $max:expr,
2410 $read:ident, $write:ident) => {
2411 #[cfg(not(miri))]
2412 mod $name {
2413 #[allow(unused_imports)]
2414 use super::{qc_sized, Wi128};
2415 use crate::{
2416 BigEndian, ByteOrder, LittleEndian, NativeEndian,
2417 };
2418 use core::mem::size_of;
2419
2420 #[test]
2421 fn big_endian() {
2422 fn prop(n: $ty_int) -> bool {
2423 let bytes = size_of::<$ty_int>();
2424 let mut buf = [0; 16];
2425 BigEndian::$write(&mut buf[16 - bytes..], n.clone());
2426 n == BigEndian::$read(&buf[16 - bytes..])
2427 }
2428 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
2429 }
2430
2431 #[test]
2432 fn little_endian() {
2433 fn prop(n: $ty_int) -> bool {
2434 let bytes = size_of::<$ty_int>();
2435 let mut buf = [0; 16];
2436 LittleEndian::$write(&mut buf[..bytes], n.clone());
2437 n == LittleEndian::$read(&buf[..bytes])
2438 }
2439 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
2440 }
2441
2442 #[test]
2443 fn native_endian() {
2444 fn prop(n: $ty_int) -> bool {
2445 let bytes = size_of::<$ty_int>();
2446 let mut buf = [0; 16];
2447 NativeEndian::$write(&mut buf[..bytes], n.clone());
2448 n == NativeEndian::$read(&buf[..bytes])
2449 }
2450 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
2451 }
2452 }
2453 };
2454 }
2455
2456 qc_byte_order!(
2457 prop_u16,
2458 u16,
2459 ::core::u16::MAX as u64,
2460 read_u16,
2461 write_u16
2462 );
2463 qc_byte_order!(
2464 prop_i16,
2465 i16,
2466 ::core::i16::MAX as u64,
2467 read_i16,
2468 write_i16
2469 );
2470 qc_byte_order!(
2471 prop_u24,
2472 u32,
2473 crate::test::U24_MAX as u64,
2474 read_u24,
2475 write_u24
2476 );
2477 qc_byte_order!(
2478 prop_i24,
2479 i32,
2480 crate::test::I24_MAX as u64,
2481 read_i24,
2482 write_i24
2483 );
2484 qc_byte_order!(
2485 prop_u32,
2486 u32,
2487 ::core::u32::MAX as u64,
2488 read_u32,
2489 write_u32
2490 );
2491 qc_byte_order!(
2492 prop_i32,
2493 i32,
2494 ::core::i32::MAX as u64,
2495 read_i32,
2496 write_i32
2497 );
2498 qc_byte_order!(
2499 prop_u48,
2500 u64,
2501 crate::test::U48_MAX as u64,
2502 read_u48,
2503 write_u48
2504 );
2505 qc_byte_order!(
2506 prop_i48,
2507 i64,
2508 crate::test::I48_MAX as u64,
2509 read_i48,
2510 write_i48
2511 );
2512 qc_byte_order!(
2513 prop_u64,
2514 u64,
2515 ::core::u64::MAX as u64,
2516 read_u64,
2517 write_u64
2518 );
2519 qc_byte_order!(
2520 prop_i64,
2521 i64,
2522 ::core::i64::MAX as u64,
2523 read_i64,
2524 write_i64
2525 );
2526 qc_byte_order!(
2527 prop_f32,
2528 f32,
2529 ::core::u64::MAX as u64,
2530 read_f32,
2531 write_f32
2532 );
2533 qc_byte_order!(
2534 prop_f64,
2535 f64,
2536 ::core::i64::MAX as u64,
2537 read_f64,
2538 write_f64
2539 );
2540
2541 qc_byte_order!(prop_u128, Wi128<u128>, 16 + 1, read_u128, write_u128);
2542 qc_byte_order!(prop_i128, Wi128<i128>, 16 + 1, read_i128, write_i128);
2543
2544 qc_byte_order!(
2545 prop_uint_1,
2546 u64,
2547 calc_max!(super::U64_MAX, 1),
2548 1,
2549 read_uint,
2550 write_uint
2551 );
2552 qc_byte_order!(
2553 prop_uint_2,
2554 u64,
2555 calc_max!(super::U64_MAX, 2),
2556 2,
2557 read_uint,
2558 write_uint
2559 );
2560 qc_byte_order!(
2561 prop_uint_3,
2562 u64,
2563 calc_max!(super::U64_MAX, 3),
2564 3,
2565 read_uint,
2566 write_uint
2567 );
2568 qc_byte_order!(
2569 prop_uint_4,
2570 u64,
2571 calc_max!(super::U64_MAX, 4),
2572 4,
2573 read_uint,
2574 write_uint
2575 );
2576 qc_byte_order!(
2577 prop_uint_5,
2578 u64,
2579 calc_max!(super::U64_MAX, 5),
2580 5,
2581 read_uint,
2582 write_uint
2583 );
2584 qc_byte_order!(
2585 prop_uint_6,
2586 u64,
2587 calc_max!(super::U64_MAX, 6),
2588 6,
2589 read_uint,
2590 write_uint
2591 );
2592 qc_byte_order!(
2593 prop_uint_7,
2594 u64,
2595 calc_max!(super::U64_MAX, 7),
2596 7,
2597 read_uint,
2598 write_uint
2599 );
2600 qc_byte_order!(
2601 prop_uint_8,
2602 u64,
2603 calc_max!(super::U64_MAX, 8),
2604 8,
2605 read_uint,
2606 write_uint
2607 );
2608
2609 qc_byte_order!(
2610 prop_uint128_1,
2611 Wi128<u128>,
2612 1,
2613 1,
2614 read_uint128,
2615 write_uint128
2616 );
2617 qc_byte_order!(
2618 prop_uint128_2,
2619 Wi128<u128>,
2620 2,
2621 2,
2622 read_uint128,
2623 write_uint128
2624 );
2625 qc_byte_order!(
2626 prop_uint128_3,
2627 Wi128<u128>,
2628 3,
2629 3,
2630 read_uint128,
2631 write_uint128
2632 );
2633 qc_byte_order!(
2634 prop_uint128_4,
2635 Wi128<u128>,
2636 4,
2637 4,
2638 read_uint128,
2639 write_uint128
2640 );
2641 qc_byte_order!(
2642 prop_uint128_5,
2643 Wi128<u128>,
2644 5,
2645 5,
2646 read_uint128,
2647 write_uint128
2648 );
2649 qc_byte_order!(
2650 prop_uint128_6,
2651 Wi128<u128>,
2652 6,
2653 6,
2654 read_uint128,
2655 write_uint128
2656 );
2657 qc_byte_order!(
2658 prop_uint128_7,
2659 Wi128<u128>,
2660 7,
2661 7,
2662 read_uint128,
2663 write_uint128
2664 );
2665 qc_byte_order!(
2666 prop_uint128_8,
2667 Wi128<u128>,
2668 8,
2669 8,
2670 read_uint128,
2671 write_uint128
2672 );
2673 qc_byte_order!(
2674 prop_uint128_9,
2675 Wi128<u128>,
2676 9,
2677 9,
2678 read_uint128,
2679 write_uint128
2680 );
2681 qc_byte_order!(
2682 prop_uint128_10,
2683 Wi128<u128>,
2684 10,
2685 10,
2686 read_uint128,
2687 write_uint128
2688 );
2689 qc_byte_order!(
2690 prop_uint128_11,
2691 Wi128<u128>,
2692 11,
2693 11,
2694 read_uint128,
2695 write_uint128
2696 );
2697 qc_byte_order!(
2698 prop_uint128_12,
2699 Wi128<u128>,
2700 12,
2701 12,
2702 read_uint128,
2703 write_uint128
2704 );
2705 qc_byte_order!(
2706 prop_uint128_13,
2707 Wi128<u128>,
2708 13,
2709 13,
2710 read_uint128,
2711 write_uint128
2712 );
2713 qc_byte_order!(
2714 prop_uint128_14,
2715 Wi128<u128>,
2716 14,
2717 14,
2718 read_uint128,
2719 write_uint128
2720 );
2721 qc_byte_order!(
2722 prop_uint128_15,
2723 Wi128<u128>,
2724 15,
2725 15,
2726 read_uint128,
2727 write_uint128
2728 );
2729 qc_byte_order!(
2730 prop_uint128_16,
2731 Wi128<u128>,
2732 16,
2733 16,
2734 read_uint128,
2735 write_uint128
2736 );
2737
2738 qc_byte_order!(
2739 prop_int_1,
2740 i64,
2741 calc_max!(super::I64_MAX, 1),
2742 1,
2743 read_int,
2744 write_int
2745 );
2746 qc_byte_order!(
2747 prop_int_2,
2748 i64,
2749 calc_max!(super::I64_MAX, 2),
2750 2,
2751 read_int,
2752 write_int
2753 );
2754 qc_byte_order!(
2755 prop_int_3,
2756 i64,
2757 calc_max!(super::I64_MAX, 3),
2758 3,
2759 read_int,
2760 write_int
2761 );
2762 qc_byte_order!(
2763 prop_int_4,
2764 i64,
2765 calc_max!(super::I64_MAX, 4),
2766 4,
2767 read_int,
2768 write_int
2769 );
2770 qc_byte_order!(
2771 prop_int_5,
2772 i64,
2773 calc_max!(super::I64_MAX, 5),
2774 5,
2775 read_int,
2776 write_int
2777 );
2778 qc_byte_order!(
2779 prop_int_6,
2780 i64,
2781 calc_max!(super::I64_MAX, 6),
2782 6,
2783 read_int,
2784 write_int
2785 );
2786 qc_byte_order!(
2787 prop_int_7,
2788 i64,
2789 calc_max!(super::I64_MAX, 7),
2790 7,
2791 read_int,
2792 write_int
2793 );
2794 qc_byte_order!(
2795 prop_int_8,
2796 i64,
2797 calc_max!(super::I64_MAX, 8),
2798 8,
2799 read_int,
2800 write_int
2801 );
2802
2803 qc_byte_order!(
2804 prop_int128_1,
2805 Wi128<i128>,
2806 1,
2807 1,
2808 read_int128,
2809 write_int128
2810 );
2811 qc_byte_order!(
2812 prop_int128_2,
2813 Wi128<i128>,
2814 2,
2815 2,
2816 read_int128,
2817 write_int128
2818 );
2819 qc_byte_order!(
2820 prop_int128_3,
2821 Wi128<i128>,
2822 3,
2823 3,
2824 read_int128,
2825 write_int128
2826 );
2827 qc_byte_order!(
2828 prop_int128_4,
2829 Wi128<i128>,
2830 4,
2831 4,
2832 read_int128,
2833 write_int128
2834 );
2835 qc_byte_order!(
2836 prop_int128_5,
2837 Wi128<i128>,
2838 5,
2839 5,
2840 read_int128,
2841 write_int128
2842 );
2843 qc_byte_order!(
2844 prop_int128_6,
2845 Wi128<i128>,
2846 6,
2847 6,
2848 read_int128,
2849 write_int128
2850 );
2851 qc_byte_order!(
2852 prop_int128_7,
2853 Wi128<i128>,
2854 7,
2855 7,
2856 read_int128,
2857 write_int128
2858 );
2859 qc_byte_order!(
2860 prop_int128_8,
2861 Wi128<i128>,
2862 8,
2863 8,
2864 read_int128,
2865 write_int128
2866 );
2867 qc_byte_order!(
2868 prop_int128_9,
2869 Wi128<i128>,
2870 9,
2871 9,
2872 read_int128,
2873 write_int128
2874 );
2875 qc_byte_order!(
2876 prop_int128_10,
2877 Wi128<i128>,
2878 10,
2879 10,
2880 read_int128,
2881 write_int128
2882 );
2883 qc_byte_order!(
2884 prop_int128_11,
2885 Wi128<i128>,
2886 11,
2887 11,
2888 read_int128,
2889 write_int128
2890 );
2891 qc_byte_order!(
2892 prop_int128_12,
2893 Wi128<i128>,
2894 12,
2895 12,
2896 read_int128,
2897 write_int128
2898 );
2899 qc_byte_order!(
2900 prop_int128_13,
2901 Wi128<i128>,
2902 13,
2903 13,
2904 read_int128,
2905 write_int128
2906 );
2907 qc_byte_order!(
2908 prop_int128_14,
2909 Wi128<i128>,
2910 14,
2911 14,
2912 read_int128,
2913 write_int128
2914 );
2915 qc_byte_order!(
2916 prop_int128_15,
2917 Wi128<i128>,
2918 15,
2919 15,
2920 read_int128,
2921 write_int128
2922 );
2923 qc_byte_order!(
2924 prop_int128_16,
2925 Wi128<i128>,
2926 16,
2927 16,
2928 read_int128,
2929 write_int128
2930 );
2931
2932 macro_rules! too_small {
2938 ($name:ident, $maximally_small:expr, $zero:expr,
2939 $read:ident, $write:ident) => {
2940 mod $name {
2941 use crate::{
2942 BigEndian, ByteOrder, LittleEndian, NativeEndian,
2943 };
2944
2945 #[test]
2946 #[should_panic]
2947 fn read_big_endian() {
2948 let buf = [0; $maximally_small];
2949 BigEndian::$read(&buf);
2950 }
2951
2952 #[test]
2953 #[should_panic]
2954 fn read_little_endian() {
2955 let buf = [0; $maximally_small];
2956 LittleEndian::$read(&buf);
2957 }
2958
2959 #[test]
2960 #[should_panic]
2961 fn read_native_endian() {
2962 let buf = [0; $maximally_small];
2963 NativeEndian::$read(&buf);
2964 }
2965
2966 #[test]
2967 #[should_panic]
2968 fn write_big_endian() {
2969 let mut buf = [0; $maximally_small];
2970 BigEndian::$write(&mut buf, $zero);
2971 }
2972
2973 #[test]
2974 #[should_panic]
2975 fn write_little_endian() {
2976 let mut buf = [0; $maximally_small];
2977 LittleEndian::$write(&mut buf, $zero);
2978 }
2979
2980 #[test]
2981 #[should_panic]
2982 fn write_native_endian() {
2983 let mut buf = [0; $maximally_small];
2984 NativeEndian::$write(&mut buf, $zero);
2985 }
2986 }
2987 };
2988 ($name:ident, $maximally_small:expr, $read:ident) => {
2989 mod $name {
2990 use crate::{
2991 BigEndian, ByteOrder, LittleEndian, NativeEndian,
2992 };
2993
2994 #[test]
2995 #[should_panic]
2996 fn read_big_endian() {
2997 let buf = [0; $maximally_small];
2998 BigEndian::$read(&buf, $maximally_small + 1);
2999 }
3000
3001 #[test]
3002 #[should_panic]
3003 fn read_little_endian() {
3004 let buf = [0; $maximally_small];
3005 LittleEndian::$read(&buf, $maximally_small + 1);
3006 }
3007
3008 #[test]
3009 #[should_panic]
3010 fn read_native_endian() {
3011 let buf = [0; $maximally_small];
3012 NativeEndian::$read(&buf, $maximally_small + 1);
3013 }
3014 }
3015 };
3016 }
3017
3018 too_small!(small_u16, 1, 0, read_u16, write_u16);
3019 too_small!(small_i16, 1, 0, read_i16, write_i16);
3020 too_small!(small_u32, 3, 0, read_u32, write_u32);
3021 too_small!(small_i32, 3, 0, read_i32, write_i32);
3022 too_small!(small_u64, 7, 0, read_u64, write_u64);
3023 too_small!(small_i64, 7, 0, read_i64, write_i64);
3024 too_small!(small_f32, 3, 0.0, read_f32, write_f32);
3025 too_small!(small_f64, 7, 0.0, read_f64, write_f64);
3026 too_small!(small_u128, 15, 0, read_u128, write_u128);
3027 too_small!(small_i128, 15, 0, read_i128, write_i128);
3028
3029 too_small!(small_uint_1, 1, read_uint);
3030 too_small!(small_uint_2, 2, read_uint);
3031 too_small!(small_uint_3, 3, read_uint);
3032 too_small!(small_uint_4, 4, read_uint);
3033 too_small!(small_uint_5, 5, read_uint);
3034 too_small!(small_uint_6, 6, read_uint);
3035 too_small!(small_uint_7, 7, read_uint);
3036
3037 too_small!(small_uint128_1, 1, read_uint128);
3038 too_small!(small_uint128_2, 2, read_uint128);
3039 too_small!(small_uint128_3, 3, read_uint128);
3040 too_small!(small_uint128_4, 4, read_uint128);
3041 too_small!(small_uint128_5, 5, read_uint128);
3042 too_small!(small_uint128_6, 6, read_uint128);
3043 too_small!(small_uint128_7, 7, read_uint128);
3044 too_small!(small_uint128_8, 8, read_uint128);
3045 too_small!(small_uint128_9, 9, read_uint128);
3046 too_small!(small_uint128_10, 10, read_uint128);
3047 too_small!(small_uint128_11, 11, read_uint128);
3048 too_small!(small_uint128_12, 12, read_uint128);
3049 too_small!(small_uint128_13, 13, read_uint128);
3050 too_small!(small_uint128_14, 14, read_uint128);
3051 too_small!(small_uint128_15, 15, read_uint128);
3052
3053 too_small!(small_int_1, 1, read_int);
3054 too_small!(small_int_2, 2, read_int);
3055 too_small!(small_int_3, 3, read_int);
3056 too_small!(small_int_4, 4, read_int);
3057 too_small!(small_int_5, 5, read_int);
3058 too_small!(small_int_6, 6, read_int);
3059 too_small!(small_int_7, 7, read_int);
3060
3061 too_small!(small_int128_1, 1, read_int128);
3062 too_small!(small_int128_2, 2, read_int128);
3063 too_small!(small_int128_3, 3, read_int128);
3064 too_small!(small_int128_4, 4, read_int128);
3065 too_small!(small_int128_5, 5, read_int128);
3066 too_small!(small_int128_6, 6, read_int128);
3067 too_small!(small_int128_7, 7, read_int128);
3068 too_small!(small_int128_8, 8, read_int128);
3069 too_small!(small_int128_9, 9, read_int128);
3070 too_small!(small_int128_10, 10, read_int128);
3071 too_small!(small_int128_11, 11, read_int128);
3072 too_small!(small_int128_12, 12, read_int128);
3073 too_small!(small_int128_13, 13, read_int128);
3074 too_small!(small_int128_14, 14, read_int128);
3075 too_small!(small_int128_15, 15, read_int128);
3076
3077 macro_rules! slice_lengths {
3079 ($name:ident, $read:ident, $write:ident,
3080 $num_bytes:expr, $numbers:expr) => {
3081 mod $name {
3082 use crate::{
3083 BigEndian, ByteOrder, LittleEndian, NativeEndian,
3084 };
3085
3086 #[test]
3087 #[should_panic]
3088 fn read_big_endian() {
3089 let bytes = [0; $num_bytes];
3090 let mut numbers = $numbers;
3091 BigEndian::$read(&bytes, &mut numbers);
3092 }
3093
3094 #[test]
3095 #[should_panic]
3096 fn read_little_endian() {
3097 let bytes = [0; $num_bytes];
3098 let mut numbers = $numbers;
3099 LittleEndian::$read(&bytes, &mut numbers);
3100 }
3101
3102 #[test]
3103 #[should_panic]
3104 fn read_native_endian() {
3105 let bytes = [0; $num_bytes];
3106 let mut numbers = $numbers;
3107 NativeEndian::$read(&bytes, &mut numbers);
3108 }
3109
3110 #[test]
3111 #[should_panic]
3112 fn write_big_endian() {
3113 let mut bytes = [0; $num_bytes];
3114 let numbers = $numbers;
3115 BigEndian::$write(&numbers, &mut bytes);
3116 }
3117
3118 #[test]
3119 #[should_panic]
3120 fn write_little_endian() {
3121 let mut bytes = [0; $num_bytes];
3122 let numbers = $numbers;
3123 LittleEndian::$write(&numbers, &mut bytes);
3124 }
3125
3126 #[test]
3127 #[should_panic]
3128 fn write_native_endian() {
3129 let mut bytes = [0; $num_bytes];
3130 let numbers = $numbers;
3131 NativeEndian::$write(&numbers, &mut bytes);
3132 }
3133 }
3134 };
3135 }
3136
3137 slice_lengths!(
3138 slice_len_too_small_u16,
3139 read_u16_into,
3140 write_u16_into,
3141 3,
3142 [0, 0]
3143 );
3144 slice_lengths!(
3145 slice_len_too_big_u16,
3146 read_u16_into,
3147 write_u16_into,
3148 5,
3149 [0, 0]
3150 );
3151 slice_lengths!(
3152 slice_len_too_small_i16,
3153 read_i16_into,
3154 write_i16_into,
3155 3,
3156 [0, 0]
3157 );
3158 slice_lengths!(
3159 slice_len_too_big_i16,
3160 read_i16_into,
3161 write_i16_into,
3162 5,
3163 [0, 0]
3164 );
3165
3166 slice_lengths!(
3167 slice_len_too_small_u32,
3168 read_u32_into,
3169 write_u32_into,
3170 7,
3171 [0, 0]
3172 );
3173 slice_lengths!(
3174 slice_len_too_big_u32,
3175 read_u32_into,
3176 write_u32_into,
3177 9,
3178 [0, 0]
3179 );
3180 slice_lengths!(
3181 slice_len_too_small_i32,
3182 read_i32_into,
3183 write_i32_into,
3184 7,
3185 [0, 0]
3186 );
3187 slice_lengths!(
3188 slice_len_too_big_i32,
3189 read_i32_into,
3190 write_i32_into,
3191 9,
3192 [0, 0]
3193 );
3194
3195 slice_lengths!(
3196 slice_len_too_small_u64,
3197 read_u64_into,
3198 write_u64_into,
3199 15,
3200 [0, 0]
3201 );
3202 slice_lengths!(
3203 slice_len_too_big_u64,
3204 read_u64_into,
3205 write_u64_into,
3206 17,
3207 [0, 0]
3208 );
3209 slice_lengths!(
3210 slice_len_too_small_i64,
3211 read_i64_into,
3212 write_i64_into,
3213 15,
3214 [0, 0]
3215 );
3216 slice_lengths!(
3217 slice_len_too_big_i64,
3218 read_i64_into,
3219 write_i64_into,
3220 17,
3221 [0, 0]
3222 );
3223
3224 slice_lengths!(
3225 slice_len_too_small_u128,
3226 read_u128_into,
3227 write_u128_into,
3228 31,
3229 [0, 0]
3230 );
3231 slice_lengths!(
3232 slice_len_too_big_u128,
3233 read_u128_into,
3234 write_u128_into,
3235 33,
3236 [0, 0]
3237 );
3238 slice_lengths!(
3239 slice_len_too_small_i128,
3240 read_i128_into,
3241 write_i128_into,
3242 31,
3243 [0, 0]
3244 );
3245 slice_lengths!(
3246 slice_len_too_big_i128,
3247 read_i128_into,
3248 write_i128_into,
3249 33,
3250 [0, 0]
3251 );
3252
3253 #[test]
3254 fn uint_bigger_buffer() {
3255 use crate::{ByteOrder, LittleEndian};
3256 let n = LittleEndian::read_uint(&[1, 2, 3, 4, 5, 6, 7, 8], 5);
3257 assert_eq!(n, 0x05_0403_0201);
3258 }
3259
3260 #[test]
3261 fn regression173_array_impl() {
3262 use crate::{BigEndian, ByteOrder, LittleEndian};
3263
3264 let xs = [0; 100];
3265
3266 let x = BigEndian::read_u16(&xs);
3267 assert_eq!(x, 0);
3268 let x = BigEndian::read_u32(&xs);
3269 assert_eq!(x, 0);
3270 let x = BigEndian::read_u64(&xs);
3271 assert_eq!(x, 0);
3272 let x = BigEndian::read_u128(&xs);
3273 assert_eq!(x, 0);
3274 let x = BigEndian::read_i16(&xs);
3275 assert_eq!(x, 0);
3276 let x = BigEndian::read_i32(&xs);
3277 assert_eq!(x, 0);
3278 let x = BigEndian::read_i64(&xs);
3279 assert_eq!(x, 0);
3280 let x = BigEndian::read_i128(&xs);
3281 assert_eq!(x, 0);
3282
3283 let x = LittleEndian::read_u16(&xs);
3284 assert_eq!(x, 0);
3285 let x = LittleEndian::read_u32(&xs);
3286 assert_eq!(x, 0);
3287 let x = LittleEndian::read_u64(&xs);
3288 assert_eq!(x, 0);
3289 let x = LittleEndian::read_u128(&xs);
3290 assert_eq!(x, 0);
3291 let x = LittleEndian::read_i16(&xs);
3292 assert_eq!(x, 0);
3293 let x = LittleEndian::read_i32(&xs);
3294 assert_eq!(x, 0);
3295 let x = LittleEndian::read_i64(&xs);
3296 assert_eq!(x, 0);
3297 let x = LittleEndian::read_i128(&xs);
3298 assert_eq!(x, 0);
3299 }
3300}
3301
3302#[cfg(test)]
3303#[cfg(feature = "std")]
3304mod stdtests {
3305 extern crate quickcheck;
3306 extern crate rand;
3307
3308 use self::quickcheck::{QuickCheck, StdGen, Testable};
3309 use self::rand::thread_rng;
3310
3311 fn qc_unsized<A: Testable>(f: A) {
3312 QuickCheck::new()
3313 .gen(StdGen::new(thread_rng(), 16))
3314 .tests(1_00)
3315 .max_tests(10_000)
3316 .quickcheck(f);
3317 }
3318
3319 macro_rules! calc_max {
3320 ($max:expr, $bytes:expr) => {
3321 ($max - 1) >> (8 * (8 - $bytes))
3322 };
3323 }
3324
3325 macro_rules! qc_bytes_ext {
3326 ($name:ident, $ty_int:ty, $max:expr,
3327 $bytes:expr, $read:ident, $write:ident) => {
3328 #[cfg(not(miri))]
3329 mod $name {
3330 #[allow(unused_imports)]
3331 use crate::test::{qc_sized, Wi128};
3332 use crate::{
3333 BigEndian, LittleEndian, NativeEndian, ReadBytesExt,
3334 WriteBytesExt,
3335 };
3336 use std::io::Cursor;
3337
3338 #[test]
3339 fn big_endian() {
3340 fn prop(n: $ty_int) -> bool {
3341 let mut wtr = vec![];
3342 wtr.$write::<BigEndian>(n.clone()).unwrap();
3343 let offset = wtr.len() - $bytes;
3344 let mut rdr = Cursor::new(&mut wtr[offset..]);
3345 n == rdr.$read::<BigEndian>($bytes).unwrap()
3346 }
3347 qc_sized(prop as fn($ty_int) -> bool, $max);
3348 }
3349
3350 #[test]
3351 fn little_endian() {
3352 fn prop(n: $ty_int) -> bool {
3353 let mut wtr = vec![];
3354 wtr.$write::<LittleEndian>(n.clone()).unwrap();
3355 let mut rdr = Cursor::new(wtr);
3356 n == rdr.$read::<LittleEndian>($bytes).unwrap()
3357 }
3358 qc_sized(prop as fn($ty_int) -> bool, $max);
3359 }
3360
3361 #[test]
3362 fn native_endian() {
3363 fn prop(n: $ty_int) -> bool {
3364 let mut wtr = vec![];
3365 wtr.$write::<NativeEndian>(n.clone()).unwrap();
3366 let offset = if cfg!(target_endian = "big") {
3367 wtr.len() - $bytes
3368 } else {
3369 0
3370 };
3371 let mut rdr = Cursor::new(&mut wtr[offset..]);
3372 n == rdr.$read::<NativeEndian>($bytes).unwrap()
3373 }
3374 qc_sized(prop as fn($ty_int) -> bool, $max);
3375 }
3376 }
3377 };
3378 ($name:ident, $ty_int:ty, $max:expr, $read:ident, $write:ident) => {
3379 #[cfg(not(miri))]
3380 mod $name {
3381 #[allow(unused_imports)]
3382 use crate::test::{qc_sized, Wi128};
3383 use crate::{
3384 BigEndian, LittleEndian, NativeEndian, ReadBytesExt,
3385 WriteBytesExt,
3386 };
3387 use std::io::Cursor;
3388
3389 #[test]
3390 fn big_endian() {
3391 fn prop(n: $ty_int) -> bool {
3392 let mut wtr = vec![];
3393 wtr.$write::<BigEndian>(n.clone()).unwrap();
3394 let mut rdr = Cursor::new(wtr);
3395 n == rdr.$read::<BigEndian>().unwrap()
3396 }
3397 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
3398 }
3399
3400 #[test]
3401 fn little_endian() {
3402 fn prop(n: $ty_int) -> bool {
3403 let mut wtr = vec![];
3404 wtr.$write::<LittleEndian>(n.clone()).unwrap();
3405 let mut rdr = Cursor::new(wtr);
3406 n == rdr.$read::<LittleEndian>().unwrap()
3407 }
3408 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
3409 }
3410
3411 #[test]
3412 fn native_endian() {
3413 fn prop(n: $ty_int) -> bool {
3414 let mut wtr = vec![];
3415 wtr.$write::<NativeEndian>(n.clone()).unwrap();
3416 let mut rdr = Cursor::new(wtr);
3417 n == rdr.$read::<NativeEndian>().unwrap()
3418 }
3419 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
3420 }
3421 }
3422 };
3423 }
3424
3425 qc_bytes_ext!(
3426 prop_ext_u16,
3427 u16,
3428 ::std::u16::MAX as u64,
3429 read_u16,
3430 write_u16
3431 );
3432 qc_bytes_ext!(
3433 prop_ext_i16,
3434 i16,
3435 ::std::i16::MAX as u64,
3436 read_i16,
3437 write_i16
3438 );
3439 qc_bytes_ext!(
3440 prop_ext_u32,
3441 u32,
3442 ::std::u32::MAX as u64,
3443 read_u32,
3444 write_u32
3445 );
3446 qc_bytes_ext!(
3447 prop_ext_i32,
3448 i32,
3449 ::std::i32::MAX as u64,
3450 read_i32,
3451 write_i32
3452 );
3453 qc_bytes_ext!(
3454 prop_ext_u64,
3455 u64,
3456 ::std::u64::MAX as u64,
3457 read_u64,
3458 write_u64
3459 );
3460 qc_bytes_ext!(
3461 prop_ext_i64,
3462 i64,
3463 ::std::i64::MAX as u64,
3464 read_i64,
3465 write_i64
3466 );
3467 qc_bytes_ext!(
3468 prop_ext_f32,
3469 f32,
3470 ::std::u64::MAX as u64,
3471 read_f32,
3472 write_f32
3473 );
3474 qc_bytes_ext!(
3475 prop_ext_f64,
3476 f64,
3477 ::std::i64::MAX as u64,
3478 read_f64,
3479 write_f64
3480 );
3481
3482 qc_bytes_ext!(prop_ext_u128, Wi128<u128>, 16 + 1, read_u128, write_u128);
3483 qc_bytes_ext!(prop_ext_i128, Wi128<i128>, 16 + 1, read_i128, write_i128);
3484
3485 qc_bytes_ext!(
3486 prop_ext_uint_1,
3487 u64,
3488 calc_max!(crate::test::U64_MAX, 1),
3489 1,
3490 read_uint,
3491 write_u64
3492 );
3493 qc_bytes_ext!(
3494 prop_ext_uint_2,
3495 u64,
3496 calc_max!(crate::test::U64_MAX, 2),
3497 2,
3498 read_uint,
3499 write_u64
3500 );
3501 qc_bytes_ext!(
3502 prop_ext_uint_3,
3503 u64,
3504 calc_max!(crate::test::U64_MAX, 3),
3505 3,
3506 read_uint,
3507 write_u64
3508 );
3509 qc_bytes_ext!(
3510 prop_ext_uint_4,
3511 u64,
3512 calc_max!(crate::test::U64_MAX, 4),
3513 4,
3514 read_uint,
3515 write_u64
3516 );
3517 qc_bytes_ext!(
3518 prop_ext_uint_5,
3519 u64,
3520 calc_max!(crate::test::U64_MAX, 5),
3521 5,
3522 read_uint,
3523 write_u64
3524 );
3525 qc_bytes_ext!(
3526 prop_ext_uint_6,
3527 u64,
3528 calc_max!(crate::test::U64_MAX, 6),
3529 6,
3530 read_uint,
3531 write_u64
3532 );
3533 qc_bytes_ext!(
3534 prop_ext_uint_7,
3535 u64,
3536 calc_max!(crate::test::U64_MAX, 7),
3537 7,
3538 read_uint,
3539 write_u64
3540 );
3541 qc_bytes_ext!(
3542 prop_ext_uint_8,
3543 u64,
3544 calc_max!(crate::test::U64_MAX, 8),
3545 8,
3546 read_uint,
3547 write_u64
3548 );
3549
3550 qc_bytes_ext!(
3551 prop_ext_uint128_1,
3552 Wi128<u128>,
3553 1,
3554 1,
3555 read_uint128,
3556 write_u128
3557 );
3558 qc_bytes_ext!(
3559 prop_ext_uint128_2,
3560 Wi128<u128>,
3561 2,
3562 2,
3563 read_uint128,
3564 write_u128
3565 );
3566 qc_bytes_ext!(
3567 prop_ext_uint128_3,
3568 Wi128<u128>,
3569 3,
3570 3,
3571 read_uint128,
3572 write_u128
3573 );
3574 qc_bytes_ext!(
3575 prop_ext_uint128_4,
3576 Wi128<u128>,
3577 4,
3578 4,
3579 read_uint128,
3580 write_u128
3581 );
3582 qc_bytes_ext!(
3583 prop_ext_uint128_5,
3584 Wi128<u128>,
3585 5,
3586 5,
3587 read_uint128,
3588 write_u128
3589 );
3590 qc_bytes_ext!(
3591 prop_ext_uint128_6,
3592 Wi128<u128>,
3593 6,
3594 6,
3595 read_uint128,
3596 write_u128
3597 );
3598 qc_bytes_ext!(
3599 prop_ext_uint128_7,
3600 Wi128<u128>,
3601 7,
3602 7,
3603 read_uint128,
3604 write_u128
3605 );
3606 qc_bytes_ext!(
3607 prop_ext_uint128_8,
3608 Wi128<u128>,
3609 8,
3610 8,
3611 read_uint128,
3612 write_u128
3613 );
3614 qc_bytes_ext!(
3615 prop_ext_uint128_9,
3616 Wi128<u128>,
3617 9,
3618 9,
3619 read_uint128,
3620 write_u128
3621 );
3622 qc_bytes_ext!(
3623 prop_ext_uint128_10,
3624 Wi128<u128>,
3625 10,
3626 10,
3627 read_uint128,
3628 write_u128
3629 );
3630 qc_bytes_ext!(
3631 prop_ext_uint128_11,
3632 Wi128<u128>,
3633 11,
3634 11,
3635 read_uint128,
3636 write_u128
3637 );
3638 qc_bytes_ext!(
3639 prop_ext_uint128_12,
3640 Wi128<u128>,
3641 12,
3642 12,
3643 read_uint128,
3644 write_u128
3645 );
3646 qc_bytes_ext!(
3647 prop_ext_uint128_13,
3648 Wi128<u128>,
3649 13,
3650 13,
3651 read_uint128,
3652 write_u128
3653 );
3654 qc_bytes_ext!(
3655 prop_ext_uint128_14,
3656 Wi128<u128>,
3657 14,
3658 14,
3659 read_uint128,
3660 write_u128
3661 );
3662 qc_bytes_ext!(
3663 prop_ext_uint128_15,
3664 Wi128<u128>,
3665 15,
3666 15,
3667 read_uint128,
3668 write_u128
3669 );
3670 qc_bytes_ext!(
3671 prop_ext_uint128_16,
3672 Wi128<u128>,
3673 16,
3674 16,
3675 read_uint128,
3676 write_u128
3677 );
3678
3679 qc_bytes_ext!(
3680 prop_ext_int_1,
3681 i64,
3682 calc_max!(crate::test::I64_MAX, 1),
3683 1,
3684 read_int,
3685 write_i64
3686 );
3687 qc_bytes_ext!(
3688 prop_ext_int_2,
3689 i64,
3690 calc_max!(crate::test::I64_MAX, 2),
3691 2,
3692 read_int,
3693 write_i64
3694 );
3695 qc_bytes_ext!(
3696 prop_ext_int_3,
3697 i64,
3698 calc_max!(crate::test::I64_MAX, 3),
3699 3,
3700 read_int,
3701 write_i64
3702 );
3703 qc_bytes_ext!(
3704 prop_ext_int_4,
3705 i64,
3706 calc_max!(crate::test::I64_MAX, 4),
3707 4,
3708 read_int,
3709 write_i64
3710 );
3711 qc_bytes_ext!(
3712 prop_ext_int_5,
3713 i64,
3714 calc_max!(crate::test::I64_MAX, 5),
3715 5,
3716 read_int,
3717 write_i64
3718 );
3719 qc_bytes_ext!(
3720 prop_ext_int_6,
3721 i64,
3722 calc_max!(crate::test::I64_MAX, 6),
3723 6,
3724 read_int,
3725 write_i64
3726 );
3727 qc_bytes_ext!(
3728 prop_ext_int_7,
3729 i64,
3730 calc_max!(crate::test::I64_MAX, 1),
3731 7,
3732 read_int,
3733 write_i64
3734 );
3735 qc_bytes_ext!(
3736 prop_ext_int_8,
3737 i64,
3738 calc_max!(crate::test::I64_MAX, 8),
3739 8,
3740 read_int,
3741 write_i64
3742 );
3743
3744 qc_bytes_ext!(
3745 prop_ext_int128_1,
3746 Wi128<i128>,
3747 1,
3748 1,
3749 read_int128,
3750 write_i128
3751 );
3752 qc_bytes_ext!(
3753 prop_ext_int128_2,
3754 Wi128<i128>,
3755 2,
3756 2,
3757 read_int128,
3758 write_i128
3759 );
3760 qc_bytes_ext!(
3761 prop_ext_int128_3,
3762 Wi128<i128>,
3763 3,
3764 3,
3765 read_int128,
3766 write_i128
3767 );
3768 qc_bytes_ext!(
3769 prop_ext_int128_4,
3770 Wi128<i128>,
3771 4,
3772 4,
3773 read_int128,
3774 write_i128
3775 );
3776 qc_bytes_ext!(
3777 prop_ext_int128_5,
3778 Wi128<i128>,
3779 5,
3780 5,
3781 read_int128,
3782 write_i128
3783 );
3784 qc_bytes_ext!(
3785 prop_ext_int128_6,
3786 Wi128<i128>,
3787 6,
3788 6,
3789 read_int128,
3790 write_i128
3791 );
3792 qc_bytes_ext!(
3793 prop_ext_int128_7,
3794 Wi128<i128>,
3795 7,
3796 7,
3797 read_int128,
3798 write_i128
3799 );
3800 qc_bytes_ext!(
3801 prop_ext_int128_8,
3802 Wi128<i128>,
3803 8,
3804 8,
3805 read_int128,
3806 write_i128
3807 );
3808 qc_bytes_ext!(
3809 prop_ext_int128_9,
3810 Wi128<i128>,
3811 9,
3812 9,
3813 read_int128,
3814 write_i128
3815 );
3816 qc_bytes_ext!(
3817 prop_ext_int128_10,
3818 Wi128<i128>,
3819 10,
3820 10,
3821 read_int128,
3822 write_i128
3823 );
3824 qc_bytes_ext!(
3825 prop_ext_int128_11,
3826 Wi128<i128>,
3827 11,
3828 11,
3829 read_int128,
3830 write_i128
3831 );
3832 qc_bytes_ext!(
3833 prop_ext_int128_12,
3834 Wi128<i128>,
3835 12,
3836 12,
3837 read_int128,
3838 write_i128
3839 );
3840 qc_bytes_ext!(
3841 prop_ext_int128_13,
3842 Wi128<i128>,
3843 13,
3844 13,
3845 read_int128,
3846 write_i128
3847 );
3848 qc_bytes_ext!(
3849 prop_ext_int128_14,
3850 Wi128<i128>,
3851 14,
3852 14,
3853 read_int128,
3854 write_i128
3855 );
3856 qc_bytes_ext!(
3857 prop_ext_int128_15,
3858 Wi128<i128>,
3859 15,
3860 15,
3861 read_int128,
3862 write_i128
3863 );
3864 qc_bytes_ext!(
3865 prop_ext_int128_16,
3866 Wi128<i128>,
3867 16,
3868 16,
3869 read_int128,
3870 write_i128
3871 );
3872
3873 macro_rules! qc_slice {
3875 ($name:ident, $ty_int:ty, $read:ident, $write:ident, $zero:expr) => {
3876 #[cfg(not(miri))]
3877 mod $name {
3878 use super::qc_unsized;
3879 #[allow(unused_imports)]
3880 use crate::test::Wi128;
3881 use crate::{
3882 BigEndian, ByteOrder, LittleEndian, NativeEndian,
3883 };
3884 use core::mem::size_of;
3885
3886 #[test]
3887 fn big_endian() {
3888 #[allow(unused_unsafe)]
3889 fn prop(numbers: Vec<$ty_int>) -> bool {
3890 let numbers: Vec<_> =
3891 numbers.into_iter().map(|x| x.clone()).collect();
3892 let num_bytes = size_of::<$ty_int>() * numbers.len();
3893 let mut bytes = vec![0; num_bytes];
3894
3895 BigEndian::$write(&numbers, &mut bytes);
3896
3897 let mut got = vec![$zero; numbers.len()];
3898 unsafe {
3899 BigEndian::$read(&bytes, &mut got);
3900 }
3901
3902 numbers == got
3903 }
3904 qc_unsized(prop as fn(_) -> bool);
3905 }
3906
3907 #[test]
3908 fn little_endian() {
3909 #[allow(unused_unsafe)]
3910 fn prop(numbers: Vec<$ty_int>) -> bool {
3911 let numbers: Vec<_> =
3912 numbers.into_iter().map(|x| x.clone()).collect();
3913 let num_bytes = size_of::<$ty_int>() * numbers.len();
3914 let mut bytes = vec![0; num_bytes];
3915
3916 LittleEndian::$write(&numbers, &mut bytes);
3917
3918 let mut got = vec![$zero; numbers.len()];
3919 unsafe {
3920 LittleEndian::$read(&bytes, &mut got);
3921 }
3922
3923 numbers == got
3924 }
3925 qc_unsized(prop as fn(_) -> bool);
3926 }
3927
3928 #[test]
3929 fn native_endian() {
3930 #[allow(unused_unsafe)]
3931 fn prop(numbers: Vec<$ty_int>) -> bool {
3932 let numbers: Vec<_> =
3933 numbers.into_iter().map(|x| x.clone()).collect();
3934 let num_bytes = size_of::<$ty_int>() * numbers.len();
3935 let mut bytes = vec![0; num_bytes];
3936
3937 NativeEndian::$write(&numbers, &mut bytes);
3938
3939 let mut got = vec![$zero; numbers.len()];
3940 unsafe {
3941 NativeEndian::$read(&bytes, &mut got);
3942 }
3943
3944 numbers == got
3945 }
3946 qc_unsized(prop as fn(_) -> bool);
3947 }
3948 }
3949 };
3950 }
3951
3952 qc_slice!(prop_slice_u16, u16, read_u16_into, write_u16_into, 0);
3953 qc_slice!(prop_slice_i16, i16, read_i16_into, write_i16_into, 0);
3954 qc_slice!(prop_slice_u32, u32, read_u32_into, write_u32_into, 0);
3955 qc_slice!(prop_slice_i32, i32, read_i32_into, write_i32_into, 0);
3956 qc_slice!(prop_slice_u64, u64, read_u64_into, write_u64_into, 0);
3957 qc_slice!(prop_slice_i64, i64, read_i64_into, write_i64_into, 0);
3958 qc_slice!(
3959 prop_slice_u128,
3960 Wi128<u128>,
3961 read_u128_into,
3962 write_u128_into,
3963 0
3964 );
3965 qc_slice!(
3966 prop_slice_i128,
3967 Wi128<i128>,
3968 read_i128_into,
3969 write_i128_into,
3970 0
3971 );
3972
3973 qc_slice!(prop_slice_f32, f32, read_f32_into, write_f32_into, 0.0);
3974 qc_slice!(prop_slice_f64, f64, read_f64_into, write_f64_into, 0.0);
3975}