From 8587bb3a4c721e5ee6cc594adccf8c8a4b5c155b Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Mon, 26 May 2014 08:26:34 -0700 Subject: [PATCH] Replace StructField with Str/String. 2322ns vs 2982ns --- bench_struct.rs | 4 ++-- de.rs | 30 +++++++++++++++++------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/bench_struct.rs b/bench_struct.rs index 3b451a77..ec215ba8 100644 --- a/bench_struct.rs +++ b/bench_struct.rs @@ -272,7 +272,7 @@ mod deserializer { use collections::HashMap; use super::{Outer, Inner, Error, EndOfStream, SyntaxError}; use de::Deserializer; - use de::{Token, Uint, Char, String, Null, TupleStart, StructStart, StructField, SeqStart, MapStart, End, Option}; + use de::{Token, Uint, Char, String, Null, TupleStart, StructStart, Str, SeqStart, MapStart, End, Option}; enum State { OuterState(Outer), @@ -325,7 +325,7 @@ mod deserializer { self.stack.push(FieldState("a")); Some(Ok(StructStart("Inner"))) } - Some(FieldState(name)) => Some(Ok(StructField(name))), + Some(FieldState(name)) => Some(Ok(Str(name))), Some(VecState(value)) => { self.stack.push(EndState); let len = value.len(); diff --git a/de.rs b/de.rs index ba8e677f..d2a7d375 100644 --- a/de.rs +++ b/de.rs @@ -28,7 +28,6 @@ pub enum Token { TupleStart(uint), StructStart(&'static str), - StructField(&'static str), EnumStart(&'static str, &'static str), @@ -192,15 +191,20 @@ pub trait Deserializer: Iterator> { }; match token { - StructField(n) => { - if name == n { - Deserializable::deserialize(self) - } else { - Err(self.syntax_error()) + Str(n) => { + if name != n { + return Err(self.syntax_error()); } } - _ => Err(self.syntax_error()), + String(n) => { + if name != n.as_slice() { + return Err(self.syntax_error()); + } + } + _ => { return Err(self.syntax_error()); } } + + Deserializable::deserialize(self) } #[inline] @@ -492,7 +496,7 @@ mod tests { use serialize::Decoder; use super::{Token, Null, Int, Uint, Str, String, Char, Option}; - use super::{TupleStart, StructStart, StructField, EnumStart}; + use super::{TupleStart, StructStart, EnumStart}; use super::{SeqStart, MapStart, End}; use super::{Deserializer, Deserializable}; @@ -737,7 +741,7 @@ mod tests { fn test_tokens_struct_empty() { let tokens = vec!( StructStart("Outer"), - StructField("inner"), + Str("inner"), SeqStart(0), End, End, @@ -753,16 +757,16 @@ mod tests { fn test_tokens_struct() { let tokens = vec!( StructStart("Outer"), - StructField("inner"), + Str("inner"), SeqStart(1), StructStart("Inner"), - StructField("a"), + Str("a"), Null, - StructField("b"), + Str("b"), Uint(5), - StructField("c"), + Str("c"), MapStart(1), TupleStart(2), String("abc".to_strbuf()),