Use dtoa to not allocate a String to serialize a float
This commit is contained in:
parent
1d88bbb26b
commit
5625c254e5
@ -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"
|
||||
|
@ -1,6 +1,7 @@
|
||||
//! `x-www-form-urlencoded` meets Serde
|
||||
|
||||
extern crate itoa;
|
||||
extern crate dtoa;
|
||||
#[macro_use]
|
||||
extern crate serde;
|
||||
extern crate url;
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user