From c117a680cf35868cbcccea67eddb775ec724c6a2 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 28 Apr 2015 18:12:26 +0200 Subject: [PATCH 1/3] changes needed for xml parsing --- src/de/impls.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++--- src/de/mod.rs | 2 +- src/iter.rs | 14 ++++++++----- 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/src/de/impls.rs b/src/de/impls.rs index f73b3e52..ac340115 100644 --- a/src/de/impls.rs +++ b/src/de/impls.rs @@ -4,6 +4,7 @@ use std::marker::PhantomData; use std::path; use std::rc::Rc; use std::sync::Arc; +use std::str; use num::FromPrimitive; @@ -56,6 +57,16 @@ impl Visitor for BoolVisitor { { Ok(v) } + + fn visit_str(&mut self, s: &str) -> Result + where E: Error, + { + match s.trim() { + "true" => Ok(true), + "false" => Ok(false), + _ => Err(Error::syntax_error()), + } + } } impl Deserialize for bool { @@ -82,6 +93,10 @@ macro_rules! impl_deserialize_num_method { } } +pub struct NumericVisitor { + marker: PhantomData, +} + pub struct PrimitiveVisitor { marker: PhantomData, } @@ -95,6 +110,41 @@ impl PrimitiveVisitor { } } +impl NumericVisitor { + #[inline] + pub fn new() -> Self { + NumericVisitor { + marker: PhantomData, + } + } +} + +impl< + T: Deserialize + FromPrimitive + str::FromStr +> Visitor for NumericVisitor { + type Value = T; + + impl_deserialize_num_method!(isize, visit_isize, from_isize); + impl_deserialize_num_method!(i8, visit_i8, from_i8); + impl_deserialize_num_method!(i16, visit_i16, from_i16); + impl_deserialize_num_method!(i32, visit_i32, from_i32); + impl_deserialize_num_method!(i64, visit_i64, from_i64); + impl_deserialize_num_method!(usize, visit_usize, from_usize); + impl_deserialize_num_method!(u8, visit_u8, from_u8); + impl_deserialize_num_method!(u16, visit_u16, from_u16); + impl_deserialize_num_method!(u32, visit_u32, from_u32); + impl_deserialize_num_method!(u64, visit_u64, from_u64); + impl_deserialize_num_method!(f32, visit_f32, from_f32); + impl_deserialize_num_method!(f64, visit_f64, from_f64); + + #[inline] + fn visit_str(&mut self, v: &str) -> Result + where E: Error, + { + str::FromStr::from_str(v.trim()).or(Err(Error::syntax_error())) + } +} + impl< T: Deserialize + FromPrimitive > Visitor for PrimitiveVisitor { @@ -121,7 +171,7 @@ macro_rules! impl_deserialize_num { fn deserialize(deserializer: &mut D) -> Result<$ty, D::Error> where D: Deserializer, { - deserializer.visit(PrimitiveVisitor::new()) + deserializer.visit(NumericVisitor::new()) } } } @@ -394,7 +444,7 @@ impl Deserialize for Vec fn deserialize(deserializer: &mut D) -> Result, D::Error> where D: Deserializer, { - deserializer.visit(VecVisitor::new()) + deserializer.visit_seq(VecVisitor::new()) } } @@ -438,7 +488,7 @@ macro_rules! tuple_impls { fn deserialize(deserializer: &mut D) -> Result<($($name,)+), D::Error> where D: Deserializer, { - deserializer.visit($visitor { marker: PhantomData }) + deserializer.visit_seq($visitor { marker: PhantomData }) } } )+ diff --git a/src/de/mod.rs b/src/de/mod.rs index b10f12c0..51de922a 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -118,7 +118,7 @@ pub trait Deserializer { /////////////////////////////////////////////////////////////////////////////// pub trait Visitor { - type Value; + type Value: Deserialize; fn visit_bool(&mut self, _v: bool) -> Result where E: Error, diff --git a/src/iter.rs b/src/iter.rs index 508ebad1..ddcfbb79 100644 --- a/src/iter.rs +++ b/src/iter.rs @@ -1,7 +1,8 @@ use std::io; +use std::iter::Peekable; pub struct LineColIterator>> { - iter: Iter, + iter: Peekable, line: usize, col: usize, } @@ -9,7 +10,7 @@ pub struct LineColIterator>> { impl>> LineColIterator { pub fn new(iter: Iter) -> LineColIterator { LineColIterator { - iter: iter, + iter: iter.peekable(), line: 1, col: 0, } @@ -22,13 +23,16 @@ impl>> LineColIterator { pub fn col(&self) -> usize { self.col } /// Gets a reference to the underlying iterator. - pub fn get_ref(&self) -> &Iter { &self.iter } + pub fn get_ref(&self) -> &Peekable { &self.iter } /// Gets a mutable reference to the underlying iterator. - pub fn get_mut(&self) -> &Iter { &self.iter } + pub fn get_mut(&mut self) -> &mut Peekable { &mut self.iter } /// Unwraps this `LineColIterator`, returning the underlying iterator. - pub fn into_inner(self) -> Iter { self.iter } + pub fn into_inner(self) -> Peekable { self.iter } + + /// peeks at the next value + pub fn peek(&mut self) -> Option<&io::Result> { self.iter.peek() } } impl>> Iterator for LineColIterator { From 83ee86122b59703ae777ca61eb1a82dcfb374ffa Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Fri, 8 May 2015 16:32:46 +0200 Subject: [PATCH 2/3] address comments by erickt --- src/de/impls.rs | 36 ++---------------------------------- src/iter.rs | 12 +++++++----- 2 files changed, 9 insertions(+), 39 deletions(-) diff --git a/src/de/impls.rs b/src/de/impls.rs index ac340115..9fde989b 100644 --- a/src/de/impls.rs +++ b/src/de/impls.rs @@ -93,10 +93,6 @@ macro_rules! impl_deserialize_num_method { } } -pub struct NumericVisitor { - marker: PhantomData, -} - pub struct PrimitiveVisitor { marker: PhantomData, } @@ -110,18 +106,9 @@ impl PrimitiveVisitor { } } -impl NumericVisitor { - #[inline] - pub fn new() -> Self { - NumericVisitor { - marker: PhantomData, - } - } -} - impl< T: Deserialize + FromPrimitive + str::FromStr -> Visitor for NumericVisitor { +> Visitor for PrimitiveVisitor { type Value = T; impl_deserialize_num_method!(isize, visit_isize, from_isize); @@ -145,25 +132,6 @@ impl< } } -impl< - T: Deserialize + FromPrimitive -> Visitor for PrimitiveVisitor { - type Value = T; - - impl_deserialize_num_method!(isize, visit_isize, from_isize); - impl_deserialize_num_method!(i8, visit_i8, from_i8); - impl_deserialize_num_method!(i16, visit_i16, from_i16); - impl_deserialize_num_method!(i32, visit_i32, from_i32); - impl_deserialize_num_method!(i64, visit_i64, from_i64); - impl_deserialize_num_method!(usize, visit_usize, from_usize); - impl_deserialize_num_method!(u8, visit_u8, from_u8); - impl_deserialize_num_method!(u16, visit_u16, from_u16); - impl_deserialize_num_method!(u32, visit_u32, from_u32); - impl_deserialize_num_method!(u64, visit_u64, from_u64); - impl_deserialize_num_method!(f32, visit_f32, from_f32); - impl_deserialize_num_method!(f64, visit_f64, from_f64); -} - macro_rules! impl_deserialize_num { ($ty:ty) => { impl Deserialize for $ty { @@ -171,7 +139,7 @@ macro_rules! impl_deserialize_num { fn deserialize(deserializer: &mut D) -> Result<$ty, D::Error> where D: Deserializer, { - deserializer.visit(NumericVisitor::new()) + deserializer.visit(PrimitiveVisitor::new()) } } } diff --git a/src/iter.rs b/src/iter.rs index ddcfbb79..ec0bb134 100644 --- a/src/iter.rs +++ b/src/iter.rs @@ -2,7 +2,7 @@ use std::io; use std::iter::Peekable; pub struct LineColIterator>> { - iter: Peekable, + iter: Iter, line: usize, col: usize, } @@ -10,7 +10,7 @@ pub struct LineColIterator>> { impl>> LineColIterator { pub fn new(iter: Iter) -> LineColIterator { LineColIterator { - iter: iter.peekable(), + iter: iter, line: 1, col: 0, } @@ -23,14 +23,16 @@ impl>> LineColIterator { pub fn col(&self) -> usize { self.col } /// Gets a reference to the underlying iterator. - pub fn get_ref(&self) -> &Peekable { &self.iter } + pub fn get_ref(&self) -> &Iter { &self.iter } /// Gets a mutable reference to the underlying iterator. - pub fn get_mut(&mut self) -> &mut Peekable { &mut self.iter } + pub fn get_mut(&mut self) -> &mut Iter { &mut self.iter } /// Unwraps this `LineColIterator`, returning the underlying iterator. - pub fn into_inner(self) -> Peekable { self.iter } + pub fn into_inner(self) -> Iter { self.iter } +} +impl>> LineColIterator> { /// peeks at the next value pub fn peek(&mut self) -> Option<&io::Result> { self.iter.peek() } } From 0485702a6878bea3d8b21fef8801cb00f397d77a Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Mon, 11 May 2015 09:39:18 +0200 Subject: [PATCH 3/3] update benchmarks --- benches/bench_log.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/benches/bench_log.rs b/benches/bench_log.rs index e29a3168..24afe2d1 100644 --- a/benches/bench_log.rs +++ b/benches/bench_log.rs @@ -15,6 +15,7 @@ use serde::de::{self, Deserialize, Deserializer}; use serde::json::ser::escape_str; use serde::json; use serde::ser::{self, Serialize, Serializer}; +use std::str::FromStr; use rustc_serialize::Encodable; @@ -53,6 +54,11 @@ impl rustc_serialize::Decodable for HttpProtocol { } } +impl FromStr for HttpProtocol { + type Err = (); + fn from_str(s: &str) -> Result { unimplemented!() } +} + impl FromPrimitive for HttpProtocol { fn from_i64(i: i64) -> Option { FromPrimitive::from_u64(i as u64) @@ -101,6 +107,11 @@ enum HttpMethod { PATCH, } +impl FromStr for HttpMethod { + type Err = (); + fn from_str(s: &str) -> Result { unimplemented!() } +} + impl FromPrimitive for HttpMethod { fn from_i64(i: i64) -> Option { FromPrimitive::from_u64(i as u64) @@ -165,6 +176,11 @@ enum CacheStatus { Hit, } +impl FromStr for CacheStatus { + type Err = (); + fn from_str(s: &str) -> Result { unimplemented!() } +} + impl FromPrimitive for CacheStatus { fn from_i64(i: i64) -> Option { FromPrimitive::from_u64(i as u64) @@ -229,6 +245,11 @@ enum OriginProtocol { HTTPS, } +impl FromStr for OriginProtocol { + type Err = (); + fn from_str(s: &str) -> Result { unimplemented!() } +} + impl FromPrimitive for OriginProtocol { fn from_i64(i: i64) -> Option { FromPrimitive::from_u64(i as u64) @@ -286,6 +307,11 @@ enum ZonePlan { ENT, } +impl FromStr for ZonePlan { + type Err = (); + fn from_str(s: &str) -> Result { unimplemented!() } +} + impl FromPrimitive for ZonePlan { fn from_i64(i: i64) -> Option { FromPrimitive::from_u64(i as u64) @@ -596,6 +622,11 @@ enum Country { ZW, } +impl FromStr for Country { + type Err = (); + fn from_str(s: &str) -> Result { unimplemented!() } +} + impl FromPrimitive for Country { fn from_i64(i: i64) -> Option { FromPrimitive::from_u64(i as u64)