From e140c2b5c5bb5abab7fcc6a9d4540aaa3bf566a6 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 28 Jan 2017 23:52:52 +0100 Subject: Use void for the unreachable serializers --- src/lib.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index bacb67f..0c1a99e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ #[macro_use] extern crate serde; extern crate url; +extern crate void; pub mod de; pub mod ser; -- cgit v1.2.3 From 1d88bbb26b9caaa90993845042e21af444e9399a Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 28 Jan 2017 23:56:15 +0100 Subject: Use itoa to not allocate a String to serialize an integer --- Cargo.toml | 1 + src/lib.rs | 1 + src/ser/part.rs | 28 ++++++++++++++++++++-------- 3 files changed, 22 insertions(+), 8 deletions(-) (limited to 'src/lib.rs') diff --git a/Cargo.toml b/Cargo.toml index a68819a..e7865a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ keywords = ["serde", "serialization", "urlencoded"] test = false [dependencies] +itoa = "0.3.0" serde = "0.9.2" url = "1.0.0" void = "1.0.2" diff --git a/src/lib.rs b/src/lib.rs index 0c1a99e..7a3be26 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ //! `x-www-form-urlencoded` meets Serde +extern crate itoa; #[macro_use] extern crate serde; extern crate url; diff --git a/src/ser/part.rs b/src/ser/part.rs index 097504e..33811f4 100644 --- a/src/ser/part.rs +++ b/src/ser/part.rs @@ -1,3 +1,4 @@ +use itoa; use ser::Error; use ser::void::VoidSerializer; use serde::ser; @@ -50,35 +51,35 @@ impl ser::Serializer for PartSerializer { } fn serialize_i8(self, v: i8) -> Result { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_i16(self, v: i16) -> Result { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_i32(self, v: i32) -> Result { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_i64(self, v: i64) -> Result { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_u8(self, v: u8) -> Result { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_u16(self, v: u16) -> Result { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_u32(self, v: u32) -> Result { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_u64(self, v: u64) -> Result { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_f32(self, v: f32) -> Result { @@ -207,3 +208,14 @@ impl ser::Serializer for PartSerializer { Err(self.sink.unsupported()) } } + +impl PartSerializer { + fn serialize_integer(self, value: I) -> Result + where I: itoa::Integer + { + let mut buf = [b'\0'; 20]; + let len = itoa::write(&mut buf[..], value).unwrap(); + let part = unsafe { str::from_utf8_unchecked(&buf[0..len]) }; + ser::Serializer::serialize_str(self, part) + } +} -- cgit v1.2.3 From 5625c254e55c767a1ec0235219c232f53dcf9e96 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 29 Jan 2017 00:14:57 +0100 Subject: Use dtoa to not allocate a String to serialize a float --- Cargo.toml | 1 + src/lib.rs | 1 + src/ser/part.rs | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) (limited to 'src/lib.rs') diff --git a/Cargo.toml b/Cargo.toml index e7865a4..8566cc1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ keywords = ["serde", "serialization", "urlencoded"] test = false [dependencies] +dtoa = "0.4.0" itoa = "0.3.0" serde = "0.9.2" url = "1.0.0" diff --git a/src/lib.rs b/src/lib.rs index 7a3be26..8fefd77 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ //! `x-www-form-urlencoded` meets Serde extern crate itoa; +extern crate dtoa; #[macro_use] extern crate serde; extern crate url; diff --git a/src/ser/part.rs b/src/ser/part.rs index 33811f4..049bacd 100644 --- a/src/ser/part.rs +++ b/src/ser/part.rs @@ -1,3 +1,4 @@ +use dtoa; use itoa; use ser::Error; use ser::void::VoidSerializer; @@ -83,11 +84,11 @@ impl ser::Serializer for PartSerializer { } fn serialize_f32(self, v: f32) -> Result { - self.sink.serialize_string(v.to_string()) + self.serialize_floating(v) } fn serialize_f64(self, v: f64) -> Result { - self.sink.serialize_string(v.to_string()) + self.serialize_floating(v) } fn serialize_char(self, v: char) -> Result { @@ -218,4 +219,13 @@ impl PartSerializer { let part = unsafe { str::from_utf8_unchecked(&buf[0..len]) }; ser::Serializer::serialize_str(self, part) } + + fn serialize_floating(self, value: F) -> Result + where F: dtoa::Floating + { + let mut buf = [b'\0'; 24]; + let len = dtoa::write(&mut buf[..], value).unwrap(); + let part = unsafe { str::from_utf8_unchecked(&buf[0..len]) }; + ser::Serializer::serialize_str(self, part) + } } -- cgit v1.2.3