diff options
Diffstat (limited to 'vendor/png/src/traits.rs')
-rw-r--r-- | vendor/png/src/traits.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/vendor/png/src/traits.rs b/vendor/png/src/traits.rs new file mode 100644 index 0000000..ffc10e7 --- /dev/null +++ b/vendor/png/src/traits.rs @@ -0,0 +1,43 @@ +use std::io; + +macro_rules! read_bytes_ext { + ($output_type:ty) => { + impl<W: io::Read + ?Sized> ReadBytesExt<$output_type> for W { + #[inline] + fn read_be(&mut self) -> io::Result<$output_type> { + let mut bytes = [0u8; std::mem::size_of::<$output_type>()]; + self.read_exact(&mut bytes)?; + Ok(<$output_type>::from_be_bytes(bytes)) + } + } + }; +} + +macro_rules! write_bytes_ext { + ($input_type:ty) => { + impl<W: io::Write + ?Sized> WriteBytesExt<$input_type> for W { + #[inline] + fn write_be(&mut self, n: $input_type) -> io::Result<()> { + self.write_all(&n.to_be_bytes()) + } + } + }; +} + +/// Read extension to read big endian data +pub trait ReadBytesExt<T>: io::Read { + /// Read `T` from a bytes stream. Most significant byte first. + fn read_be(&mut self) -> io::Result<T>; +} + +/// Write extension to write big endian data +pub trait WriteBytesExt<T>: io::Write { + /// Writes `T` to a bytes stream. Most significant byte first. + fn write_be(&mut self, _: T) -> io::Result<()>; +} + +read_bytes_ext!(u8); +read_bytes_ext!(u16); +read_bytes_ext!(u32); + +write_bytes_ext!(u32); |