summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2017-01-28 23:56:15 +0100
committerAnthony Ramine <n.oxyde@gmail.com>2017-01-29 10:22:39 +0100
commit1d88bbb26b9caaa90993845042e21af444e9399a (patch)
tree598348627d8992330406ab6414ffd0cadf8d696f
parente140c2b5c5bb5abab7fcc6a9d4540aaa3bf566a6 (diff)
Use itoa to not allocate a String to serialize an integer
-rw-r--r--Cargo.toml1
-rw-r--r--src/lib.rs1
-rw-r--r--src/ser/part.rs28
3 files changed, 22 insertions, 8 deletions
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<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)
+ }
+}