1 use std::io;
2 
3 macro_rules! read_bytes_ext {
4     ($output_type:ty) => {
5         impl<W: io::Read + ?Sized> ReadBytesExt<$output_type> for W {
6             #[inline]
7             fn read_be(&mut self) -> io::Result<$output_type> {
8                 let mut bytes = [0u8; std::mem::size_of::<$output_type>()];
9                 self.read_exact(&mut bytes)?;
10                 Ok(<$output_type>::from_be_bytes(bytes))
11             }
12         }
13     };
14 }
15 
16 macro_rules! write_bytes_ext {
17     ($input_type:ty) => {
18         impl<W: io::Write + ?Sized> WriteBytesExt<$input_type> for W {
19             #[inline]
20             fn write_be(&mut self, n: $input_type) -> io::Result<()> {
21                 self.write_all(&n.to_be_bytes())
22             }
23         }
24     };
25 }
26 
27 /// Read extension to read big endian data
28 pub trait ReadBytesExt<T>: io::Read {
29     /// Read `T` from a bytes stream. Most significant byte first.
read_be(&mut self) -> io::Result<T>30     fn read_be(&mut self) -> io::Result<T>;
31 }
32 
33 /// Write extension to write big endian data
34 pub trait WriteBytesExt<T>: io::Write {
35     /// Writes `T` to a bytes stream. Most significant byte first.
write_be(&mut self, _: T) -> io::Result<()>36     fn write_be(&mut self, _: T) -> io::Result<()>;
37 }
38 
39 read_bytes_ext!(u8);
40 read_bytes_ext!(u16);
41 read_bytes_ext!(u32);
42 
43 write_bytes_ext!(u32);
44