Permalink
Cannot retrieve contributors at this time
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
1599 lines (1541 sloc)
49.8 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::io::{self, Result}; | |
use std::slice; | |
use ByteOrder; | |
/// Extends [`Read`] with methods for reading numbers. (For `std::io`.) | |
/// | |
/// Most of the methods defined here have an unconstrained type parameter that | |
/// must be explicitly instantiated. Typically, it is instantiated with either | |
/// the [`BigEndian`] or [`LittleEndian`] types defined in this crate. | |
/// | |
/// # Examples | |
/// | |
/// Read unsigned 16 bit big-endian integers from a [`Read`]: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![2, 5, 3, 0]); | |
/// assert_eq!(517, rdr.read_u16::<BigEndian>().unwrap()); | |
/// assert_eq!(768, rdr.read_u16::<BigEndian>().unwrap()); | |
/// ``` | |
/// | |
/// [`BigEndian`]: enum.BigEndian.html | |
/// [`LittleEndian`]: enum.LittleEndian.html | |
/// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html | |
pub trait ReadBytesExt: io::Read { | |
/// Reads an unsigned 8 bit integer from the underlying reader. | |
/// | |
/// Note that since this reads a single byte, no byte order conversions | |
/// are used. It is included for completeness. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read unsigned 8 bit integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::ReadBytesExt; | |
/// | |
/// let mut rdr = Cursor::new(vec![2, 5]); | |
/// assert_eq!(2, rdr.read_u8().unwrap()); | |
/// assert_eq!(5, rdr.read_u8().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_u8(&mut self) -> Result<u8> { | |
let mut buf = [0; 1]; | |
try!(self.read_exact(&mut buf)); | |
Ok(buf[0]) | |
} | |
/// Reads a signed 8 bit integer from the underlying reader. | |
/// | |
/// Note that since this reads a single byte, no byte order conversions | |
/// are used. It is included for completeness. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read signed 8 bit integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::ReadBytesExt; | |
/// | |
/// let mut rdr = Cursor::new(vec![0x02, 0xfb]); | |
/// assert_eq!(2, rdr.read_i8().unwrap()); | |
/// assert_eq!(-5, rdr.read_i8().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_i8(&mut self) -> Result<i8> { | |
let mut buf = [0; 1]; | |
try!(self.read_exact(&mut buf)); | |
Ok(buf[0] as i8) | |
} | |
/// Reads an unsigned 16 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read unsigned 16 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![2, 5, 3, 0]); | |
/// assert_eq!(517, rdr.read_u16::<BigEndian>().unwrap()); | |
/// assert_eq!(768, rdr.read_u16::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_u16<T: ByteOrder>(&mut self) -> Result<u16> { | |
let mut buf = [0; 2]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_u16(&buf)) | |
} | |
/// Reads a signed 16 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read signed 16 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0x00, 0xc1, 0xff, 0x7c]); | |
/// assert_eq!(193, rdr.read_i16::<BigEndian>().unwrap()); | |
/// assert_eq!(-132, rdr.read_i16::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_i16<T: ByteOrder>(&mut self) -> Result<i16> { | |
let mut buf = [0; 2]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_i16(&buf)) | |
} | |
/// Reads an unsigned 24 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read unsigned 24 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0x00, 0x01, 0x0b]); | |
/// assert_eq!(267, rdr.read_u24::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_u24<T: ByteOrder>(&mut self) -> Result<u32> { | |
let mut buf = [0; 3]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_u24(&buf)) | |
} | |
/// Reads a signed 24 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read signed 24 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0xff, 0x7a, 0x33]); | |
/// assert_eq!(-34253, rdr.read_i24::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_i24<T: ByteOrder>(&mut self) -> Result<i32> { | |
let mut buf = [0; 3]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_i24(&buf)) | |
} | |
/// Reads an unsigned 32 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read unsigned 32 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0x00, 0x00, 0x01, 0x0b]); | |
/// assert_eq!(267, rdr.read_u32::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_u32<T: ByteOrder>(&mut self) -> Result<u32> { | |
let mut buf = [0; 4]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_u32(&buf)) | |
} | |
/// Reads a signed 32 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read signed 32 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0xff, 0xff, 0x7a, 0x33]); | |
/// assert_eq!(-34253, rdr.read_i32::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_i32<T: ByteOrder>(&mut self) -> Result<i32> { | |
let mut buf = [0; 4]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_i32(&buf)) | |
} | |
/// Reads an unsigned 48 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read unsigned 48 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0xb6, 0x71, 0x6b, 0xdc, 0x2b, 0x31]); | |
/// assert_eq!(200598257150769, rdr.read_u48::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_u48<T: ByteOrder>(&mut self) -> Result<u64> { | |
let mut buf = [0; 6]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_u48(&buf)) | |
} | |
/// Reads a signed 48 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read signed 48 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0x9d, 0x71, 0xab, 0xe7, 0x97, 0x8f]); | |
/// assert_eq!(-108363435763825, rdr.read_i48::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_i48<T: ByteOrder>(&mut self) -> Result<i64> { | |
let mut buf = [0; 6]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_i48(&buf)) | |
} | |
/// Reads an unsigned 64 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read an unsigned 64 bit big-endian integer from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83]); | |
/// assert_eq!(918733457491587, rdr.read_u64::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_u64<T: ByteOrder>(&mut self) -> Result<u64> { | |
let mut buf = [0; 8]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_u64(&buf)) | |
} | |
/// Reads a signed 64 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a signed 64 bit big-endian integer from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0x80, 0, 0, 0, 0, 0, 0, 0]); | |
/// assert_eq!(i64::min_value(), rdr.read_i64::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_i64<T: ByteOrder>(&mut self) -> Result<i64> { | |
let mut buf = [0; 8]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_i64(&buf)) | |
} | |
/// Reads an unsigned 128 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read an unsigned 128 bit big-endian integer from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![ | |
/// 0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83, | |
/// 0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83 | |
/// ]); | |
/// assert_eq!(16947640962301618749969007319746179, rdr.read_u128::<BigEndian>().unwrap()); | |
/// ``` | |
#[cfg(byteorder_i128)] | |
#[inline] | |
fn read_u128<T: ByteOrder>(&mut self) -> Result<u128> { | |
let mut buf = [0; 16]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_u128(&buf)) | |
} | |
/// Reads a signed 128 bit integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a signed 128 bit big-endian integer from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); | |
/// assert_eq!(i128::min_value(), rdr.read_i128::<BigEndian>().unwrap()); | |
/// ``` | |
#[cfg(byteorder_i128)] | |
#[inline] | |
fn read_i128<T: ByteOrder>(&mut self) -> Result<i128> { | |
let mut buf = [0; 16]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_i128(&buf)) | |
} | |
/// Reads an unsigned n-bytes integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read an unsigned n-byte big-endian integer from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0x80, 0x74, 0xfa]); | |
/// assert_eq!(8418554, rdr.read_uint::<BigEndian>(3).unwrap()); | |
#[inline] | |
fn read_uint<T: ByteOrder>(&mut self, nbytes: usize) -> Result<u64> { | |
let mut buf = [0; 8]; | |
try!(self.read_exact(&mut buf[..nbytes])); | |
Ok(T::read_uint(&buf[..nbytes], nbytes)) | |
} | |
/// Reads a signed n-bytes integer from the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read an unsigned n-byte big-endian integer from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0xc1, 0xff, 0x7c]); | |
/// assert_eq!(-4063364, rdr.read_int::<BigEndian>(3).unwrap()); | |
#[inline] | |
fn read_int<T: ByteOrder>(&mut self, nbytes: usize) -> Result<i64> { | |
let mut buf = [0; 8]; | |
try!(self.read_exact(&mut buf[..nbytes])); | |
Ok(T::read_int(&buf[..nbytes], nbytes)) | |
} | |
/// Reads an unsigned n-bytes integer from the underlying reader. | |
#[cfg(byteorder_i128)] | |
#[inline] | |
fn read_uint128<T: ByteOrder>(&mut self, nbytes: usize) -> Result<u128> { | |
let mut buf = [0; 16]; | |
try!(self.read_exact(&mut buf[..nbytes])); | |
Ok(T::read_uint128(&buf[..nbytes], nbytes)) | |
} | |
/// Reads a signed n-bytes integer from the underlying reader. | |
#[cfg(byteorder_i128)] | |
#[inline] | |
fn read_int128<T: ByteOrder>(&mut self, nbytes: usize) -> Result<i128> { | |
let mut buf = [0; 16]; | |
try!(self.read_exact(&mut buf[..nbytes])); | |
Ok(T::read_int128(&buf[..nbytes], nbytes)) | |
} | |
/// Reads a IEEE754 single-precision (4 bytes) floating point number from | |
/// the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a big-endian single-precision floating point number from a `Read`: | |
/// | |
/// ```rust | |
/// use std::f32; | |
/// use std::io::Cursor; | |
/// | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![ | |
/// 0x40, 0x49, 0x0f, 0xdb, | |
/// ]); | |
/// assert_eq!(f32::consts::PI, rdr.read_f32::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_f32<T: ByteOrder>(&mut self) -> Result<f32> { | |
let mut buf = [0; 4]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_f32(&buf)) | |
} | |
/// Reads a IEEE754 double-precision (8 bytes) floating point number from | |
/// the underlying reader. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a big-endian double-precision floating point number from a `Read`: | |
/// | |
/// ```rust | |
/// use std::f64; | |
/// use std::io::Cursor; | |
/// | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![ | |
/// 0x40, 0x09, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18, | |
/// ]); | |
/// assert_eq!(f64::consts::PI, rdr.read_f64::<BigEndian>().unwrap()); | |
/// ``` | |
#[inline] | |
fn read_f64<T: ByteOrder>(&mut self) -> Result<f64> { | |
let mut buf = [0; 8]; | |
try!(self.read_exact(&mut buf)); | |
Ok(T::read_f64(&buf)) | |
} | |
/// Reads a sequence of unsigned 16 bit integers from the underlying | |
/// reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of unsigned 16 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![2, 5, 3, 0]); | |
/// let mut dst = [0; 2]; | |
/// rdr.read_u16_into::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([517, 768], dst); | |
/// ``` | |
#[inline] | |
fn read_u16_into<T: ByteOrder>(&mut self, dst: &mut [u16]) -> Result<()> { | |
{ | |
let buf = unsafe { slice_to_u8_mut(dst) }; | |
try!(self.read_exact(buf)); | |
} | |
T::from_slice_u16(dst); | |
Ok(()) | |
} | |
/// Reads a sequence of unsigned 32 bit integers from the underlying | |
/// reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of unsigned 32 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0, 0, 2, 5, 0, 0, 3, 0]); | |
/// let mut dst = [0; 2]; | |
/// rdr.read_u32_into::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([517, 768], dst); | |
/// ``` | |
#[inline] | |
fn read_u32_into<T: ByteOrder>(&mut self, dst: &mut [u32]) -> Result<()> { | |
{ | |
let buf = unsafe { slice_to_u8_mut(dst) }; | |
try!(self.read_exact(buf)); | |
} | |
T::from_slice_u32(dst); | |
Ok(()) | |
} | |
/// Reads a sequence of unsigned 64 bit integers from the underlying | |
/// reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of unsigned 64 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![ | |
/// 0, 0, 0, 0, 0, 0, 2, 5, | |
/// 0, 0, 0, 0, 0, 0, 3, 0, | |
/// ]); | |
/// let mut dst = [0; 2]; | |
/// rdr.read_u64_into::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([517, 768], dst); | |
/// ``` | |
#[inline] | |
fn read_u64_into<T: ByteOrder>(&mut self, dst: &mut [u64]) -> Result<()> { | |
{ | |
let buf = unsafe { slice_to_u8_mut(dst) }; | |
try!(self.read_exact(buf)); | |
} | |
T::from_slice_u64(dst); | |
Ok(()) | |
} | |
/// Reads a sequence of unsigned 128 bit integers from the underlying | |
/// reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of unsigned 128 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![ | |
/// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, | |
/// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, | |
/// ]); | |
/// let mut dst = [0; 2]; | |
/// rdr.read_u128_into::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([517, 768], dst); | |
/// ``` | |
#[cfg(byteorder_i128)] | |
#[inline] | |
fn read_u128_into<T: ByteOrder>( | |
&mut self, | |
dst: &mut [u128], | |
) -> Result<()> { | |
{ | |
let buf = unsafe { slice_to_u8_mut(dst) }; | |
try!(self.read_exact(buf)); | |
} | |
T::from_slice_u128(dst); | |
Ok(()) | |
} | |
/// Reads a sequence of signed 8 bit integers from the underlying reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// Note that since each `i8` is a single byte, no byte order conversions | |
/// are used. This method is included because it provides a safe, simple | |
/// way for the caller to read into a `&mut [i8]` buffer. (Without this | |
/// method, the caller would have to either use `unsafe` code or convert | |
/// each byte to `i8` individually.) | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of signed 8 bit integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![2, 251, 3]); | |
/// let mut dst = [0; 3]; | |
/// rdr.read_i8_into(&mut dst).unwrap(); | |
/// assert_eq!([2, -5, 3], dst); | |
/// ``` | |
#[inline] | |
fn read_i8_into(&mut self, dst: &mut [i8]) -> Result<()> { | |
let buf = unsafe { slice_to_u8_mut(dst) }; | |
self.read_exact(buf) | |
} | |
/// Reads a sequence of signed 16 bit integers from the underlying | |
/// reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of signed 16 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![2, 5, 3, 0]); | |
/// let mut dst = [0; 2]; | |
/// rdr.read_i16_into::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([517, 768], dst); | |
/// ``` | |
#[inline] | |
fn read_i16_into<T: ByteOrder>(&mut self, dst: &mut [i16]) -> Result<()> { | |
{ | |
let buf = unsafe { slice_to_u8_mut(dst) }; | |
try!(self.read_exact(buf)); | |
} | |
T::from_slice_i16(dst); | |
Ok(()) | |
} | |
/// Reads a sequence of signed 32 bit integers from the underlying | |
/// reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of signed 32 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![0, 0, 2, 5, 0, 0, 3, 0]); | |
/// let mut dst = [0; 2]; | |
/// rdr.read_i32_into::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([517, 768], dst); | |
/// ``` | |
#[inline] | |
fn read_i32_into<T: ByteOrder>(&mut self, dst: &mut [i32]) -> Result<()> { | |
{ | |
let buf = unsafe { slice_to_u8_mut(dst) }; | |
try!(self.read_exact(buf)); | |
} | |
T::from_slice_i32(dst); | |
Ok(()) | |
} | |
/// Reads a sequence of signed 64 bit integers from the underlying | |
/// reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of signed 64 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![ | |
/// 0, 0, 0, 0, 0, 0, 2, 5, | |
/// 0, 0, 0, 0, 0, 0, 3, 0, | |
/// ]); | |
/// let mut dst = [0; 2]; | |
/// rdr.read_i64_into::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([517, 768], dst); | |
/// ``` | |
#[inline] | |
fn read_i64_into<T: ByteOrder>(&mut self, dst: &mut [i64]) -> Result<()> { | |
{ | |
let buf = unsafe { slice_to_u8_mut(dst) }; | |
try!(self.read_exact(buf)); | |
} | |
T::from_slice_i64(dst); | |
Ok(()) | |
} | |
/// Reads a sequence of signed 128 bit integers from the underlying | |
/// reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of signed 128 bit big-endian integers from a `Read`: | |
/// | |
/// ```rust | |
/// use std::io::Cursor; | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![ | |
/// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, | |
/// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, | |
/// ]); | |
/// let mut dst = [0; 2]; | |
/// rdr.read_i128_into::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([517, 768], dst); | |
/// ``` | |
#[cfg(byteorder_i128)] | |
#[inline] | |
fn read_i128_into<T: ByteOrder>( | |
&mut self, | |
dst: &mut [i128], | |
) -> Result<()> { | |
{ | |
let buf = unsafe { slice_to_u8_mut(dst) }; | |
try!(self.read_exact(buf)); | |
} | |
T::from_slice_i128(dst); | |
Ok(()) | |
} | |
/// Reads a sequence of IEEE754 single-precision (4 bytes) floating | |
/// point numbers from the underlying reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of big-endian single-precision floating point number | |
/// from a `Read`: | |
/// | |
/// ```rust | |
/// use std::f32; | |
/// use std::io::Cursor; | |
/// | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![ | |
/// 0x40, 0x49, 0x0f, 0xdb, | |
/// 0x3f, 0x80, 0x00, 0x00, | |
/// ]); | |
/// let mut dst = [0.0; 2]; | |
/// rdr.read_f32_into::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([f32::consts::PI, 1.0], dst); | |
/// ``` | |
#[inline] | |
fn read_f32_into<T: ByteOrder>(&mut self, dst: &mut [f32]) -> Result<()> { | |
{ | |
let buf = unsafe { slice_to_u8_mut(dst) }; | |
try!(self.read_exact(buf)); | |
} | |
T::from_slice_f32(dst); | |
Ok(()) | |
} | |
/// **DEPRECATED**. | |
/// | |
/// This method is deprecated. Use `read_f32_into` instead. | |
/// | |
/// Reads a sequence of IEEE754 single-precision (4 bytes) floating | |
/// point numbers from the underlying reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of big-endian single-precision floating point number | |
/// from a `Read`: | |
/// | |
/// ```rust | |
/// use std::f32; | |
/// use std::io::Cursor; | |
/// | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![ | |
/// 0x40, 0x49, 0x0f, 0xdb, | |
/// 0x3f, 0x80, 0x00, 0x00, | |
/// ]); | |
/// let mut dst = [0.0; 2]; | |
/// rdr.read_f32_into_unchecked::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([f32::consts::PI, 1.0], dst); | |
/// ``` | |
#[inline] | |
#[deprecated(since = "1.2.0", note = "please use `read_f32_into` instead")] | |
fn read_f32_into_unchecked<T: ByteOrder>( | |
&mut self, | |
dst: &mut [f32], | |
) -> Result<()> { | |
self.read_f32_into::<T>(dst) | |
} | |
/// Reads a sequence of IEEE754 double-precision (8 bytes) floating | |
/// point numbers from the underlying reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of big-endian single-precision floating point number | |
/// from a `Read`: | |
/// | |
/// ```rust | |
/// use std::f64; | |
/// use std::io::Cursor; | |
/// | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![ | |
/// 0x40, 0x09, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18, | |
/// 0x3f, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
/// ]); | |
/// let mut dst = [0.0; 2]; | |
/// rdr.read_f64_into::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([f64::consts::PI, 1.0], dst); | |
/// ``` | |
#[inline] | |
fn read_f64_into<T: ByteOrder>(&mut self, dst: &mut [f64]) -> Result<()> { | |
{ | |
let buf = unsafe { slice_to_u8_mut(dst) }; | |
try!(self.read_exact(buf)); | |
} | |
T::from_slice_f64(dst); | |
Ok(()) | |
} | |
/// **DEPRECATED**. | |
/// | |
/// This method is deprecated. Use `read_f64_into` instead. | |
/// | |
/// Reads a sequence of IEEE754 double-precision (8 bytes) floating | |
/// point numbers from the underlying reader. | |
/// | |
/// The given buffer is either filled completely or an error is returned. | |
/// If an error is returned, the contents of `dst` are unspecified. | |
/// | |
/// # Safety | |
/// | |
/// This method is unsafe because there are no guarantees made about the | |
/// floating point values. In particular, this method does not check for | |
/// signaling NaNs, which may result in undefined behavior. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Read::read_exact`]. | |
/// | |
/// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact | |
/// | |
/// # Examples | |
/// | |
/// Read a sequence of big-endian single-precision floating point number | |
/// from a `Read`: | |
/// | |
/// ```rust | |
/// use std::f64; | |
/// use std::io::Cursor; | |
/// | |
/// use byteorder::{BigEndian, ReadBytesExt}; | |
/// | |
/// let mut rdr = Cursor::new(vec![ | |
/// 0x40, 0x09, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18, | |
/// 0x3f, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
/// ]); | |
/// let mut dst = [0.0; 2]; | |
/// rdr.read_f64_into_unchecked::<BigEndian>(&mut dst).unwrap(); | |
/// assert_eq!([f64::consts::PI, 1.0], dst); | |
/// ``` | |
#[inline] | |
#[deprecated(since = "1.2.0", note = "please use `read_f64_into` instead")] | |
fn read_f64_into_unchecked<T: ByteOrder>( | |
&mut self, | |
dst: &mut [f64], | |
) -> Result<()> { | |
self.read_f64_into::<T>(dst) | |
} | |
} | |
/// All types that implement `Read` get methods defined in `ReadBytesExt` | |
/// for free. | |
impl<R: io::Read + ?Sized> ReadBytesExt for R {} | |
/// Extends [`Write`] with methods for writing numbers. (For `std::io`.) | |
/// | |
/// Most of the methods defined here have an unconstrained type parameter that | |
/// must be explicitly instantiated. Typically, it is instantiated with either | |
/// the [`BigEndian`] or [`LittleEndian`] types defined in this crate. | |
/// | |
/// # Examples | |
/// | |
/// Write unsigned 16 bit big-endian integers to a [`Write`]: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = vec![]; | |
/// wtr.write_u16::<BigEndian>(517).unwrap(); | |
/// wtr.write_u16::<BigEndian>(768).unwrap(); | |
/// assert_eq!(wtr, vec![2, 5, 3, 0]); | |
/// ``` | |
/// | |
/// [`BigEndian`]: enum.BigEndian.html | |
/// [`LittleEndian`]: enum.LittleEndian.html | |
/// [`Write`]: https://doc.rust-lang.org/std/io/trait.Write.html | |
pub trait WriteBytesExt: io::Write { | |
/// Writes an unsigned 8 bit integer to the underlying writer. | |
/// | |
/// Note that since this writes a single byte, no byte order conversions | |
/// are used. It is included for completeness. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write unsigned 8 bit integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::WriteBytesExt; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_u8(2).unwrap(); | |
/// wtr.write_u8(5).unwrap(); | |
/// assert_eq!(wtr, b"\x02\x05"); | |
/// ``` | |
#[inline] | |
fn write_u8(&mut self, n: u8) -> Result<()> { | |
self.write_all(&[n]) | |
} | |
/// Writes a signed 8 bit integer to the underlying writer. | |
/// | |
/// Note that since this writes a single byte, no byte order conversions | |
/// are used. It is included for completeness. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write signed 8 bit integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::WriteBytesExt; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_i8(2).unwrap(); | |
/// wtr.write_i8(-5).unwrap(); | |
/// assert_eq!(wtr, b"\x02\xfb"); | |
/// ``` | |
#[inline] | |
fn write_i8(&mut self, n: i8) -> Result<()> { | |
self.write_all(&[n as u8]) | |
} | |
/// Writes an unsigned 16 bit integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write unsigned 16 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_u16::<BigEndian>(517).unwrap(); | |
/// wtr.write_u16::<BigEndian>(768).unwrap(); | |
/// assert_eq!(wtr, b"\x02\x05\x03\x00"); | |
/// ``` | |
#[inline] | |
fn write_u16<T: ByteOrder>(&mut self, n: u16) -> Result<()> { | |
let mut buf = [0; 2]; | |
T::write_u16(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes a signed 16 bit integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write signed 16 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_i16::<BigEndian>(193).unwrap(); | |
/// wtr.write_i16::<BigEndian>(-132).unwrap(); | |
/// assert_eq!(wtr, b"\x00\xc1\xff\x7c"); | |
/// ``` | |
#[inline] | |
fn write_i16<T: ByteOrder>(&mut self, n: i16) -> Result<()> { | |
let mut buf = [0; 2]; | |
T::write_i16(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes an unsigned 24 bit integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write unsigned 24 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_u24::<BigEndian>(267).unwrap(); | |
/// wtr.write_u24::<BigEndian>(120111).unwrap(); | |
/// assert_eq!(wtr, b"\x00\x01\x0b\x01\xd5\x2f"); | |
/// ``` | |
#[inline] | |
fn write_u24<T: ByteOrder>(&mut self, n: u32) -> Result<()> { | |
let mut buf = [0; 3]; | |
T::write_u24(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes a signed 24 bit integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write signed 24 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_i24::<BigEndian>(-34253).unwrap(); | |
/// wtr.write_i24::<BigEndian>(120111).unwrap(); | |
/// assert_eq!(wtr, b"\xff\x7a\x33\x01\xd5\x2f"); | |
/// ``` | |
#[inline] | |
fn write_i24<T: ByteOrder>(&mut self, n: i32) -> Result<()> { | |
let mut buf = [0; 3]; | |
T::write_i24(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes an unsigned 32 bit integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write unsigned 32 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_u32::<BigEndian>(267).unwrap(); | |
/// wtr.write_u32::<BigEndian>(1205419366).unwrap(); | |
/// assert_eq!(wtr, b"\x00\x00\x01\x0b\x47\xd9\x3d\x66"); | |
/// ``` | |
#[inline] | |
fn write_u32<T: ByteOrder>(&mut self, n: u32) -> Result<()> { | |
let mut buf = [0; 4]; | |
T::write_u32(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes a signed 32 bit integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write signed 32 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_i32::<BigEndian>(-34253).unwrap(); | |
/// wtr.write_i32::<BigEndian>(1205419366).unwrap(); | |
/// assert_eq!(wtr, b"\xff\xff\x7a\x33\x47\xd9\x3d\x66"); | |
/// ``` | |
#[inline] | |
fn write_i32<T: ByteOrder>(&mut self, n: i32) -> Result<()> { | |
let mut buf = [0; 4]; | |
T::write_i32(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes an unsigned 48 bit integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write unsigned 48 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_u48::<BigEndian>(52360336390828).unwrap(); | |
/// wtr.write_u48::<BigEndian>(541).unwrap(); | |
/// assert_eq!(wtr, b"\x2f\x9f\x17\x40\x3a\xac\x00\x00\x00\x00\x02\x1d"); | |
/// ``` | |
#[inline] | |
fn write_u48<T: ByteOrder>(&mut self, n: u64) -> Result<()> { | |
let mut buf = [0; 6]; | |
T::write_u48(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes a signed 48 bit integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write signed 48 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_i48::<BigEndian>(-108363435763825).unwrap(); | |
/// wtr.write_i48::<BigEndian>(77).unwrap(); | |
/// assert_eq!(wtr, b"\x9d\x71\xab\xe7\x97\x8f\x00\x00\x00\x00\x00\x4d"); | |
/// ``` | |
#[inline] | |
fn write_i48<T: ByteOrder>(&mut self, n: i64) -> Result<()> { | |
let mut buf = [0; 6]; | |
T::write_i48(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes an unsigned 64 bit integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write unsigned 64 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_u64::<BigEndian>(918733457491587).unwrap(); | |
/// wtr.write_u64::<BigEndian>(143).unwrap(); | |
/// assert_eq!(wtr, b"\x00\x03\x43\x95\x4d\x60\x86\x83\x00\x00\x00\x00\x00\x00\x00\x8f"); | |
/// ``` | |
#[inline] | |
fn write_u64<T: ByteOrder>(&mut self, n: u64) -> Result<()> { | |
let mut buf = [0; 8]; | |
T::write_u64(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes a signed 64 bit integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write signed 64 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_i64::<BigEndian>(i64::min_value()).unwrap(); | |
/// wtr.write_i64::<BigEndian>(i64::max_value()).unwrap(); | |
/// assert_eq!(wtr, b"\x80\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff"); | |
/// ``` | |
#[inline] | |
fn write_i64<T: ByteOrder>(&mut self, n: i64) -> Result<()> { | |
let mut buf = [0; 8]; | |
T::write_i64(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes an unsigned 128 bit integer to the underlying writer. | |
#[cfg(byteorder_i128)] | |
#[inline] | |
fn write_u128<T: ByteOrder>(&mut self, n: u128) -> Result<()> { | |
let mut buf = [0; 16]; | |
T::write_u128(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes a signed 128 bit integer to the underlying writer. | |
#[cfg(byteorder_i128)] | |
#[inline] | |
fn write_i128<T: ByteOrder>(&mut self, n: i128) -> Result<()> { | |
let mut buf = [0; 16]; | |
T::write_i128(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes an unsigned n-bytes integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Panics | |
/// | |
/// If the given integer is not representable in the given number of bytes, | |
/// this method panics. If `nbytes > 8`, this method panics. | |
/// | |
/// # Examples | |
/// | |
/// Write unsigned 40 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_uint::<BigEndian>(312550384361, 5).unwrap(); | |
/// wtr.write_uint::<BigEndian>(43, 5).unwrap(); | |
/// assert_eq!(wtr, b"\x48\xc5\x74\x62\xe9\x00\x00\x00\x00\x2b"); | |
/// ``` | |
#[inline] | |
fn write_uint<T: ByteOrder>( | |
&mut self, | |
n: u64, | |
nbytes: usize, | |
) -> Result<()> { | |
let mut buf = [0; 8]; | |
T::write_uint(&mut buf, n, nbytes); | |
self.write_all(&buf[0..nbytes]) | |
} | |
/// Writes a signed n-bytes integer to the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Panics | |
/// | |
/// If the given integer is not representable in the given number of bytes, | |
/// this method panics. If `nbytes > 8`, this method panics. | |
/// | |
/// # Examples | |
/// | |
/// Write signed 56 bit big-endian integers to a `Write`: | |
/// | |
/// ```rust | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_int::<BigEndian>(-3548172039376767, 7).unwrap(); | |
/// wtr.write_int::<BigEndian>(43, 7).unwrap(); | |
/// assert_eq!(wtr, b"\xf3\x64\xf4\xd1\xfd\xb0\x81\x00\x00\x00\x00\x00\x00\x2b"); | |
/// ``` | |
#[inline] | |
fn write_int<T: ByteOrder>( | |
&mut self, | |
n: i64, | |
nbytes: usize, | |
) -> Result<()> { | |
let mut buf = [0; 8]; | |
T::write_int(&mut buf, n, nbytes); | |
self.write_all(&buf[0..nbytes]) | |
} | |
/// Writes an unsigned n-bytes integer to the underlying writer. | |
/// | |
/// If the given integer is not representable in the given number of bytes, | |
/// this method panics. If `nbytes > 16`, this method panics. | |
#[cfg(byteorder_i128)] | |
#[inline] | |
fn write_uint128<T: ByteOrder>( | |
&mut self, | |
n: u128, | |
nbytes: usize, | |
) -> Result<()> { | |
let mut buf = [0; 16]; | |
T::write_uint128(&mut buf, n, nbytes); | |
self.write_all(&buf[0..nbytes]) | |
} | |
/// Writes a signed n-bytes integer to the underlying writer. | |
/// | |
/// If the given integer is not representable in the given number of bytes, | |
/// this method panics. If `nbytes > 16`, this method panics. | |
#[cfg(byteorder_i128)] | |
#[inline] | |
fn write_int128<T: ByteOrder>( | |
&mut self, | |
n: i128, | |
nbytes: usize, | |
) -> Result<()> { | |
let mut buf = [0; 16]; | |
T::write_int128(&mut buf, n, nbytes); | |
self.write_all(&buf[0..nbytes]) | |
} | |
/// Writes a IEEE754 single-precision (4 bytes) floating point number to | |
/// the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write a big-endian single-precision floating point number to a `Write`: | |
/// | |
/// ```rust | |
/// use std::f32; | |
/// | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_f32::<BigEndian>(f32::consts::PI).unwrap(); | |
/// assert_eq!(wtr, b"\x40\x49\x0f\xdb"); | |
/// ``` | |
#[inline] | |
fn write_f32<T: ByteOrder>(&mut self, n: f32) -> Result<()> { | |
let mut buf = [0; 4]; | |
T::write_f32(&mut buf, n); | |
self.write_all(&buf) | |
} | |
/// Writes a IEEE754 double-precision (8 bytes) floating point number to | |
/// the underlying writer. | |
/// | |
/// # Errors | |
/// | |
/// This method returns the same errors as [`Write::write_all`]. | |
/// | |
/// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all | |
/// | |
/// # Examples | |
/// | |
/// Write a big-endian double-precision floating point number to a `Write`: | |
/// | |
/// ```rust | |
/// use std::f64; | |
/// | |
/// use byteorder::{BigEndian, WriteBytesExt}; | |
/// | |
/// let mut wtr = Vec::new(); | |
/// wtr.write_f64::<BigEndian>(f64::consts::PI).unwrap(); | |
/// assert_eq!(wtr, b"\x40\x09\x21\xfb\x54\x44\x2d\x18"); | |
/// ``` | |
#[inline] | |
fn write_f64<T: ByteOrder>(&mut self, n: f64) -> Result<()> { | |
let mut buf = [0; 8]; | |
T::write_f64(&mut buf, n); | |
self.write_all(&buf) | |
} | |
} | |
/// All types that implement `Write` get methods defined in `WriteBytesExt` | |
/// for free. | |
impl<W: io::Write + ?Sized> WriteBytesExt for W {} | |
/// Convert a slice of T (where T is plain old data) to its mutable binary | |
/// representation. | |
/// | |
/// This function is wildly unsafe because it permits arbitrary modification of | |
/// the binary representation of any `Copy` type. Use with care. | |
unsafe fn slice_to_u8_mut<T: Copy>(slice: &mut [T]) -> &mut [u8] { | |
use std::mem::size_of; | |
let len = size_of::<T>() * slice.len(); | |
slice::from_raw_parts_mut(slice.as_mut_ptr() as *mut u8, len) | |
} |