#![feature(associated_types, phase)] #[phase(plugin)] extern crate serde_macros; extern crate serde; extern crate "rustc-serialize" as rustc_serialize; extern crate test; use std::fmt::Show; use test::Bencher; use rustc_serialize::{Decoder, Decodable}; use serde::de::{Deserializer, Deserialize}; ////////////////////////////////////////////////////////////////////////////// #[derive(Show)] pub enum Error { EndOfStream, SyntaxError, OtherError(String), } ////////////////////////////////////////////////////////////////////////////// mod decoder { use std::vec; use rustc_serialize; use super::Error; use super::Error::{EndOfStream, SyntaxError, OtherError}; pub struct IntDecoder { len: uint, iter: vec::IntoIter, } impl IntDecoder { #[inline] pub fn new(values: Vec) -> IntDecoder { IntDecoder { len: values.len(), iter: values.into_iter(), } } } impl rustc_serialize::Decoder for IntDecoder { fn error(&mut self, msg: &str) -> Error { OtherError(msg.to_string()) } // 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) } fn read_u8(&mut self) -> Result { Err(SyntaxError) } #[inline] fn read_int(&mut self) -> Result { match self.iter.next() { Some(value) => Ok(value), None => Err(EndOfStream), } } 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: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { Err(Error::SyntaxError) } fn read_enum_variant(&mut self, _names: &[&str], _f: F) -> Result where F: FnOnce(&mut IntDecoder, uint) -> Result, { Err(Error::SyntaxError) } fn read_enum_variant_arg(&mut self, _a_idx: uint, _f: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { Err(Error::SyntaxError) } fn read_enum_struct_variant(&mut self, _names: &[&str], _f: F) -> Result where F: FnOnce(&mut IntDecoder, uint) -> Result, { Err(Error::SyntaxError) } fn read_enum_struct_variant_field(&mut self, _f_name: &str, _f_idx: uint, _f: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { Err(Error::SyntaxError) } fn read_struct(&mut self, _s_name: &str, _len: uint, _f: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { Err(Error::SyntaxError) } fn read_struct_field(&mut self, _f_name: &str, _f_idx: uint, _f: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { Err(Error::SyntaxError) } fn read_tuple(&mut self, _len: uint, _f: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { Err(Error::SyntaxError) } fn read_tuple_arg(&mut self, _a_idx: uint, _f: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { Err(Error::SyntaxError) } fn read_tuple_struct(&mut self, _s_name: &str, _len: uint, _f: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { Err(Error::SyntaxError) } fn read_tuple_struct_arg(&mut self, _a_idx: uint, _f: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { Err(Error::SyntaxError) } // Specialized types: fn read_option(&mut self, _f: F) -> Result where F: FnOnce(&mut IntDecoder, bool) -> Result, { Err(SyntaxError) } #[inline] fn read_seq(&mut self, f: F) -> Result where F: FnOnce(&mut IntDecoder, uint) -> Result, { let len = self.len; f(self, len) } #[inline] fn read_seq_elt(&mut self, _idx: uint, f: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { f(self) } fn read_map(&mut self, _f: F) -> Result where F: FnOnce(&mut IntDecoder, uint) -> Result, { Err(SyntaxError) } fn read_map_elt_key(&mut self, _idx: uint, _f: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { Err(SyntaxError) } fn read_map_elt_val(&mut self, _idx: uint, _f: F) -> Result where F: FnOnce(&mut IntDecoder) -> Result, { Err(SyntaxError) } } pub struct U8Decoder { len: uint, iter: vec::IntoIter, } impl U8Decoder { #[inline] pub fn new(values: Vec) -> U8Decoder { U8Decoder { len: values.len(), iter: values.into_iter(), } } } impl rustc_serialize::Decoder for U8Decoder { fn error(&mut self, msg: &str) -> Error { OtherError(msg.to_string()) } // 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), } } #[inline] 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: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { Err(Error::SyntaxError) } fn read_enum_variant(&mut self, _names: &[&str], _f: F) -> Result where F: FnOnce(&mut U8Decoder, uint) -> Result, { Err(Error::SyntaxError) } fn read_enum_variant_arg(&mut self, _a_idx: uint, _f: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { Err(Error::SyntaxError) } fn read_enum_struct_variant(&mut self, _names: &[&str], _f: F) -> Result where F: FnOnce(&mut U8Decoder, uint) -> Result, { Err(Error::SyntaxError) } fn read_enum_struct_variant_field(&mut self, _f_name: &str, _f_idx: uint, _f: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { Err(Error::SyntaxError) } fn read_struct(&mut self, _s_name: &str, _len: uint, _f: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { Err(Error::SyntaxError) } fn read_struct_field(&mut self, _f_name: &str, _f_idx: uint, _f: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { Err(Error::SyntaxError) } fn read_tuple(&mut self, _len: uint, _f: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { Err(Error::SyntaxError) } fn read_tuple_arg(&mut self, _a_idx: uint, _f: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { Err(Error::SyntaxError) } fn read_tuple_struct(&mut self, _s_name: &str, _len: uint, _f: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { Err(Error::SyntaxError) } fn read_tuple_struct_arg(&mut self, _a_idx: uint, _f: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { Err(Error::SyntaxError) } // Specialized types: fn read_option(&mut self, _f: F) -> Result where F: FnOnce(&mut U8Decoder, bool) -> Result, { Err(SyntaxError) } #[inline] fn read_seq(&mut self, f: F) -> Result where F: FnOnce(&mut U8Decoder, uint) -> Result, { let len = self.len; f(self, len) } #[inline] fn read_seq_elt(&mut self, _idx: uint, f: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { f(self) } fn read_map(&mut self, _f: F) -> Result where F: FnOnce(&mut U8Decoder, uint) -> Result, { Err(SyntaxError) } fn read_map_elt_key(&mut self, _idx: uint, _f: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { Err(SyntaxError) } fn read_map_elt_val(&mut self, _idx: uint, _f: F) -> Result where F: FnOnce(&mut U8Decoder) -> Result, { Err(SyntaxError) } } } ////////////////////////////////////////////////////////////////////////////// mod deserializer { //use std::num; use std::vec; use super::Error; use super::Error::{EndOfStream, SyntaxError}; use self::State::{StartState, SepOrEndState, EndState}; use serde::de; #[derive(PartialEq, Show)] enum State { StartState, SepOrEndState, EndState, } pub struct IntDeserializer { state: State, len: uint, iter: vec::IntoIter, } impl IntDeserializer { #[inline] pub fn new(values: Vec) -> IntDeserializer { IntDeserializer { state: StartState, len: values.len(), iter: values.into_iter(), } } } impl Iterator for IntDeserializer { type Item = Result; #[inline] fn next(&mut self) -> Option> { match self.state { StartState => { self.state = SepOrEndState; Some(Ok(de::Token::SeqStart(self.len))) } SepOrEndState => { match self.iter.next() { Some(value) => { Some(Ok(de::Token::Int(value))) } None => { self.state = EndState; Some(Ok(de::Token::End)) } } } EndState => { None } } } } impl de::Deserializer for IntDeserializer { #[inline] fn end_of_stream_error(&mut self) -> Error { EndOfStream } #[inline] fn syntax_error(&mut self, _token: de::Token, _expected: &[de::TokenKind]) -> Error { SyntaxError } #[inline] fn unexpected_name_error(&mut self, _token: de::Token) -> Error { SyntaxError } #[inline] fn conversion_error(&mut self, _token: de::Token) -> Error { SyntaxError } #[inline] fn missing_field< T: de::Deserialize >(&mut self, _field: &'static str) -> Result { Err(SyntaxError) } } pub struct U8Deserializer { state: State, len: uint, iter: vec::IntoIter, } impl U8Deserializer { #[inline] pub fn new(values: Vec) -> U8Deserializer { U8Deserializer { state: StartState, len: values.len(), iter: values.into_iter(), } } } impl Iterator for U8Deserializer { type Item = Result; #[inline] fn next(&mut self) -> Option> { match self.state { StartState => { self.state = SepOrEndState; Some(Ok(de::Token::SeqStart(self.len))) } SepOrEndState => { match self.iter.next() { Some(value) => { Some(Ok(de::Token::U8(value))) } None => { self.state = EndState; Some(Ok(de::Token::End)) } } } EndState => { None } } } } impl de::Deserializer for U8Deserializer { #[inline] fn end_of_stream_error(&mut self) -> Error { EndOfStream } #[inline] fn syntax_error(&mut self, _token: de::Token, _expected: &[de::TokenKind]) -> Error { SyntaxError } #[inline] fn unexpected_name_error(&mut self, _token: de::Token) -> Error { SyntaxError } #[inline] fn conversion_error(&mut self, _token: de::Token) -> Error { SyntaxError } #[inline] fn missing_field< T: de::Deserialize >(&mut self, _field: &'static str) -> Result { Err(SyntaxError) } } } ////////////////////////////////////////////////////////////////////////////// fn run_decoder< D: Decoder, E: Show, T: Clone + PartialEq + Show + Decodable >(mut d: D, value: T) { let v: T = Decodable::decode(&mut d).unwrap(); assert_eq!(value, v); } fn run_deserializer< D: Deserializer, E: Show, T: Clone + PartialEq + Show + Deserialize >(mut d: D, value: T) { let v: T = Deserialize::deserialize(&mut d).unwrap(); assert_eq!(value, v); } #[bench] fn bench_decoder_int_000(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(); run_decoder(decoder::IntDecoder::new(v.clone()), v) }) } #[bench] fn bench_decoder_int_003(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(1, 2, 3); run_decoder(decoder::IntDecoder::new(v.clone()), v) }) } #[bench] fn bench_decoder_int_100(b: &mut Bencher) { b.iter(|| { let v: Vec = range(0i, 100).collect(); run_decoder(decoder::IntDecoder::new(v.clone()), v) }) } #[bench] fn bench_decoder_u8_000(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(); run_decoder(decoder::U8Decoder::new(v.clone()), v) }) } #[bench] fn bench_decoder_u8_003(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(1, 2, 3); run_decoder(decoder::U8Decoder::new(v.clone()), v) }) } #[bench] fn bench_decoder_u8_100(b: &mut Bencher) { b.iter(|| { let v: Vec = range(0u8, 100).collect(); run_decoder(decoder::U8Decoder::new(v.clone()), v) }) } #[bench] fn bench_deserializer_int_000(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(); run_deserializer(deserializer::IntDeserializer::new(v.clone()), v) }) } #[bench] fn bench_deserializer_int_003(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(1, 2, 3); run_deserializer(deserializer::IntDeserializer::new(v.clone()), v) }) } #[bench] fn bench_deserializer_int_100(b: &mut Bencher) { b.iter(|| { let v: Vec = range(0i, 100).collect(); run_deserializer(deserializer::IntDeserializer::new(v.clone()), v) }) } #[bench] fn bench_deserializer_u8_000(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(); run_deserializer(deserializer::U8Deserializer::new(v.clone()), v) }) } #[bench] fn bench_deserializer_u8_003(b: &mut Bencher) { b.iter(|| { let v: Vec = vec!(1, 2, 3); run_deserializer(deserializer::U8Deserializer::new(v.clone()), v) }) } #[bench] fn bench_deserializer_u8_100(b: &mut Bencher) { b.iter(|| { let v: Vec = range(0u8, 100).collect(); run_deserializer(deserializer::U8Deserializer::new(v.clone()), v) }) }