summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2017-01-29 00:14:57 +0100
committerAnthony Ramine <n.oxyde@gmail.com>2017-01-29 10:22:40 +0100
commit5625c254e55c767a1ec0235219c232f53dcf9e96 (patch)
tree6dc02bbd510eb87aaac46abbd19a0bcd42193033 /src
parent1d88bbb26b9caaa90993845042e21af444e9399a (diff)
Use dtoa to not allocate a String to serialize a float
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs1
-rw-r--r--src/ser/part.rs14
2 files changed, 13 insertions, 2 deletions
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<S: Sink> ser::Serializer for PartSerializer<S> {
}
fn serialize_f32(self, v: f32) -> Result<S::Ok, Error> {
- self.sink.serialize_string(v.to_string())
+ self.serialize_floating(v)
}
fn serialize_f64(self, v: f64) -> Result<S::Ok, Error> {
- self.sink.serialize_string(v.to_string())
+ self.serialize_floating(v)
}
fn serialize_char(self, v: char) -> Result<S::Ok, Error> {
@@ -218,4 +219,13 @@ impl<S: Sink> PartSerializer<S> {
let part = unsafe { str::from_utf8_unchecked(&buf[0..len]) };
ser::Serializer::serialize_str(self, part)
}
+
+ fn serialize_floating<F>(self, value: F) -> Result<S::Ok, Error>
+ 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)
+ }
}