diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2017-01-29 00:14:57 +0100 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2017-01-29 10:22:40 +0100 |
commit | 5625c254e55c767a1ec0235219c232f53dcf9e96 (patch) | |
tree | 6dc02bbd510eb87aaac46abbd19a0bcd42193033 /src | |
parent | 1d88bbb26b9caaa90993845042e21af444e9399a (diff) |
Use dtoa to not allocate a String to serialize a float
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 1 | ||||
-rw-r--r-- | src/ser/part.rs | 14 |
2 files changed, 13 insertions, 2 deletions
@@ -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) + } } |