diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b83d2226 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..f97c64fc --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "serde" +version = "0.1.0" +authors = ["Erick Tryzelaar "] + +[[lib]] +name = "serde" +path = "src/lib.rs" + +[dependencies.serde_macros] +path = "serde_macros/" diff --git a/serde_macros/Cargo.toml b/serde_macros/Cargo.toml new file mode 100644 index 00000000..7b1ee79e --- /dev/null +++ b/serde_macros/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "serde_macros" +version = "0.1.0" +authors = ["Erick Tryzelaar "] + +[[lib]] +name = "serde_macros" +path = "src/lib.rs" +plugin = true diff --git a/serde_macros.rs b/serde_macros/src/lib.rs similarity index 99% rename from serde_macros.rs rename to serde_macros/src/lib.rs index 18e105b2..3e67f566 100644 --- a/serde_macros.rs +++ b/serde_macros/src/lib.rs @@ -1,5 +1,6 @@ +#![crate_name = "serde_macros"] #![crate_type = "dylib"] -#![crate_type = "rlib"] +#![license = "MIT/ASL2"] #![feature(plugin_registrar)] @@ -114,7 +115,6 @@ fn expand_deriving_serializable(cx: &mut ExtCtxt, ) ), attributes: attrs, - const_nonmatching: true, combine_substructure: combine_substructure(|a, b, c| { serializable_substructure(a, b, c) }), @@ -291,7 +291,6 @@ pub fn expand_deriving_deserializable(cx: &mut ExtCtxt, ) ), attributes: Vec::new(), - const_nonmatching: true, combine_substructure: combine_substructure(|a, b, c| { deserializable_substructure(a, b, c) }), diff --git a/src/bench_bytes.rs b/src/bench_bytes.rs new file mode 100644 index 00000000..277d722e --- /dev/null +++ b/src/bench_bytes.rs @@ -0,0 +1,223 @@ +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!()) + }) +} diff --git a/bench_enum.rs b/src/bench_enum.rs similarity index 100% rename from bench_enum.rs rename to src/bench_enum.rs diff --git a/bench_log.rs b/src/bench_log.rs similarity index 100% rename from bench_log.rs rename to src/bench_log.rs diff --git a/bench_map.rs b/src/bench_map.rs similarity index 100% rename from bench_map.rs rename to src/bench_map.rs diff --git a/bench_struct.rs b/src/bench_struct.rs similarity index 100% rename from bench_struct.rs rename to src/bench_struct.rs diff --git a/bench_vec.rs b/src/bench_vec.rs similarity index 100% rename from bench_vec.rs rename to src/bench_vec.rs diff --git a/de.rs b/src/de.rs similarity index 100% rename from de.rs rename to src/de.rs diff --git a/json.rs b/src/json.rs similarity index 100% rename from json.rs rename to src/json.rs diff --git a/serde.rs b/src/lib.rs similarity index 100% rename from serde.rs rename to src/lib.rs diff --git a/ser.rs b/src/ser.rs similarity index 100% rename from ser.rs rename to src/ser.rs