use super::BasicEncode;
use crate::error::Result;
use byteordered::{ByteOrdered, Endianness};
use std::io::Write;
#[derive(Debug, Default, Clone, PartialEq)]
pub struct LittleEndianBasicEncoder;
impl BasicEncode for LittleEndianBasicEncoder {
fn endianness(&self) -> Endianness {
Endianness::Little
}
fn encode_us<S>(&self, to: S, value: u16) -> Result<()>
where
S: Write,
{
ByteOrdered::le(to).write_u16(value)?;
Ok(())
}
fn encode_ul<S>(&self, to: S, value: u32) -> Result<()>
where
S: Write,
{
ByteOrdered::le(to).write_u32(value)?;
Ok(())
}
fn encode_ss<S>(&self, to: S, value: i16) -> Result<()>
where
S: Write,
{
ByteOrdered::le(to).write_i16(value)?;
Ok(())
}
fn encode_sl<S>(&self, to: S, value: i32) -> Result<()>
where
S: Write,
{
ByteOrdered::le(to).write_i32(value)?;
Ok(())
}
fn encode_fl<S>(&self, to: S, value: f32) -> Result<()>
where
S: Write,
{
ByteOrdered::le(to).write_f32(value)?;
Ok(())
}
fn encode_fd<S>(&self, to: S, value: f64) -> Result<()>
where
S: Write,
{
ByteOrdered::le(to).write_f64(value)?;
Ok(())
}
}
#[derive(Debug, Default, Clone, PartialEq)]
pub struct BigEndianBasicEncoder;
impl BasicEncode for BigEndianBasicEncoder {
fn endianness(&self) -> Endianness {
Endianness::Big
}
fn encode_us<S>(&self, to: S, value: u16) -> Result<()>
where
S: Write,
{
ByteOrdered::be(to).write_u16(value)?;
Ok(())
}
fn encode_ul<S>(&self, to: S, value: u32) -> Result<()>
where
S: Write,
{
ByteOrdered::be(to).write_u32(value)?;
Ok(())
}
fn encode_ss<S>(&self, to: S, value: i16) -> Result<()>
where
S: Write,
{
ByteOrdered::be(to).write_i16(value)?;
Ok(())
}
fn encode_sl<S>(&self, to: S, value: i32) -> Result<()>
where
S: Write,
{
ByteOrdered::be(to).write_i32(value)?;
Ok(())
}
fn encode_fl<S>(&self, to: S, value: f32) -> Result<()>
where
S: Write,
{
ByteOrdered::be(to).write_f32(value)?;
Ok(())
}
fn encode_fd<S>(&self, to: S, value: f64) -> Result<()>
where
S: Write,
{
ByteOrdered::be(to).write_f64(value)?;
Ok(())
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum BasicEncoder {
LE(LittleEndianBasicEncoder),
BE(BigEndianBasicEncoder),
}
use self::BasicEncoder::{BE, LE};
macro_rules! for_both {
($endianness: expr, |$e: ident| $f: expr) => {
match *$endianness {
LE(ref $e) => $f,
BE(ref $e) => $f,
}
};
}
impl BasicEncode for BasicEncoder {
fn endianness(&self) -> Endianness {
match *self {
LE(_) => Endianness::Little,
BE(_) => Endianness::Big,
}
}
fn encode_us<S>(&self, to: S, value: u16) -> Result<()>
where
S: Write,
{
for_both!(self, |e| e.encode_us(to, value))
}
fn encode_ul<S>(&self, to: S, value: u32) -> Result<()>
where
S: Write,
{
for_both!(self, |e| e.encode_ul(to, value))
}
fn encode_ss<S>(&self, to: S, value: i16) -> Result<()>
where
S: Write,
{
for_both!(self, |e| e.encode_ss(to, value))
}
fn encode_sl<S>(&self, to: S, value: i32) -> Result<()>
where
S: Write,
{
for_both!(self, |e| e.encode_sl(to, value))
}
fn encode_fl<S>(&self, to: S, value: f32) -> Result<()>
where
S: Write,
{
for_both!(self, |e| e.encode_fl(to, value))
}
fn encode_fd<S>(&self, to: S, value: f64) -> Result<()>
where
S: Write,
{
for_both!(self, |e| e.encode_fd(to, value))
}
}