diff --git a/serde2/Cargo.lock b/serde2/Cargo.lock index 386763db..edccb429 100644 --- a/serde2/Cargo.lock +++ b/serde2/Cargo.lock @@ -1,4 +1,11 @@ [root] name = "serde2" version = "0.1.0" +dependencies = [ + "serde2_macros 0.1.0", +] + +[[package]] +name = "serde2_macros" +version = "0.1.0" diff --git a/serde2/Cargo.toml b/serde2/Cargo.toml index 32c309b4..9001c6bd 100644 --- a/serde2/Cargo.toml +++ b/serde2/Cargo.toml @@ -9,3 +9,6 @@ name = "serde2" [[bin]] name = "serde2" path = "src/bin.rs" + +[dependencies.serde2_macros] +path = "serde2_macros/" diff --git a/serde2/src/json/ser.rs b/serde2/src/json/ser.rs index 3fa4ecc6..f44b89e6 100644 --- a/serde2/src/json/ser.rs +++ b/serde2/src/json/ser.rs @@ -12,6 +12,7 @@ pub struct Serializer { impl Serializer { /// Creates a new JSON serializer whose output will be written to the writer /// specified. + #[inline] pub fn new(writer: W) -> Serializer { Serializer { writer: writer, @@ -19,6 +20,7 @@ impl Serializer { } /// Unwrap the Writer from the Serializer. + #[inline] pub fn unwrap(self) -> W { self.writer } @@ -39,11 +41,51 @@ impl ser::VisitorState> for Serializer { } } + #[inline] + fn visit_int(&mut self, value: int) -> io::IoResult<()> { + write!(self.writer, "{}", value) + } + + #[inline] + fn visit_i8(&mut self, value: i8) -> io::IoResult<()> { + write!(self.writer, "{}", value) + } + + #[inline] + fn visit_i16(&mut self, value: i16) -> io::IoResult<()> { + write!(self.writer, "{}", value) + } + + #[inline] + fn visit_i32(&mut self, value: i32) -> io::IoResult<()> { + write!(self.writer, "{}", value) + } + #[inline] fn visit_i64(&mut self, value: i64) -> io::IoResult<()> { write!(self.writer, "{}", value) } + #[inline] + fn visit_uint(&mut self, value: uint) -> io::IoResult<()> { + write!(self.writer, "{}", value) + } + + #[inline] + fn visit_u8(&mut self, value: u8) -> io::IoResult<()> { + write!(self.writer, "{}", value) + } + + #[inline] + fn visit_u16(&mut self, value: u16) -> io::IoResult<()> { + write!(self.writer, "{}", value) + } + + #[inline] + fn visit_u32(&mut self, value: u32) -> io::IoResult<()> { + write!(self.writer, "{}", value) + } + #[inline] fn visit_u64(&mut self, value: u64) -> io::IoResult<()> { write!(self.writer, "{}", value) @@ -60,10 +102,11 @@ impl ser::VisitorState> for Serializer { } #[inline] - fn visit_str(&mut self, value: &'static str) -> io::IoResult<()> { + fn visit_str(&mut self, value: &str) -> io::IoResult<()> { escape_str(&mut self.writer, value) } + #[inline] fn visit_seq< V: ser::Visitor, io::IoResult<()>> >(&mut self, mut visitor: V) -> io::IoResult<()> { @@ -76,19 +119,22 @@ impl ser::VisitorState> for Serializer { None => { break; } } } + write!(self.writer, "]") } + #[inline] fn visit_seq_elt< T: ser::Serialize, io::IoResult<()>> >(&mut self, first: bool, value: T) -> io::IoResult<()> { if !first { - try!(write!(self.writer, ", ")); + try!(write!(self.writer, ",")); } - value.serialize(self) + //value.serialize(self) } + #[inline] fn visit_map< V: ser::Visitor, io::IoResult<()>> >(&mut self, mut visitor: V) -> io::IoResult<()> { @@ -104,21 +150,22 @@ impl ser::VisitorState> for Serializer { write!(self.writer, "}}") } + #[inline] fn visit_map_elt< K: ser::Serialize, io::IoResult<()>>, V: ser::Serialize, io::IoResult<()>> >(&mut self, first: bool, key: K, value: V) -> io::IoResult<()> { if !first { - try!(write!(self.writer, ", ")); + try!(write!(self.writer, ",")); } try!(key.serialize(self)); - try!(write!(self.writer, ": ")); + try!(write!(self.writer, ":")); value.serialize(self) } } -pub fn escape_bytes(wr: &mut W, bytes: &[u8]) -> io::IoResult<()> { +fn escape_bytes(wr: &mut W, bytes: &[u8]) -> io::IoResult<()> { try!(wr.write_str("\"")); let mut start = 0; @@ -151,7 +198,7 @@ pub fn escape_bytes(wr: &mut W, bytes: &[u8]) -> io::IoResult<()> { wr.write_str("\"") } -pub fn escape_str(wr: &mut W, value: &str) -> io::IoResult<()> { +fn escape_str(wr: &mut W, value: &str) -> io::IoResult<()> { escape_bytes(wr, value.as_bytes()) } @@ -168,6 +215,7 @@ fn fmt_f64_or_null(wr: &mut W, value: f64) -> io::IoResult<()> { } } +#[inline] pub fn to_vec< T: ser::Serialize, io::IoResult<()>> >(value: &T) -> io::IoResult> { @@ -177,6 +225,7 @@ pub fn to_vec< Ok(state.unwrap().unwrap()) } +#[inline] pub fn to_string< T: ser::Serialize, io::IoResult<()>> >(value: &T) -> io::IoResult>> { diff --git a/serde2/src/lib.rs b/serde2/src/lib.rs index ada153c1..5d2e81f7 100644 --- a/serde2/src/lib.rs +++ b/serde2/src/lib.rs @@ -1,3 +1,5 @@ +#![feature(macro_rules)] + pub use ser::{Serialize, Serializer}; pub use ser::{Visitor, VisitorState}; pub use ser::GatherTokens; diff --git a/serde2/src/ser.rs b/serde2/src/ser.rs index 9b3a9ea4..c3718050 100644 --- a/serde2/src/ser.rs +++ b/serde2/src/ser.rs @@ -82,7 +82,7 @@ pub trait VisitorState { fn visit_char(&mut self, value: char) -> R; - fn visit_str(&mut self, value: &'static str) -> R; + fn visit_str(&mut self, value: &str) -> R; fn visit_seq< V: Visitor @@ -125,15 +125,45 @@ pub trait VisitorState { /////////////////////////////////////////////////////////////////////////////// -impl, R> Serialize for int { - fn serialize(&self, state: &mut S) -> R { - state.visit_int(*self) +macro_rules! impl_serialize { + ($ty:ty, $method:ident) => { + impl, R> Serialize for $ty { + #[inline] + fn serialize(&self, state: &mut S) -> R { + state.$method(*self) + } + } } } -impl, R> Serialize for &'static str { - fn serialize(&self, state: &mut S) -> R { - state.visit_str(*self) +impl_serialize!(bool, visit_bool) +impl_serialize!(int, visit_int) +impl_serialize!(i8, visit_i8) +impl_serialize!(i16, visit_i16) +impl_serialize!(i32, visit_i32) +impl_serialize!(i64, visit_i64) +impl_serialize!(uint, visit_uint) +impl_serialize!(u8, visit_u8) +impl_serialize!(u16, visit_u16) +impl_serialize!(u32, visit_u32) +impl_serialize!(u64, visit_u64) +impl_serialize!(f32, visit_f32) +impl_serialize!(f64, visit_f64) +impl_serialize!(char, visit_char) + +/////////////////////////////////////////////////////////////////////////////// + +impl<'a, S: VisitorState, R> Serialize for &'a str { + #[inline] + fn serialize(&self, s: &mut S) -> R { + s.visit_str(*self) + } +} + +impl, R> Serialize for String { + #[inline] + fn serialize(&self, s: &mut S) -> R { + s.visit_str(self.as_slice()) } } @@ -145,6 +175,7 @@ pub struct SeqIteratorVisitor { } impl> SeqIteratorVisitor { + #[inline] pub fn new(iter: Iter) -> SeqIteratorVisitor { SeqIteratorVisitor { iter: iter, @@ -159,6 +190,7 @@ impl< S: VisitorState, R > Visitor for SeqIteratorVisitor { + #[inline] fn visit(&mut self, state: &mut S) -> Option { let first = self.first; self.first = false; @@ -169,6 +201,7 @@ impl< } } + #[inline] fn size_hint(&self) -> (uint, Option) { self.iter.size_hint() } @@ -181,6 +214,7 @@ impl< R, T: Serialize > Serialize for Vec { + #[inline] fn serialize(&self, state: &mut S) -> R { state.visit_seq(SeqIteratorVisitor::new(self.iter())) } @@ -193,10 +227,8 @@ pub struct MapIteratorVisitor { first: bool, } -impl< - K, - V, - Iter: Iterator<(K, V)>> MapIteratorVisitor { +impl> MapIteratorVisitor { + #[inline] pub fn new(iter: Iter) -> MapIteratorVisitor { MapIteratorVisitor { iter: iter, @@ -212,6 +244,7 @@ impl< S: VisitorState, R > Visitor for MapIteratorVisitor { + #[inline] fn visit(&mut self, state: &mut S) -> Option { let first = self.first; self.first = false; @@ -222,6 +255,7 @@ impl< } } + #[inline] fn size_hint(&self) -> (uint, Option) { self.iter.size_hint() } @@ -235,6 +269,7 @@ impl< K: Serialize + Ord, V: Serialize > Serialize for TreeMap { + #[inline] fn serialize(&self, state: &mut S) -> R { state.visit_map(MapIteratorVisitor::new(self.iter())) } @@ -247,6 +282,7 @@ impl< T0: Serialize, T1: Serialize > Serialize for (T0, T1) { + #[inline] fn serialize(&self, state: &mut S) -> R { state.visit_seq(Tuple2Serialize { value: self, state: 0 }) } @@ -264,6 +300,7 @@ impl< T0: Serialize, T1: Serialize > Visitor for Tuple2Serialize<'a, T0, T1> { + #[inline] fn visit(&mut self, state: &mut S) -> Option { match self.state { 0 => { @@ -282,6 +319,7 @@ impl< } } + #[inline] fn size_hint(&self) -> (uint, Option) { let size = 2 - self.state; (size, Some(size)) @@ -294,6 +332,7 @@ impl< R, T: Serialize > Serialize for &'a T { + #[inline] fn serialize(&self, state: &mut S) -> R { (**self).serialize(state) } @@ -302,7 +341,7 @@ impl< /////////////////////////////////////////////////////////////////////////////// #[deriving(Show)] -pub enum Token { +pub enum Token<'a> { Null, Bool(bool), Int(int), @@ -310,42 +349,43 @@ pub enum Token { U64(u64), F64(f64), Char(char), - Str(&'static str), + Str(&'a str), + String(String), SeqStart(uint), MapStart(uint), StructStart(&'static str, uint), End, } -pub trait TokenState: VisitorState { - fn serialize(&mut self, token: Token) -> R; +pub trait TokenState<'a, R>: VisitorState { + fn serialize(&mut self, token: Token<'a>) -> R; } /////////////////////////////////////////////////////////////////////////////// -pub struct GatherTokens { - tokens: Vec, +pub struct GatherTokens<'a> { + tokens: Vec>, } -impl GatherTokens { - pub fn new() -> GatherTokens { +impl<'a> GatherTokens<'a> { + pub fn new() -> GatherTokens<'a> { GatherTokens { tokens: Vec::new(), } } - pub fn unwrap(self) -> Vec { + pub fn unwrap(self) -> Vec> { self.tokens } } -impl TokenState<()> for GatherTokens { - fn serialize(&mut self, token: Token) -> () { +impl<'a> TokenState<'a, ()> for GatherTokens<'a> { + fn serialize(&mut self, token: Token<'a>) -> () { self.tokens.push(token); } } -impl VisitorState<()> for GatherTokens { +impl<'a> VisitorState<()> for GatherTokens<'a> { fn visit_null(&mut self) -> () { self.serialize(Null) } @@ -370,12 +410,12 @@ impl VisitorState<()> for GatherTokens { self.serialize(Char(value)) } - fn visit_str(&mut self, value: &'static str) -> () { - self.serialize(Str(value)) + fn visit_str(&mut self, value: &str) -> () { + self.serialize(String(value.to_string())) } fn visit_seq< - V: Visitor + V: Visitor, ()> >(&mut self, mut visitor: V) -> () { let (len, _) = visitor.size_hint(); self.tokens.push(SeqStart(len)); @@ -389,13 +429,13 @@ impl VisitorState<()> for GatherTokens { } fn visit_seq_elt< - T: Serialize + T: Serialize, ()> >(&mut self, _first: bool, value: T) -> () { value.serialize(self) } fn visit_map< - V: Visitor + V: Visitor, ()> >(&mut self, mut visitor: V) -> () { let (len, _) = visitor.size_hint(); self.serialize(MapStart(len)); @@ -409,7 +449,7 @@ impl VisitorState<()> for GatherTokens { } fn visit_named_map< - V: Visitor + V: Visitor, ()> >(&mut self, name: &'static str, mut visitor: V) -> () { let (len, _) = visitor.size_hint(); self.serialize(StructStart(name, len)); @@ -423,8 +463,8 @@ impl VisitorState<()> for GatherTokens { } fn visit_map_elt< - K: Serialize, - V: Serialize + K: Serialize, ()>, + V: Serialize, ()> >(&mut self, _first: bool, key: K, value: V) -> () { key.serialize(self); value.serialize(self)