speedy 0.4.1

A fast binary serialization framework
Documentation
use std::io;
use std::mem;
use std::borrow::Cow;

use endianness::Endianness;
use readable::Readable;
use context::Context;

pub trait Reader< 'a, C: Context >: Sized {
    fn read_bytes( &mut self, output: &mut [u8] ) -> io::Result< () >;
    fn context( &self ) -> &C;
    fn context_mut( &mut self ) -> &mut C;

    #[inline]
    fn read_bytes_cow( &mut self, length: usize ) -> io::Result< Cow< 'a, [u8] > > {
        let mut buffer = Vec::with_capacity( length );
        unsafe { buffer.set_len( length ) };
        try!( self.read_bytes( &mut buffer ) );
        Ok( Cow::Owned( buffer ) )
    }

    #[inline]
    fn read_u8( &mut self ) -> io::Result< u8 > {
        let mut slice: [u8; 1] = unsafe { mem::uninitialized() };
        try!( self.read_bytes( &mut slice ) );
        Ok( slice[0] )
    }

    #[inline]
    fn read_i8( &mut self ) -> io::Result< i8 > {
        self.read_u8().map( |byte| byte as i8 )
    }

    #[inline]
    fn read_u16( &mut self ) -> io::Result< u16 > {
        let mut slice: [u8; 2] = unsafe { mem::uninitialized() };
        try!( self.read_bytes( &mut slice ) );
        Ok( self.context().endianness().read_u16( &slice ) )
    }

    #[inline]
    fn read_i16( &mut self ) -> io::Result< i16 > {
        let mut slice: [u8; 2] = unsafe { mem::uninitialized() };
        try!( self.read_bytes( &mut slice ) );
        Ok( self.context().endianness().read_i16( &slice ) )
    }

    #[inline]
    fn read_u32( &mut self ) -> io::Result< u32 > {
        let mut slice: [u8; 4] = unsafe { mem::uninitialized() };
        try!( self.read_bytes( &mut slice ) );
        Ok( self.context().endianness().read_u32( &slice ) )
    }

    #[inline]
    fn read_i32( &mut self ) -> io::Result< i32 > {
        let mut slice: [u8; 4] = unsafe { mem::uninitialized() };
        try!( self.read_bytes( &mut slice ) );
        Ok( self.context().endianness().read_i32( &slice ) )
    }

    #[inline]
    fn read_u64( &mut self ) -> io::Result< u64 > {
        let mut slice: [u8; 8] = unsafe { mem::uninitialized() };
        try!( self.read_bytes( &mut slice ) );
        Ok( self.context().endianness().read_u64( &slice ) )
    }

    #[inline]
    fn read_i64( &mut self ) -> io::Result< i64 > {
        let mut slice: [u8; 8] = unsafe { mem::uninitialized() };
        try!( self.read_bytes( &mut slice ) );
        Ok( self.context().endianness().read_i64( &slice ) )
    }

    #[inline]
    fn read_f32( &mut self ) -> io::Result< f32 > {
        let mut slice: [u8; 4] = unsafe { mem::uninitialized() };
        try!( self.read_bytes( &mut slice ) );
        Ok( self.context().endianness().read_f32( &slice ) )
    }

    #[inline]
    fn read_f64( &mut self ) -> io::Result< f64 > {
        let mut slice: [u8; 8] = unsafe { mem::uninitialized() };
        try!( self.read_bytes( &mut slice ) );
        Ok( self.context().endianness().read_f64( &slice ) )
    }

    #[inline]
    fn read_value< T: Readable< 'a, C > >( &mut self ) -> io::Result< T > {
        T::read_from( self )
    }

    #[inline]
    fn endianness( &self ) -> Endianness {
        self.context().endianness()
    }
}