diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2017-01-28 23:56:15 +0100 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2017-01-29 10:22:39 +0100 |
commit | 1d88bbb26b9caaa90993845042e21af444e9399a (patch) | |
tree | 598348627d8992330406ab6414ffd0cadf8d696f /src | |
parent | e140c2b5c5bb5abab7fcc6a9d4540aaa3bf566a6 (diff) |
Use itoa to not allocate a String to serialize an integer
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 1 | ||||
-rw-r--r-- | src/ser/part.rs | 28 |
2 files changed, 21 insertions, 8 deletions
@@ -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<S: Sink> ser::Serializer for PartSerializer<S> { } fn serialize_i8(self, v: i8) -> Result<S::Ok, Error> { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_i16(self, v: i16) -> Result<S::Ok, Error> { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_i32(self, v: i32) -> Result<S::Ok, Error> { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_i64(self, v: i64) -> Result<S::Ok, Error> { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_u8(self, v: u8) -> Result<S::Ok, Error> { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_u16(self, v: u16) -> Result<S::Ok, Error> { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_u32(self, v: u32) -> Result<S::Ok, Error> { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_u64(self, v: u64) -> Result<S::Ok, Error> { - self.sink.serialize_string(v.to_string()) + self.serialize_integer(v) } fn serialize_f32(self, v: f32) -> Result<S::Ok, Error> { @@ -207,3 +208,14 @@ impl<S: Sink> ser::Serializer for PartSerializer<S> { Err(self.sink.unsupported()) } } + +impl<S: Sink> PartSerializer<S> { + fn serialize_integer<I>(self, value: I) -> Result<S::Ok, Error> + 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) + } +} |