use test::Bencher; use serialize::Decodable; use de::{Deserializable}; ////////////////////////////////////////////////////////////////////////////// #[deriving(Show)] enum Error { EndOfStream, SyntaxError, } ////////////////////////////////////////////////////////////////////////////// mod decoder { use std::vec; use serialize::Decoder; use super::{Error, EndOfStream, SyntaxError}; pub struct BytesDecoder { iter: vec::MoveItems, } impl BytesDecoder { #[inline] pub fn new(values: Vec) -> BytesDecoder { BytesDecoder { iter: values.move_iter() } } } impl Decoder for BytesDecoder { // Primitive types: fn read_nil(&mut self) -> Result<(), Error> { Err(SyntaxError) } fn read_uint(&mut self) -> Result { Err(SyntaxError) } fn read_u64(&mut self) -> Result { Err(SyntaxError) } fn read_u32(&mut self) -> Result { Err(SyntaxError) } fn read_u16(&mut self) -> Result { Err(SyntaxError) } #[inline] fn read_u8(&mut self) -> Result { match self.iter.next() { Some(value) => Ok(value), None => Err(EndOfStream), } } fn read_int(&mut self) -> Result { Err(SyntaxError) } fn read_i64(&mut self) -> Result { Err(SyntaxError) } fn read_i32(&mut self) -> Result { Err(SyntaxError) } fn read_i16(&mut self) -> Result { Err(SyntaxError) } fn read_i8(&mut self) -> Result { Err(SyntaxError) } fn read_bool(&mut self) -> Result { Err(SyntaxError) } fn read_f64(&mut self) -> Result { Err(SyntaxError) } fn read_f32(&mut self) -> Result { Err(SyntaxError) } fn read_char(&mut self) -> Result { Err(SyntaxError) } fn read_str(&mut self) -> Result { Err(SyntaxError) } // Compound types: fn read_enum(&mut self, _name: &str, _f: |&mut BytesDecoder| -> Result) -> Result { Err(SyntaxError) } fn read_enum_variant(&mut self, _names: &[&str], _f: |&mut BytesDecoder, uint| -> Result) -> Result { Err(SyntaxError) } fn read_enum_variant_arg(&mut self, _a_idx: uint, _f: |&mut BytesDecoder| -> Result) -> Result { Err(SyntaxError) } fn read_enum_struct_variant(&mut self, _names: &[&str], _f: |&mut BytesDecoder, uint| -> Result) -> Result { Err(SyntaxError) } fn read_enum_struct_variant_field(&mut self, _f_name: &str, _f_idx: uint, _f: |&mut BytesDecoder| -> Result) -> Result { Err(SyntaxError) } fn read_struct(&mut self, _s_name: &str, _len: uint, _f: |&mut BytesDecoder| -> Result) -> Result { Err(SyntaxError) } fn read_struct_field(&mut self, _f_name: &str, _f_idx: uint, _f: |&mut BytesDecoder| -> Result) -> Result { Err(SyntaxError) } fn read_tuple(&mut self, _f: |&mut BytesDecoder, uint| -> Result) -> Result { Err(SyntaxError) } fn read_tuple_arg(&mut self, _a_idx: uint, _f: |&mut BytesDecoder| -> Result) -> Result { Err(SyntaxError) } fn read_tuple_struct(&mut self, _s_name: &str, _f: |&mut BytesDecoder, uint| -> Result) -> Result { Err(SyntaxError) } fn read_tuple_struct_arg(&mut self, _a_idx: uint, _f: |&mut BytesDecoder| -> Result) -> Result { Err(SyntaxError) } // Specialized types: fn read_option(&mut self, _f: |&mut BytesDecoder, bool| -> Result) -> Result { Err(SyntaxError) } #[inline] fn read_seq(&mut self, f: |&mut BytesDecoder, uint| -> Result) -> Result { f(self, 3) } #[inline] fn read_seq_elt(&mut self, _idx: uint, f: |&mut BytesDecoder| -> Result) -> Result { f(self) } fn read_map(&mut self, _f: |&mut BytesDecoder, uint| -> Result) -> Result { Err(SyntaxError) } fn read_map_elt_key(&mut self, _idx: uint, _f: |&mut BytesDecoder| -> Result) -> Result { Err(SyntaxError) } fn read_map_elt_val(&mut self, _idx: uint, _f: |&mut BytesDecoder| -> Result) -> Result { Err(SyntaxError) } } } ////////////////////////////////////////////////////////////////////////////// mod deserializer { use std::num; use std::vec; use super::{Error, EndOfStream, SyntaxError}; use de::Deserializer; use de::{Token, Int, SeqStart, Sep, End}; #[deriving(Eq, Show)] enum State { StartState, SepOrEndState, EndState, } pub struct BytesDeserializer { state: State, len: uint, iter: vec::MoveItems, } impl BytesDeserializer { #[inline] pub fn new(values: Vec) -> BytesDeserializer { BytesDeserializer { state: StartState, len: values.len(), iter: values.move_iter(), } } } impl Iterator> for BytesDeserializer { #[inline] fn next(&mut self) -> Option> { match self.state { StartState => { self.state = SepOrEndState; Some(Ok(SeqStart(self.len))) } SepOrEndState => { match self.iter.next() { Some(value) => { Some(Ok(Int(value))) } None => { self.state = EndState; Some(Ok(End)) } } } EndState => { None } } } } impl Deserializer for BytesDeserializer { #[inline] fn end_of_stream_error(&self) -> Result { Err(EndOfStream) } #[inline] fn syntax_error(&self) -> Result { Err(SyntaxError) } } } ////////////////////////////////////////////////////////////////////////////// fn run_bench_decoder(bytes: Vec) { let mut d = decoder::BytesDecoder::new(bytes.clone()); let value: Vec = Decodable::decode(&mut d).unwrap(); assert_eq!(value, bytes); } fn run_bench_deserializer(bytes: Vec) { let mut d = deserializer::BytesDeserializer::new(bytes.clone()); let value: Vec = Deserializable::deserialize(&mut d).unwrap(); assert_eq!(value, bytes); } #[bench] fn bench_bytes_decoder_empty(b: &mut Bencher) { b.iter(|| { run_bench_decoder(vec!()) }) } #[bench] fn bench_bytes_deserializer_empty(b: &mut Bencher) { b.iter(|| { run_bench_deserializer(vec!()) }) }