diff --git a/serde2/benches/bench_enum.rs b/serde2/benches/bench_enum.rs new file mode 100644 index 00000000..3a296f34 --- /dev/null +++ b/serde2/benches/bench_enum.rs @@ -0,0 +1,417 @@ +#![feature(custom_derive, plugin, test)] +#![plugin(serde2_macros)] + +extern crate serde2; +extern crate "rustc-serialize" as rustc_serialize; +extern crate test; + +use test::Bencher; + +use rustc_serialize::{Decoder, Decodable}; + +use serde2::de::{Deserializer, Deserialize}; + +use Animal::{Dog, Frog}; + +////////////////////////////////////////////////////////////////////////////// + +#[derive(Clone, PartialEq, Debug, RustcDecodable)] +#[derive_deserialize] +enum Animal { + Dog, + Frog(String, isize) +} + +////////////////////////////////////////////////////////////////////////////// + +#[derive(Debug)] +pub enum Error { + EndOfStreamError, + SyntaxError, +} + +impl serde2::de::Error for Error { + fn syntax_error() -> Error { Error::SyntaxError } + + fn end_of_stream_error() -> Error { Error::EndOfStreamError } + + fn missing_field_error(_: &'static str) -> Error { Error::SyntaxError } +} + +////////////////////////////////////////////////////////////////////////////// + +mod decoder { + use rustc_serialize::Decoder; + + use super::{Animal, Error}; + use super::Animal::{Dog, Frog}; + use self::State::{AnimalState, IsizeState, StringState}; + + enum State { + AnimalState(Animal), + IsizeState(isize), + StringState(String), + } + + pub struct AnimalDecoder { + stack: Vec, + + } + + impl AnimalDecoder { + #[inline] + pub fn new(animal: Animal) -> AnimalDecoder { + AnimalDecoder { + stack: vec!(AnimalState(animal)), + } + } + } + + impl Decoder for AnimalDecoder { + type Error = Error; + + fn error(&mut self, _: &str) -> Error { Error::SyntaxError } + + // Primitive types: + fn read_nil(&mut self) -> Result<(), Error> { Err(Error::SyntaxError) } + fn read_usize(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u16(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u8(&mut self) -> Result { Err(Error::SyntaxError) } + #[inline] + fn read_isize(&mut self) -> Result { + match self.stack.pop() { + Some(IsizeState(x)) => Ok(x), + _ => Err(Error::SyntaxError), + } + } + fn read_i64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i16(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i8(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_bool(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_f64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_f32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_char(&mut self) -> Result { Err(Error::SyntaxError) } + #[inline] + fn read_str(&mut self) -> Result { + match self.stack.pop() { + Some(StringState(x)) => Ok(x), + _ => Err(Error::SyntaxError), + } + } + + // Compound types: + #[inline] + fn read_enum(&mut self, name: &str, f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + match self.stack.pop() { + Some(AnimalState(animal)) => { + self.stack.push(AnimalState(animal)); + if name == "Animal" { + f(self) + } else { + Err(Error::SyntaxError) + } + } + _ => Err(Error::SyntaxError) + } + } + + #[inline] + fn read_enum_variant(&mut self, names: &[&str], f: F) -> Result where + F: FnOnce(&mut AnimalDecoder, usize) -> Result, + { + let name = match self.stack.pop() { + Some(AnimalState(Dog)) => "Dog", + Some(AnimalState(Frog(x0, x1))) => { + self.stack.push(IsizeState(x1)); + self.stack.push(StringState(x0)); + "Frog" + } + _ => { return Err(Error::SyntaxError); } + }; + + let idx = match names.iter().position(|n| *n == name) { + Some(idx) => idx, + None => { return Err(Error::SyntaxError); } + }; + + f(self, idx) + } + + #[inline] + fn read_enum_variant_arg(&mut self, _a_idx: usize, f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + f(self) + } + + fn read_enum_struct_variant(&mut self, _names: &[&str], _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_struct_variant_field(&mut self, _f_name: &str, _f_idx: usize, _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_struct(&mut self, _s_name: &str, _len: usize, _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_struct_field(&mut self, _f_name: &str, _f_idx: usize, _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple(&mut self, _len: usize, _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_struct(&mut self, _s_name: &str, _len: usize, _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_struct_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + // Specialized types: + fn read_option(&mut self, _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder, bool) -> Result, + { + Err(Error::SyntaxError) + } + + #[inline] + fn read_seq(&mut self, f: F) -> Result where + F: FnOnce(&mut AnimalDecoder, usize) -> Result, + { + f(self, 3) + } + + #[inline] + fn read_seq_elt(&mut self, _idx: usize, f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + f(self) + } + + fn read_map(&mut self, _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_map_elt_key(&mut self, _idx: usize, _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_map_elt_val(&mut self, _idx: usize, _f: F) -> Result where + F: FnOnce(&mut AnimalDecoder) -> Result, + { + Err(Error::SyntaxError) + } + } +} + +////////////////////////////////////////////////////////////////////////////// + +mod deserializer { + use super::{Animal, Error}; + + use serde2::de; + + enum State { + AnimalState(Animal), + IsizeState(isize), + StringState(String), + UnitState, + } + + pub struct AnimalDeserializer { + stack: Vec, + } + + impl AnimalDeserializer { + #[inline] + pub fn new(animal: Animal) -> AnimalDeserializer { + AnimalDeserializer { + stack: vec!(State::AnimalState(animal)), + } + } + } + + impl de::Deserializer for AnimalDeserializer { + type Error = Error; + + #[inline] + fn visit(&mut self, mut visitor: V) -> Result + where V: de::Visitor, + { + match self.stack.pop() { + Some(State::AnimalState(Animal::Dog)) => { + self.stack.push(State::UnitState); + visitor.visit_enum("Animal", "Dog", DogVisitor { + de: self, + }) + } + Some(State::AnimalState(Animal::Frog(x0, x1))) => { + self.stack.push(State::IsizeState(x1)); + self.stack.push(State::StringState(x0)); + visitor.visit_enum("Animal", "Frog", FrogVisitor { + de: self, + state: 0, + }) + } + Some(State::IsizeState(value)) => { + visitor.visit_isize(value) + } + Some(State::StringState(value)) => { + visitor.visit_string(value) + } + Some(State::UnitState) => { + visitor.visit_unit() + } + None => { + Err(Error::EndOfStreamError) + } + } + } + } + + struct DogVisitor<'a> { + de: &'a mut AnimalDeserializer, + } + + impl<'a> de::EnumVisitor for DogVisitor<'a> { + type Error = Error; + + fn visit_unit(&mut self) -> Result<(), Error> { + de::Deserialize::deserialize(self.de) + } + } + + struct FrogVisitor<'a> { + de: &'a mut AnimalDeserializer, + state: usize, + } + + impl<'a> de::EnumVisitor for FrogVisitor<'a> { + type Error = Error; + + fn visit_seq(&mut self, mut visitor: V) -> Result + where V: de::EnumSeqVisitor, + { + visitor.visit(self) + } + } + + impl<'a> de::SeqVisitor for FrogVisitor<'a> { + type Error = Error; + + fn visit(&mut self) -> Result, Error> + where T: de::Deserialize, + { + match self.state { + 0 => { + self.state += 1; + Ok(Some(try!(de::Deserialize::deserialize(self.de)))) + } + 1 => { + self.state += 1; + Ok(Some(try!(de::Deserialize::deserialize(self.de)))) + } + _ => { + Ok(None) + } + } + } + + fn end(&mut self) -> Result<(), Error> { + if self.state == 2 { + Ok(()) + } else { + Err(Error::SyntaxError) + } + } + + fn size_hint(&self) -> (usize, Option) { + let len = 2 - self.state; + (len, Some(len)) + } + } +} + +////////////////////////////////////////////////////////////////////////////// + +#[bench] +fn bench_decoder_dog(b: &mut Bencher) { + b.iter(|| { + let animal = Dog; + + let mut d = decoder::AnimalDecoder::new(animal.clone()); + let value: Animal = Decodable::decode(&mut d).unwrap(); + + assert_eq!(value, animal); + }) +} + +#[bench] +fn bench_decoder_frog(b: &mut Bencher) { + b.iter(|| { + let animal = Frog("Henry".to_string(), 349); + + let mut d = decoder::AnimalDecoder::new(animal.clone()); + let value: Animal = Decodable::decode(&mut d).unwrap(); + + assert_eq!(value, animal); + }) +} + +#[bench] +fn bench_deserializer_dog(b: &mut Bencher) { + b.iter(|| { + let animal = Dog; + + let mut d = deserializer::AnimalDeserializer::new(animal.clone()); + let value: Animal = Deserialize::deserialize(&mut d).unwrap(); + + assert_eq!(value, animal); + }) +} + +#[bench] +fn bench_deserializer_frog(b: &mut Bencher) { + b.iter(|| { + let animal = Frog("Henry".to_string(), 349); + + let mut d = deserializer::AnimalDeserializer::new(animal.clone()); + let value: Animal = Deserialize::deserialize(&mut d).unwrap(); + + assert_eq!(value, animal); + }) +} diff --git a/serde2/benches/bench_log.rs b/serde2/benches/bench_log.rs index 7f387764..7151db97 100644 --- a/serde2/benches/bench_log.rs +++ b/serde2/benches/bench_log.rs @@ -1,4 +1,4 @@ -#![feature(collections, core, io, plugin, test)] +#![feature(custom_derive, collections, core, io, plugin, test)] #![allow(non_camel_case_types)] #![plugin(serde2_macros)] diff --git a/serde2/benches/bench_map.rs b/serde2/benches/bench_map.rs new file mode 100644 index 00000000..57bf6b8d --- /dev/null +++ b/serde2/benches/bench_map.rs @@ -0,0 +1,462 @@ +#![feature(custom_derive, core, plugin, test)] +#![plugin(serde2_macros)] + +extern crate serde2; +extern crate "rustc-serialize" as rustc_serialize; +extern crate test; + +use std::fmt::Debug; +use std::collections::HashMap; +use test::Bencher; + +use rustc_serialize::{Decoder, Decodable}; + +use serde2::de::{Deserializer, Deserialize}; + +////////////////////////////////////////////////////////////////////////////// + +#[derive(PartialEq, Debug)] +pub enum Error { + EndOfStream, + SyntaxError, + MissingField, +} + +impl serde2::de::Error for Error { + fn syntax_error() -> Error { Error::SyntaxError } + + fn end_of_stream_error() -> Error { Error::EndOfStream } + + fn missing_field_error(_: &'static str) -> Error { + Error::MissingField + } +} + +////////////////////////////////////////////////////////////////////////////// + +mod decoder { + use std::collections::HashMap; + use std::collections::hash_map::IntoIter; + use rustc_serialize; + + use super::Error; + use self::Value::{StringValue, IsizeValue}; + + enum Value { + StringValue(String), + IsizeValue(isize), + } + + pub struct IsizeDecoder { + len: usize, + iter: IntoIter, + stack: Vec, + } + + impl IsizeDecoder { + #[inline] + pub fn new(values: HashMap) -> IsizeDecoder { + IsizeDecoder { + len: values.len(), + iter: values.into_iter(), + stack: vec!(), + } + } + } + + impl rustc_serialize::Decoder for IsizeDecoder { + type Error = Error; + + fn error(&mut self, _msg: &str) -> Error { + Error::SyntaxError + } + + // Primitive types: + fn read_nil(&mut self) -> Result<(), Error> { Err(Error::SyntaxError) } + fn read_usize(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u16(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u8(&mut self) -> Result { Err(Error::SyntaxError) } + #[inline] + fn read_isize(&mut self) -> Result { + match self.stack.pop() { + Some(IsizeValue(x)) => Ok(x), + Some(_) => Err(Error::SyntaxError), + None => Err(Error::EndOfStream), + } + } + fn read_i64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i16(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i8(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_bool(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_f64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_f32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_char(&mut self) -> Result { Err(Error::SyntaxError) } + #[inline] + fn read_str(&mut self) -> Result { + match self.stack.pop() { + Some(StringValue(x)) => Ok(x), + Some(_) => Err(Error::SyntaxError), + None => Err(Error::EndOfStream), + } + } + + // Compound types: + fn read_enum(&mut self, _name: &str, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_variant(&mut self, _names: &[&str], _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_variant_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_struct_variant(&mut self, _names: &[&str], _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_struct_variant_field(&mut self, _f_name: &str, _f_idx: usize, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_struct(&mut self, _s_name: &str, _len: usize, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_struct_field(&mut self, _f_name: &str, _f_idx: usize, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple(&mut self, _len: usize, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_struct(&mut self, _s_name: &str, _len: usize, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_struct_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + // Specialized types: + fn read_option(&mut self, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder, bool) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_seq(&mut self, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_seq_elt(&mut self, _idx: usize, _f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + #[inline] + fn read_map(&mut self, f: F) -> Result where + F: FnOnce(&mut IsizeDecoder, usize) -> Result, + { + let len = self.len; + f(self, len) + } + #[inline] + fn read_map_elt_key(&mut self, _idx: usize, f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + match self.iter.next() { + Some((key, value)) => { + self.stack.push(IsizeValue(value)); + self.stack.push(StringValue(key)); + f(self) + } + None => { + Err(Error::SyntaxError) + } + } + } + + #[inline] + fn read_map_elt_val(&mut self, _idx: usize, f: F) -> Result where + F: FnOnce(&mut IsizeDecoder) -> Result, + { + f(self) + } + } +} + +////////////////////////////////////////////////////////////////////////////// + +mod deserializer { + use std::collections::HashMap; + use std::collections::hash_map; + + use super::Error; + + use serde2::de; + + #[derive(PartialEq, Debug)] + enum State { + StartState, + KeyState(String), + ValueState(isize), + } + + pub struct IsizeDeserializer { + stack: Vec, + iter: hash_map::IntoIter, + } + + impl IsizeDeserializer { + #[inline] + pub fn new(values: HashMap) -> IsizeDeserializer { + IsizeDeserializer { + stack: vec!(State::StartState), + iter: values.into_iter(), + } + } + } + + impl de::Deserializer for IsizeDeserializer { + type Error = Error; + + fn visit(&mut self, mut visitor: V) -> Result + where V: de::Visitor, + { + match self.stack.pop() { + Some(State::StartState) => { + visitor.visit_map(self) + } + Some(State::KeyState(key)) => { + visitor.visit_string(key) + } + Some(State::ValueState(value)) => { + visitor.visit_isize(value) + } + None => { + Err(Error::EndOfStream) + } + } + } + } + + impl de::MapVisitor for IsizeDeserializer { + type Error = Error; + + fn visit_key(&mut self) -> Result, Error> + where K: de::Deserialize, + { + match self.iter.next() { + Some((key, value)) => { + self.stack.push(State::ValueState(value)); + self.stack.push(State::KeyState(key)); + Ok(Some(try!(de::Deserialize::deserialize(self)))) + } + None => { + Ok(None) + } + } + } + + fn visit_value(&mut self) -> Result + where V: de::Deserialize, + { + de::Deserialize::deserialize(self) + } + + fn end(&mut self) -> Result<(), Error> { + match self.iter.next() { + Some(_) => Err(Error::SyntaxError), + None => Ok(()), + } + } + + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } + } + +/* + impl Iterator for IsizeDeserializer { + type Item = Result; + + #[inline] + fn next(&mut self) -> Option> { + match self.stack.pop() { + Some(StartState) => { + self.stack.push(KeyOrEndState); + Some(Ok(de::Token::MapStart(self.len))) + } + Some(KeyOrEndState) => { + match self.iter.next() { + Some((key, value)) => { + self.stack.push(ValueState(value)); + Some(Ok(de::Token::String(key))) + } + None => { + self.stack.push(EndState); + Some(Ok(de::Token::End)) + } + } + } + Some(ValueState(x)) => { + self.stack.push(KeyOrEndState); + Some(Ok(de::Token::Isize(x))) + } + Some(EndState) => { + None + } + None => { + None + } + } + } + } + + impl de::Deserializer for IsizeDeserializer { + #[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(Error::SyntaxError) + } + } +*/ +} + +////////////////////////////////////////////////////////////////////////////// + +fn run_decoder< + D: Decoder, + T: Clone + PartialEq + Debug + Decodable +>(mut d: D, value: T) { + let v = Decodable::decode(&mut d); + + assert_eq!(Ok(value), v); +} + +#[bench] +fn bench_decoder_000(b: &mut Bencher) { + b.iter(|| { + let m: HashMap = HashMap::new(); + run_decoder(decoder::IsizeDecoder::new(m.clone()), m) + }) +} + +#[bench] +fn bench_decoder_003(b: &mut Bencher) { + b.iter(|| { + let mut m: HashMap = HashMap::new(); + for i in range(0, 3) { + m.insert(i.to_string(), i); + } + run_decoder(decoder::IsizeDecoder::new(m.clone()), m) + }) +} + +#[bench] +fn bench_decoder_100(b: &mut Bencher) { + b.iter(|| { + let mut m: HashMap = HashMap::new(); + for i in range(0, 100) { + m.insert(i.to_string(), i); + } + run_decoder(decoder::IsizeDecoder::new(m.clone()), m) + }) +} + +fn run_deserializer< + D: Deserializer, + E: Debug, + T: Clone + PartialEq + Debug + Deserialize +>(mut d: D, value: T) { + let v: T = Deserialize::deserialize(&mut d).unwrap(); + + assert_eq!(value, v); +} + +#[bench] +fn bench_deserializer_000(b: &mut Bencher) { + b.iter(|| { + let m: HashMap = HashMap::new(); + run_deserializer(deserializer::IsizeDeserializer::new(m.clone()), m) + }) +} + +#[bench] +fn bench_deserializer_003(b: &mut Bencher) { + b.iter(|| { + let mut m: HashMap = HashMap::new(); + for i in range(0, 3) { + m.insert(i.to_string(), i); + } + run_deserializer(deserializer::IsizeDeserializer::new(m.clone()), m) + }) +} + +#[bench] +fn bench_deserializer_100(b: &mut Bencher) { + b.iter(|| { + let mut m: HashMap = HashMap::new(); + for i in range(0, 100) { + m.insert(i.to_string(), i); + } + run_deserializer(deserializer::IsizeDeserializer::new(m.clone()), m) + }) +} diff --git a/serde2/benches/bench_struct.rs b/serde2/benches/bench_struct.rs new file mode 100644 index 00000000..c3e5a6ab --- /dev/null +++ b/serde2/benches/bench_struct.rs @@ -0,0 +1,726 @@ +#![feature(custom_derive, plugin, test)] +#![plugin(serde2_macros)] + +extern crate serde2; +extern crate "rustc-serialize" as rustc_serialize; +extern crate test; + +use std::collections::HashMap; +use test::Bencher; + +use rustc_serialize::{Decoder, Decodable}; + +use serde2::de::{Deserializer, Deserialize}; + +////////////////////////////////////////////////////////////////////////////// + +#[derive(Clone, PartialEq, Debug, RustcDecodable)] +#[derive_deserialize] +struct Inner { + a: (), + b: usize, + c: HashMap>, +} + +////////////////////////////////////////////////////////////////////////////// + +#[derive(Clone, PartialEq, Debug, RustcDecodable)] +#[derive_deserialize] +struct Outer { + inner: Vec, +} + +////////////////////////////////////////////////////////////////////////////// + +#[derive(Debug)] +pub enum Error { + EndOfStream, + SyntaxError, + UnexpectedName, + ConversionError, + MissingField, + OtherError, +} + +impl serde2::de::Error for Error { + fn syntax_error() -> Error { Error::SyntaxError } + + fn end_of_stream_error() -> Error { Error::EndOfStream } + + fn missing_field_error(_: &'static str) -> Error { + Error::MissingField + } +} + +mod decoder { + use std::collections::HashMap; + use rustc_serialize::Decoder; + + use super::{Outer, Inner, Error}; + + use self::State::{ + OuterState, + InnerState, + NullState, + UsizeState, + CharState, + StringState, + FieldState, + VecState, + MapState, + OptionState, + }; + + #[derive(Debug)] + enum State { + OuterState(Outer), + InnerState(Inner), + NullState, + UsizeState(usize), + CharState(char), + StringState(String), + FieldState(&'static str), + VecState(Vec), + MapState(HashMap>), + OptionState(bool), + } + + pub struct OuterDecoder { + stack: Vec, + + } + + impl OuterDecoder { + #[inline] + pub fn new(animal: Outer) -> OuterDecoder { + OuterDecoder { + stack: vec!(OuterState(animal)), + } + } + } + + impl Decoder for OuterDecoder { + type Error = Error; + + fn error(&mut self, _msg: &str) -> Error { + Error::OtherError + } + + // Primitive types: + #[inline] + fn read_nil(&mut self) -> Result<(), Error> { + match self.stack.pop() { + Some(NullState) => Ok(()), + _ => Err(Error::SyntaxError), + } + } + #[inline] + fn read_usize(&mut self) -> Result { + match self.stack.pop() { + Some(UsizeState(value)) => Ok(value), + _ => Err(Error::SyntaxError), + } + } + fn read_u64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u16(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u8(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_isize(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i16(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i8(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_bool(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_f64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_f32(&mut self) -> Result { Err(Error::SyntaxError) } + #[inline] + fn read_char(&mut self) -> Result { + match self.stack.pop() { + Some(CharState(c)) => Ok(c), + _ => Err(Error::SyntaxError), + } + } + #[inline] + fn read_str(&mut self) -> Result { + match self.stack.pop() { + Some(StringState(value)) => Ok(value), + _ => Err(Error::SyntaxError), + } + } + + // Compound types: + fn read_enum(&mut self, _name: &str, _f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_variant(&mut self, _names: &[&str], _f: F) -> Result where + F: FnOnce(&mut OuterDecoder, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_variant_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_struct_variant(&mut self, _names: &[&str], _f: F) -> Result where + F: FnOnce(&mut OuterDecoder, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_struct_variant_field(&mut self, _f_name: &str, _f_idx: usize, _f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + #[inline] + fn read_struct(&mut self, s_name: &str, _len: usize, f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + match self.stack.pop() { + Some(OuterState(Outer { inner })) => { + if s_name == "Outer" { + self.stack.push(VecState(inner)); + self.stack.push(FieldState("inner")); + f(self) + } else { + Err(Error::SyntaxError) + } + } + Some(InnerState(Inner { a: (), b, c })) => { + if s_name == "Inner" { + self.stack.push(MapState(c)); + self.stack.push(FieldState("c")); + + self.stack.push(UsizeState(b)); + self.stack.push(FieldState("b")); + + self.stack.push(NullState); + self.stack.push(FieldState("a")); + f(self) + } else { + Err(Error::SyntaxError) + } + } + _ => Err(Error::SyntaxError), + } + } + #[inline] + fn read_struct_field(&mut self, f_name: &str, _f_idx: usize, f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + match self.stack.pop() { + Some(FieldState(name)) => { + if f_name == name { + f(self) + } else { + Err(Error::SyntaxError) + } + } + _ => Err(Error::SyntaxError) + } + } + + fn read_tuple(&mut self, _len: usize, _f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_struct(&mut self, _s_name: &str, _len: usize, _f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_struct_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + // Specialized types: + #[inline] + fn read_option(&mut self, f: F) -> Result where + F: FnOnce(&mut OuterDecoder, bool) -> Result, + { + match self.stack.pop() { + Some(OptionState(b)) => f(self, b), + _ => Err(Error::SyntaxError), + } + } + + #[inline] + fn read_seq(&mut self, f: F) -> Result where + F: FnOnce(&mut OuterDecoder, usize) -> Result, + { + match self.stack.pop() { + Some(VecState(value)) => { + let len = value.len(); + for inner in value.into_iter().rev() { + self.stack.push(InnerState(inner)); + } + f(self, len) + } + _ => Err(Error::SyntaxError) + } + } + #[inline] + fn read_seq_elt(&mut self, _idx: usize, f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + f(self) + } + + #[inline] + fn read_map(&mut self, f: F) -> Result where + F: FnOnce(&mut OuterDecoder, usize) -> Result, + { + match self.stack.pop() { + Some(MapState(map)) => { + let len = map.len(); + for (key, value) in map { + match value { + Some(c) => { + self.stack.push(CharState(c)); + self.stack.push(OptionState(true)); + } + None => { + self.stack.push(OptionState(false)); + } + } + self.stack.push(StringState(key)); + } + f(self, len) + } + _ => Err(Error::SyntaxError), + } + } + #[inline] + fn read_map_elt_key(&mut self, _idx: usize, f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + f(self) + } + + #[inline] + fn read_map_elt_val(&mut self, _idx: usize, f: F) -> Result where + F: FnOnce(&mut OuterDecoder) -> Result, + { + f(self) + } + } +} + +////////////////////////////////////////////////////////////////////////////// + +mod deserializer { + use std::collections::HashMap; + use std::collections::hash_map; + use std::vec; + use super::{Outer, Inner}; + use super::Error; + use serde2::de; + + #[derive(Debug)] + enum State { + OuterState(Outer), + InnerState(Inner), + StrState(&'static str), + NullState, + UsizeState(usize), + CharState(char), + StringState(String), + OptionState(bool), + VecState(Vec), + MapState(HashMap>), + } + + pub struct OuterDeserializer { + stack: Vec, + } + + impl OuterDeserializer { + #[inline] + pub fn new(outer: Outer) -> OuterDeserializer { + OuterDeserializer { + stack: vec!(State::OuterState(outer)), + } + } + } + + impl de::Deserializer for OuterDeserializer { + type Error = Error; + + fn visit(&mut self, mut visitor: V) -> Result + where V: de::Visitor, + { + match self.stack.pop() { + Some(State::OuterState(Outer { inner })) => { + self.stack.push(State::VecState(inner)); + self.stack.push(State::StrState("inner")); + + visitor.visit_named_map("Outer", OuterMapVisitor { + de: self, + state: 0, + }) + } + Some(State::InnerState(Inner { a: (), b, c })) => { + self.stack.push(State::MapState(c)); + self.stack.push(State::StrState("c")); + + self.stack.push(State::UsizeState(b)); + self.stack.push(State::StrState("b")); + + self.stack.push(State::NullState); + self.stack.push(State::StrState("a")); + + visitor.visit_named_map("Inner", InnerMapVisitor { + de: self, + state: 0, + }) + } + Some(State::VecState(value)) => { + visitor.visit_seq(OuterSeqVisitor { + de: self, + iter: value.into_iter(), + }) + } + Some(State::MapState(value)) => { + visitor.visit_map(MapVisitor { + de: self, + iter: value.into_iter(), + }) + } + Some(State::NullState) => { + visitor.visit_unit() + } + Some(State::UsizeState(x)) => { + visitor.visit_usize(x) + } + Some(State::CharState(x)) => { + visitor.visit_char(x) + } + Some(State::StrState(x)) => { + visitor.visit_str(x) + } + Some(State::StringState(x)) => { + visitor.visit_string(x) + } + Some(State::OptionState(false)) => { + visitor.visit_none() + } + Some(State::OptionState(true)) => { + visitor.visit_some(self) + } + None => Err(Error::EndOfStream), + } + } + } + + struct OuterMapVisitor<'a> { + de: &'a mut OuterDeserializer, + state: usize, + } + + impl<'a> de::MapVisitor for OuterMapVisitor<'a> { + type Error = Error; + + fn visit_key(&mut self) -> Result, Error> + where K: de::Deserialize, + { + match self.state { + 0 => { + self.state += 1; + Ok(Some(try!(de::Deserialize::deserialize(self.de)))) + } + _ => { + Ok(None) + } + } + } + + fn visit_value(&mut self) -> Result + where V: de::Deserialize, + { + de::Deserialize::deserialize(self.de) + } + + fn end(&mut self) -> Result<(), Error> { + if self.state == 1 { + Ok(()) + } else { + Err(Error::SyntaxError) + } + } + + fn size_hint(&self) -> (usize, Option) { + let len = 1 - self.state; + (len, Some(len)) + } + } + + struct OuterSeqVisitor<'a> { + de: &'a mut OuterDeserializer, + iter: vec::IntoIter, + } + + impl<'a> de::SeqVisitor for OuterSeqVisitor<'a> { + type Error = Error; + + fn visit(&mut self) -> Result, Error> + where T: de::Deserialize, + { + match self.iter.next() { + Some(value) => { + self.de.stack.push(State::InnerState(value)); + Ok(Some(try!(de::Deserialize::deserialize(self.de)))) + } + None => { + Ok(None) + } + } + } + + fn end(&mut self) -> Result<(), Error> { + match self.iter.next() { + Some(_) => Err(Error::SyntaxError), + None => Ok(()), + } + } + + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } + } + + struct InnerMapVisitor<'a> { + de: &'a mut OuterDeserializer, + state: usize, + } + + impl<'a> de::MapVisitor for InnerMapVisitor<'a> { + type Error = Error; + + fn visit_key(&mut self) -> Result, Error> + where K: de::Deserialize, + { + match self.state { + 0 ... 2 => { + self.state += 1; + Ok(Some(try!(de::Deserialize::deserialize(self.de)))) + } + _ => { + Ok(None) + } + } + } + + fn visit_value(&mut self) -> Result + where V: de::Deserialize, + { + de::Deserialize::deserialize(self.de) + } + + fn end(&mut self) -> Result<(), Error> { + if self.state == 1 { + Ok(()) + } else { + Err(Error::SyntaxError) + } + } + + fn size_hint(&self) -> (usize, Option) { + let len = 1 - self.state; + (len, Some(len)) + } + } + + struct MapVisitor<'a> { + de: &'a mut OuterDeserializer, + iter: hash_map::IntoIter>, + } + + impl<'a> de::MapVisitor for MapVisitor<'a> { + type Error = Error; + + fn visit_key(&mut self) -> Result, Error> + where K: de::Deserialize, + { + match self.iter.next() { + Some((key, Some(value))) => { + self.de.stack.push(State::CharState(value)); + self.de.stack.push(State::OptionState(true)); + self.de.stack.push(State::StringState(key)); + Ok(Some(try!(de::Deserialize::deserialize(self.de)))) + } + Some((key, None)) => { + self.de.stack.push(State::OptionState(false)); + self.de.stack.push(State::StringState(key)); + Ok(Some(try!(de::Deserialize::deserialize(self.de)))) + } + None => { + Ok(None) + } + } + } + + fn visit_value(&mut self) -> Result + where V: de::Deserialize, + { + de::Deserialize::deserialize(self.de) + } + + fn end(&mut self) -> Result<(), Error> { + match self.iter.next() { + Some(_) => Err(Error::SyntaxError), + None => Ok(()), + } + } + + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } + } +} + +#[bench] +fn bench_decoder_0_0(b: &mut Bencher) { + b.iter(|| { + let mut map = HashMap::new(); + map.insert("abc".to_string(), Some('c')); + + let outer = Outer { + inner: vec!(), + }; + + let mut d = decoder::OuterDecoder::new(outer.clone()); + let value: Outer = Decodable::decode(&mut d).unwrap(); + + assert_eq!(value, outer); + }) +} + +#[bench] +fn bench_decoder_1_0(b: &mut Bencher) { + b.iter(|| { + let map = HashMap::new(); + + let outer = Outer { + inner: vec!( + Inner { + a: (), + b: 5, + c: map, + }, + ) + }; + + let mut d = decoder::OuterDecoder::new(outer.clone()); + let value: Outer = Decodable::decode(&mut d).unwrap(); + + assert_eq!(value, outer); + }) +} + +#[bench] +fn bench_decoder_1_5(b: &mut Bencher) { + b.iter(|| { + let mut map = HashMap::new(); + map.insert("1".to_string(), Some('a')); + map.insert("2".to_string(), None); + map.insert("3".to_string(), Some('b')); + map.insert("4".to_string(), None); + map.insert("5".to_string(), Some('c')); + + let outer = Outer { + inner: vec!( + Inner { + a: (), + b: 5, + c: map, + }, + ) + }; + + let mut d = decoder::OuterDecoder::new(outer.clone()); + let value: Outer = Decodable::decode(&mut d).unwrap(); + + assert_eq!(value, outer); + }) +} + +#[bench] +fn bench_deserializer_0_0(b: &mut Bencher) { + b.iter(|| { + let outer = Outer { + inner: vec!(), + }; + + let mut d = deserializer::OuterDeserializer::new(outer.clone()); + let value: Outer = Deserialize::deserialize(&mut d).unwrap(); + + assert_eq!(value, outer); + }) +} + +#[bench] +fn bench_deserializer_1_0(b: &mut Bencher) { + b.iter(|| { + let map = HashMap::new(); + + let outer = Outer { + inner: vec!( + Inner { + a: (), + b: 5, + c: map, + }, + ) + }; + + let mut d = deserializer::OuterDeserializer::new(outer.clone()); + let value: Outer = Deserialize::deserialize(&mut d).unwrap(); + + assert_eq!(value, outer); + }) +} + +#[bench] +fn bench_deserializer_1_5(b: &mut Bencher) { + b.iter(|| { + let mut map = HashMap::new(); + map.insert("1".to_string(), Some('a')); + map.insert("2".to_string(), None); + map.insert("3".to_string(), Some('b')); + map.insert("4".to_string(), None); + map.insert("5".to_string(), Some('c')); + + let outer = Outer { + inner: vec!( + Inner { + a: (), + b: 5, + c: map, + }, + ) + }; + + let mut d = deserializer::OuterDeserializer::new(outer.clone()); + let value: Outer = Deserialize::deserialize(&mut d).unwrap(); + + assert_eq!(value, outer); + }) +} diff --git a/serde2/benches/bench_vec.rs b/serde2/benches/bench_vec.rs new file mode 100644 index 00000000..23eb9dc9 --- /dev/null +++ b/serde2/benches/bench_vec.rs @@ -0,0 +1,615 @@ +#![feature(core, plugin, test)] +#![plugin(serde2_macros)] + +extern crate serde2; +extern crate "rustc-serialize" as rustc_serialize; +extern crate test; + +use std::fmt::Debug; +use test::Bencher; + +use rustc_serialize::{Decoder, Decodable}; + +use serde2::de::{Deserializer, Deserialize}; + +////////////////////////////////////////////////////////////////////////////// + +#[derive(PartialEq, Debug)] +pub enum Error { + EndOfStreamError, + SyntaxError, +} + +impl serde2::de::Error for Error { + fn syntax_error() -> Error { Error::SyntaxError } + + fn end_of_stream_error() -> Error { Error::EndOfStreamError } + + fn missing_field_error(_: &'static str) -> Error { Error::SyntaxError } +} + +////////////////////////////////////////////////////////////////////////////// + +mod decoder { + use std::vec; + use rustc_serialize; + + use super::Error; + + pub struct UsizeDecoder { + len: usize, + iter: vec::IntoIter, + } + + impl UsizeDecoder { + #[inline] + pub fn new(values: Vec) -> UsizeDecoder { + UsizeDecoder { + len: values.len(), + iter: values.into_iter(), + } + } + } + + impl rustc_serialize::Decoder for UsizeDecoder { + type Error = Error; + + fn error(&mut self, _: &str) -> Error { Error::SyntaxError } + + // Primitive types: + fn read_nil(&mut self) -> Result<(), Error> { Err(Error::SyntaxError) } + #[inline] + fn read_usize(&mut self) -> Result { + match self.iter.next() { + Some(value) => Ok(value), + None => Err(Error::EndOfStreamError), + } + } + fn read_u64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u16(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u8(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_isize(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i16(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i8(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_bool(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_f64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_f32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_char(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_str(&mut self) -> Result { Err(Error::SyntaxError) } + + // Compound types: + fn read_enum(&mut self, _name: &str, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_variant(&mut self, _names: &[&str], _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_variant_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_struct_variant(&mut self, _names: &[&str], _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_struct_variant_field(&mut self, _f_name: &str, _f_idx: usize, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_struct(&mut self, _s_name: &str, _len: usize, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_struct_field(&mut self, _f_name: &str, _f_idx: usize, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple(&mut self, _len: usize, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_struct(&mut self, _s_name: &str, _len: usize, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_struct_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + // Specialized types: + fn read_option(&mut self, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder, bool) -> Result, + { + Err(Error::SyntaxError) + } + + #[inline] + fn read_seq(&mut self, f: F) -> Result where + F: FnOnce(&mut UsizeDecoder, usize) -> Result, + { + let len = self.len; + f(self, len) + } + #[inline] + fn read_seq_elt(&mut self, _idx: usize, f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + f(self) + } + + fn read_map(&mut self, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_map_elt_key(&mut self, _idx: usize, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_map_elt_val(&mut self, _idx: usize, _f: F) -> Result where + F: FnOnce(&mut UsizeDecoder) -> Result, + { + Err(Error::SyntaxError) + } + } + + + pub struct U8Decoder { + len: usize, + 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 { + type Error = Error; + + fn error(&mut self, _: &str) -> Error { Error::SyntaxError } + + // Primitive types: + fn read_nil(&mut self) -> Result<(), Error> { Err(Error::SyntaxError) } + fn read_usize(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_u16(&mut self) -> Result { Err(Error::SyntaxError) } + #[inline] + fn read_u8(&mut self) -> Result { + match self.iter.next() { + Some(value) => Ok(value), + None => Err(Error::EndOfStreamError), + } + } + #[inline] + fn read_isize(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i16(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_i8(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_bool(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_f64(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_f32(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_char(&mut self) -> Result { Err(Error::SyntaxError) } + fn read_str(&mut self) -> Result { Err(Error::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, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_variant_arg(&mut self, _a_idx: usize, _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, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_enum_struct_variant_field(&mut self, _f_name: &str, _f_idx: usize, _f: F) -> Result where + F: FnOnce(&mut U8Decoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_struct(&mut self, _s_name: &str, _len: usize, _f: F) -> Result where + F: FnOnce(&mut U8Decoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_struct_field(&mut self, _f_name: &str, _f_idx: usize, _f: F) -> Result where + F: FnOnce(&mut U8Decoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple(&mut self, _len: usize, _f: F) -> Result where + F: FnOnce(&mut U8Decoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_arg(&mut self, _a_idx: usize, _f: F) -> Result where + F: FnOnce(&mut U8Decoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_struct(&mut self, _s_name: &str, _len: usize, _f: F) -> Result where + F: FnOnce(&mut U8Decoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_tuple_struct_arg(&mut self, _a_idx: usize, _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(Error::SyntaxError) + } + + #[inline] + fn read_seq(&mut self, f: F) -> Result where + F: FnOnce(&mut U8Decoder, usize) -> Result, + { + let len = self.len; + f(self, len) + } + #[inline] + fn read_seq_elt(&mut self, _idx: usize, f: F) -> Result where + F: FnOnce(&mut U8Decoder) -> Result, + { + f(self) + } + + fn read_map(&mut self, _f: F) -> Result where + F: FnOnce(&mut U8Decoder, usize) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_map_elt_key(&mut self, _idx: usize, _f: F) -> Result where + F: FnOnce(&mut U8Decoder) -> Result, + { + Err(Error::SyntaxError) + } + + fn read_map_elt_val(&mut self, _idx: usize, _f: F) -> Result where + F: FnOnce(&mut U8Decoder) -> Result, + { + Err(Error::SyntaxError) + } + } +} + +////////////////////////////////////////////////////////////////////////////// + +mod deserializer { + //use std::num; + use std::vec; + + use super::Error; + + use serde2::de; + + #[derive(PartialEq, Debug)] + enum State { + StartState, + SepOrEndState, + EndState, + } + + pub struct Deserializer { + state: State, + iter: vec::IntoIter, + len: usize, + value: Option, + } + + impl Deserializer { + #[inline] + pub fn new(values: Vec) -> Deserializer { + let len = values.len(); + Deserializer { + state: State::StartState, + iter: values.into_iter(), + len: len, + value: None, + } + } + } + + impl de::Deserializer for Deserializer { + type Error = Error; + + #[inline] + fn visit(&mut self, mut visitor: V) -> Result + where V: de::Visitor, + { + match self.state { + State::StartState => { + self.state = State::SepOrEndState; + visitor.visit_seq(self) + } + State::SepOrEndState => { + visitor.visit_usize(self.value.take().unwrap()) + } + State::EndState => { + Err(Error::EndOfStreamError) + } + } + } + } + + impl de::SeqVisitor for Deserializer { + type Error = Error; + + #[inline] + fn visit(&mut self) -> Result, Error> + where T: de::Deserialize, + { + match self.iter.next() { + Some(value) => { + self.len -= 1; + self.value = Some(value); + Ok(Some(try!(de::Deserialize::deserialize(self)))) + } + None => { + self.state = State::EndState; + Ok(None) + } + } + } + + #[inline] + fn end(&mut self) -> Result<(), Error> { + match self.iter.next() { + Some(_) => Err(Error::SyntaxError), + None => { + self.state = State::EndState; + Ok(()) + } + } + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + (self.len, Some(self.len)) + } + } + + impl de::Deserializer for Deserializer { + type Error = Error; + + #[inline] + fn visit(&mut self, mut visitor: V) -> Result + where V: de::Visitor, + { + match self.state { + State::StartState => { + self.state = State::SepOrEndState; + visitor.visit_seq(self) + } + State::SepOrEndState => { + visitor.visit_u8(self.value.take().unwrap()) + } + State::EndState => { + Err(Error::EndOfStreamError) + } + } + } + } + + impl de::SeqVisitor for Deserializer { + type Error = Error; + + #[inline] + fn visit(&mut self) -> Result, Error> + where T: de::Deserialize, + { + match self.iter.next() { + Some(value) => { + self.len -= 1; + self.value = Some(value); + Ok(Some(try!(de::Deserialize::deserialize(self)))) + } + None => { + self.state = State::EndState; + Ok(None) + } + } + } + + #[inline] + fn end(&mut self) -> Result<(), Error> { + match self.iter.next() { + Some(_) => Err(Error::SyntaxError), + None => { + self.state = State::EndState; + Ok(()) + } + } + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + (self.len, Some(self.len)) + } + } +} + +////////////////////////////////////////////////////////////////////////////// + +fn run_decoder< + D: Decoder, + T: Clone + PartialEq + Debug + Decodable +>(mut d: D, value: T) { + let v = Decodable::decode(&mut d); + + assert_eq!(Ok(value), v); +} + +fn run_deserializer< + D: Deserializer, + E: Debug, + T: Clone + PartialEq + Debug + Deserialize +>(mut d: D, value: T) { + let v: T = Deserialize::deserialize(&mut d).unwrap(); + + assert_eq!(value, v); +} + +#[bench] +fn bench_decoder_usize_000(b: &mut Bencher) { + b.iter(|| { + let v: Vec = vec!(); + run_decoder(decoder::UsizeDecoder::new(v.clone()), v) + }) +} + +#[bench] +fn bench_decoder_usize_003(b: &mut Bencher) { + b.iter(|| { + let v: Vec = vec!(1, 2, 3); + run_decoder(decoder::UsizeDecoder::new(v.clone()), v) + }) +} + +#[bench] +fn bench_decoder_usize_100(b: &mut Bencher) { + b.iter(|| { + let v: Vec = range(0, 100).collect(); + run_decoder(decoder::UsizeDecoder::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_usize_000(b: &mut Bencher) { + b.iter(|| { + let v: Vec = vec!(); + run_deserializer(deserializer::Deserializer::new(v.clone()), v) + }) +} + +#[bench] +fn bench_deserializer_usize_003(b: &mut Bencher) { + b.iter(|| { + let v: Vec = vec!(1, 2, 3); + run_deserializer(deserializer::Deserializer::new(v.clone()), v) + }) +} + +#[bench] +fn bench_deserializer_usize_100(b: &mut Bencher) { + b.iter(|| { + let v: Vec = range(0, 100).collect(); + run_deserializer(deserializer::Deserializer::new(v.clone()), v) + }) +} + +#[bench] +fn bench_deserializer_u8_000(b: &mut Bencher) { + b.iter(|| { + let v: Vec = vec!(); + run_deserializer(deserializer::Deserializer::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::Deserializer::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::Deserializer::new(v.clone()), v) + }) +}