diff --git a/serde2/src/bin.rs b/serde2/src/bin.rs index d9543dec..f6774cd4 100644 --- a/serde2/src/bin.rs +++ b/serde2/src/bin.rs @@ -14,7 +14,7 @@ struct Foo { impl, R> serde2::Serialize for Foo { fn serialize(&self, state: &mut S) -> R { - state.visit_struct("Foo", FooSerialize { + state.visit_named_map("Foo", FooSerialize { value: self, state: 0, }) @@ -31,15 +31,15 @@ impl<'a, S: serde2::VisitorState, R> serde2::Visitor for FooSerialize<' match self.state { 0 => { self.state += 1; - Some(state.visit_map_elt(true, "x", &self.value.x)) + Some(state.visit_map_elt("x", &self.value.x)) } 1 => { self.state += 1; - Some(state.visit_map_elt(false, "y", &self.value.y)) + Some(state.visit_map_elt("y", &self.value.y)) } 2 => { self.state += 1; - Some(state.visit_map_elt(false, "z", &self.value.z)) + Some(state.visit_map_elt("z", &self.value.z)) } _ => { None diff --git a/serde2/src/json/ser.rs b/serde2/src/json/ser.rs index 790924b0..da965d4e 100644 --- a/serde2/src/json/ser.rs +++ b/serde2/src/json/ser.rs @@ -65,34 +65,18 @@ impl ser::VisitorState> for Serializer { } fn visit_seq< - T: ser::Serialize, io::IoResult<()>>, - Iter: Iterator - >(&mut self, mut iter: Iter) -> io::IoResult<()> { - try!(write!(self.writer, "[")); - let mut first = true; - for elt in iter { - try!(self.visit_seq_elt(first, elt)); - first = false; - - } - write!(self.writer, "]") - } - - fn visit_seq_elt< - T: ser::Serialize, io::IoResult<()>> - >(&mut self, first: bool, value: T) -> io::IoResult<()> { - if !first { - try!(write!(self.writer, ", ")); - } - - value.serialize(self) - } - - fn visit_tuple< V: ser::Visitor, io::IoResult<()>> >(&mut self, mut visitor: V) -> io::IoResult<()> { try!(write!(self.writer, "[")); + + let mut first = true; loop { + if first { + first = false; + } else { + try!(write!(self.writer, ", ")); + } + match visitor.visit(self) { Some(Ok(())) => { } Some(Err(err)) => { return Err(err); } @@ -102,29 +86,30 @@ impl ser::VisitorState> for Serializer { write!(self.writer, "]") } - fn visit_tuple_struct< - V: ser::Visitor, io::IoResult<()>> - >(&mut self, _name: &'static str, visitor: V) -> io::IoResult<()> { - self.visit_tuple(visitor) - } - - - fn visit_enum< - V: ser::Visitor, io::IoResult<()>> - >(&mut self, _name: &'static str, _variant: &'static str, visitor: V) -> io::IoResult<()> { - self.visit_tuple(visitor) + fn visit_seq_elt< + T: ser::Serialize, io::IoResult<()>> + >(&mut self, value: T) -> io::IoResult<()> { + value.serialize(self) } fn visit_map< - K: ser::Serialize, io::IoResult<()>>, - V: ser::Serialize, io::IoResult<()>>, - Iter: Iterator<(K, V)> - >(&mut self, mut iter: Iter) -> io::IoResult<()> { + V: ser::Visitor, io::IoResult<()>> + >(&mut self, mut visitor: V) -> io::IoResult<()> { try!(write!(self.writer, "{{")); + let mut first = true; - for (key, value) in iter { - try!(self.visit_map_elt(first, &key, &value)) - first = false; + loop { + if first { + first = false; + } else { + try!(write!(self.writer, ", ")); + } + + match visitor.visit(self) { + Some(Ok(())) => { } + Some(Err(err)) => { return Err(err); } + None => { break; } + } } write!(self.writer, "}}") } @@ -132,29 +117,11 @@ impl ser::VisitorState> for Serializer { 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, ", ")); - } - + >(&mut self, key: K, value: V) -> io::IoResult<()> { try!(key.serialize(self)); try!(write!(self.writer, ": ")); value.serialize(self) } - - fn visit_struct< - V: ser::Visitor, io::IoResult<()>> - >(&mut self, _name: &'static str, mut visitor: V) -> io::IoResult<()> { - try!(write!(self.writer, "{{")); - loop { - match visitor.visit(self) { - Some(Ok(())) => { } - Some(Err(err)) => { return Err(err); } - None => { break; } - } - } - write!(self.writer, "}}") - } } pub fn escape_bytes(wr: &mut W, bytes: &[u8]) -> io::IoResult<()> { diff --git a/serde2/src/lib.rs b/serde2/src/lib.rs index 3cbe1060..e8885e42 100644 --- a/serde2/src/lib.rs +++ b/serde2/src/lib.rs @@ -4,4 +4,4 @@ pub use ser::FormatState; pub use ser::GatherTokens; pub mod ser; -//pub mod json; +pub mod json; diff --git a/serde2/src/ser.rs b/serde2/src/ser.rs index 575e3686..3baa29db 100644 --- a/serde2/src/ser.rs +++ b/serde2/src/ser.rs @@ -90,12 +90,14 @@ pub trait VisitorState { V: Visitor >(&mut self, visitor: V) -> R; + #[inline] fn visit_named_seq< V: Visitor >(&mut self, _name: &'static str, visitor: V) -> R { self.visit_seq(visitor) } + #[inline] fn visit_enum< V: Visitor >(&mut self, _name: &'static str, _variant: &'static str, visitor: V) -> R { @@ -110,6 +112,7 @@ pub trait VisitorState { V: Visitor >(&mut self, visitor: V) -> R; + #[inline] fn visit_named_map< V: Visitor >(&mut self, _name: &'static str, visitor: V) -> R { @@ -138,13 +141,13 @@ impl, R> Serialize for &'static str { /////////////////////////////////////////////////////////////////////////////// -struct IteratorVisitor { +struct SeqIteratorVisitor { iter: Iter, } -impl> IteratorVisitor { - pub fn new(iter: Iter) -> IteratorVisitor { - IteratorVisitor { +impl> SeqIteratorVisitor { + pub fn new(iter: Iter) -> SeqIteratorVisitor { + SeqIteratorVisitor { iter: iter, } } @@ -155,7 +158,7 @@ impl< Iter: Iterator, S: VisitorState, R -> Visitor for IteratorVisitor { +> Visitor for SeqIteratorVisitor { fn visit(&mut self, state: &mut S) -> Option { match self.iter.next() { Some(value) => Some(state.visit_seq_elt(value)), @@ -176,7 +179,43 @@ impl< T: Serialize > Serialize for Vec { fn serialize(&self, state: &mut S) -> R { - state.visit_seq(self.iter()) + state.visit_seq(SeqIteratorVisitor::new(self.iter())) + } +} + +/////////////////////////////////////////////////////////////////////////////// + +struct MapIteratorVisitor { + iter: Iter, +} + +impl< + K, + V, + Iter: Iterator<(K, V)>> MapIteratorVisitor { + pub fn new(iter: Iter) -> MapIteratorVisitor { + MapIteratorVisitor { + iter: iter, + } + } +} + +impl< + K: Serialize, + V: Serialize, + Iter: Iterator<(K, V)>, + S: VisitorState, + R +> Visitor for MapIteratorVisitor { + fn visit(&mut self, state: &mut S) -> Option { + match self.iter.next() { + Some((key, value)) => Some(state.visit_map_elt(key, value)), + None => None + } + } + + fn size_hint(&self) -> (uint, Option) { + self.iter.size_hint() } } @@ -189,7 +228,7 @@ impl< V: Serialize > Serialize for TreeMap { fn serialize(&self, state: &mut S) -> R { - state.visit_map(self.iter()) + state.visit_map(MapIteratorVisitor::new(self.iter())) } } @@ -222,12 +261,12 @@ impl< 0 => { self.state += 1; let (ref value, _) = *self.value; - Some(state.visit_seq_elt(true, value)) + Some(state.visit_seq_elt(value)) } 1 => { self.state += 1; let (_, ref value) = *self.value; - Some(state.visit_seq_elt(false, value)) + Some(state.visit_seq_elt(value)) } _ => { None @@ -341,10 +380,10 @@ impl VisitorState<()> for GatherTokens { self.tokens.push(End) } - fn visit_enum< - V: Visitor - >(&mut self, _name: &'static str, _variant: &'static str, visitor: V) -> () { - self.visit_seq(visitor) + fn visit_seq_elt< + T: Serialize + >(&mut self, value: T) -> () { + value.serialize(self) } fn visit_map< @@ -374,6 +413,15 @@ impl VisitorState<()> for GatherTokens { } self.serialize(End) } + + fn visit_map_elt< + K: Serialize, + V: Serialize + >(&mut self, key: K, value: V) -> () { + key.serialize(self); + value.serialize(self) + } + } /////////////////////////////////////////////////////////////////////////////// @@ -427,7 +475,15 @@ impl VisitorState> for FormatState { V: Visitor, IoResult<()>> >(&mut self, mut visitor: V) -> IoResult<()> { try!(write!(self.writer, "[")); + + let mut first = true; loop { + if first { + first = false; + } else { + try!(write!(self.writer, ", ")); + } + match visitor.visit(self) { Some(Ok(())) => { } Some(Err(err)) => { return Err(err); } @@ -437,22 +493,9 @@ impl VisitorState> for FormatState { write!(self.writer, "]") } - fn visit_enum< - V: Visitor, IoResult<()>> - >(&mut self, _name: &'static str, _variant: &'static str, visitor: V) -> IoResult<()> { - self.visit_tuple(visitor) - } - - fn visit_map_elt< - K: Serialize, IoResult<()>>, - V: Serialize, IoResult<()>> - >(&mut self, first: bool, key: K, value: V) -> IoResult<()> { - if !first { - try!(write!(self.writer, ", ")); - } - - try!(key.serialize(self)); - try!(write!(self.writer, ": ")); + fn visit_seq_elt< + T: Serialize, IoResult<()>> + >(&mut self, value: T) -> IoResult<()> { value.serialize(self) } @@ -460,7 +503,15 @@ impl VisitorState> for FormatState { V: Visitor, IoResult<()>> >(&mut self, mut visitor: V) -> IoResult<()> { try!(write!(self.writer, "{{")); + + let mut first = true; loop { + if first { + first = false; + } else { + try!(write!(self.writer, ", ")); + } + match visitor.visit(self) { Some(Ok(())) => { } Some(Err(err)) => { return Err(err); } @@ -469,6 +520,15 @@ impl VisitorState> for FormatState { } write!(self.writer, "}}") } + + fn visit_map_elt< + K: Serialize, IoResult<()>>, + V: Serialize, IoResult<()>> + >(&mut self, key: K, value: V) -> IoResult<()> { + try!(key.serialize(self)); + try!(write!(self.writer, ": ")); + value.serialize(self) + } } ///////////////////////////////////////////////////////////////////////////////