Skip to content

Commit c3460e6

Browse files
jordenseldruin
andcommitted
ser: use ryu for f32/f64
Co-authored-by: Diego Barrios Romero <[email protected]>
1 parent ee06ac9 commit c3460e6

File tree

3 files changed

+14
-12
lines changed

3 files changed

+14
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
88
## [Unreleased]
99
### Changed
1010
- Floating point numbers terminated by EOF may now be deserialized
11+
- [ryu](https://github.com/dtolnay/ryu) is used to serialize `f32` and `f64`
1112

1213
## [v0.2.0] - 2020-12-11
1314
### Added

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ repository = "https://github.com/rust-embedded-community/serde-json-core"
1212
version = "0.2.0"
1313

1414
[dependencies]
15-
heapless = "0.5.0"
15+
heapless = "0.5.6"
16+
ryu = "1.0.5"
1617

1718
[dependencies.serde]
1819
default-features = false

src/ser/mod.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
//! Serialize a Rust data structure into JSON data
22
3-
use core::{fmt, fmt::Write};
3+
use core::fmt;
44

55
use serde::ser;
66
use serde::ser::SerializeStruct as _;
77

8-
use heapless::{consts::*, String, Vec};
8+
use heapless::{String, Vec};
99

1010
use self::map::SerializeMap;
1111
use self::seq::SerializeSeq;
@@ -147,11 +147,11 @@ macro_rules! serialize_signed {
147147
}};
148148
}
149149

150-
macro_rules! serialize_fmt {
151-
($self:ident, $uxx:ident, $fmt:expr, $v:expr) => {{
152-
let mut s: String<$uxx> = String::new();
153-
write!(&mut s, $fmt, $v).unwrap();
154-
$self.extend_from_slice(s.as_bytes())
150+
macro_rules! serialize_ryu {
151+
($self:ident, $v:expr) => {{
152+
let mut buffer = ryu::Buffer::new();
153+
let printed = buffer.format($v);
154+
$self.extend_from_slice(printed.as_bytes())
155155
}};
156156
}
157157

@@ -229,11 +229,11 @@ impl<'a, 'b: 'a> ser::Serializer for &'a mut Serializer<'b> {
229229
}
230230

231231
fn serialize_f32(self, v: f32) -> Result<Self::Ok> {
232-
serialize_fmt!(self, U16, "{:e}", v)
232+
serialize_ryu!(self, v)
233233
}
234234

235235
fn serialize_f64(self, v: f64) -> Result<Self::Ok> {
236-
serialize_fmt!(self, U32, "{:e}", v)
236+
serialize_ryu!(self, v)
237237
}
238238

239239
fn serialize_char(self, _v: char) -> Result<Self::Ok> {
@@ -683,15 +683,15 @@ mod tests {
683683

684684
assert_eq!(
685685
&*crate::to_string::<N, _>(&Temperature { temperature: -20. }).unwrap(),
686-
r#"{"temperature":-2e1}"#
686+
r#"{"temperature":-20.0}"#
687687
);
688688

689689
assert_eq!(
690690
&*crate::to_string::<N, _>(&Temperature {
691691
temperature: -20345.
692692
})
693693
.unwrap(),
694-
r#"{"temperature":-2.0345e4}"#
694+
r#"{"temperature":-20345.0}"#
695695
);
696696

697697
assert_eq!(

0 commit comments

Comments
 (0)