Skip to content

Commit 4105b29

Browse files
committed
writer::num
1 parent 62bb185 commit 4105b29

File tree

3 files changed

+100
-14
lines changed

3 files changed

+100
-14
lines changed

src/serialize/writer/formatter.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
// SPDX-License-Identifier: MPL-2.0
2-
// Copyright ijl (2022-2025)
2+
// Copyright ijl (2022-2026)
33
// This is an adaptation of `src/value/ser.rs` from serde-json.
44

5+
use super::{
6+
write_float32, write_float64, write_integer_i32, write_integer_i64, write_integer_u32,
7+
write_integer_u64,
8+
};
59
use crate::serialize::writer::WriteExt;
610
use std::io;
711

@@ -43,8 +47,7 @@ pub(crate) trait Formatter {
4347
{
4448
unsafe {
4549
reserve_minimum!(writer);
46-
let len = itoap::write_to_ptr(writer.as_mut_buffer_ptr(), value);
47-
writer.advance_mut(len);
50+
write_integer_i32(writer, value);
4851
}
4952
Ok(())
5053
}
@@ -56,8 +59,7 @@ pub(crate) trait Formatter {
5659
{
5760
unsafe {
5861
reserve_minimum!(writer);
59-
let len = itoap::write_to_ptr(writer.as_mut_buffer_ptr(), value);
60-
writer.advance_mut(len);
62+
write_integer_i64(writer, value);
6163
}
6264
Ok(())
6365
}
@@ -69,8 +71,7 @@ pub(crate) trait Formatter {
6971
{
7072
unsafe {
7173
reserve_minimum!(writer);
72-
let len = itoap::write_to_ptr(writer.as_mut_buffer_ptr(), value);
73-
writer.advance_mut(len);
74+
write_integer_u32(writer, value);
7475
}
7576
Ok(())
7677
}
@@ -82,8 +83,7 @@ pub(crate) trait Formatter {
8283
{
8384
unsafe {
8485
reserve_minimum!(writer);
85-
let len = itoap::write_to_ptr(writer.as_mut_buffer_ptr(), value);
86-
writer.advance_mut(len);
86+
write_integer_u64(writer, value);
8787
}
8888
Ok(())
8989
}
@@ -95,8 +95,7 @@ pub(crate) trait Formatter {
9595
{
9696
unsafe {
9797
reserve_minimum!(writer);
98-
let len = ryu::raw::format32(value, writer.as_mut_buffer_ptr());
99-
writer.advance_mut(len);
98+
write_float32(writer, value);
10099
}
101100
Ok(())
102101
}
@@ -108,8 +107,7 @@ pub(crate) trait Formatter {
108107
{
109108
unsafe {
110109
reserve_minimum!(writer);
111-
let len = ryu::raw::format64(value, writer.as_mut_buffer_ptr());
112-
writer.advance_mut(len);
110+
write_float64(writer, value);
113111
}
114112
Ok(())
115113
}

src/serialize/writer/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
// SPDX-License-Identifier: MPL-2.0
2-
// Copyright ijl (2024-2025)
2+
// Copyright ijl (2024-2026)
33

44
mod byteswriter;
55
mod formatter;
66
mod json;
7+
mod num;
78
mod str;
89

910
pub(crate) use byteswriter::{BytesWriter, WriteExt};
1011
pub(crate) use json::{set_str_formatter_fn, to_writer, to_writer_pretty};
12+
pub(crate) use num::{
13+
write_float32, write_float64, write_integer_i32, write_integer_i64, write_integer_u32,
14+
write_integer_u64,
15+
};

src/serialize/writer/num.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// SPDX-License-Identifier: MPL-2.0
2+
// Copyright ijl (2026)
3+
4+
use crate::serialize::writer::WriteExt;
5+
use bytes::BufMut;
6+
7+
#[inline]
8+
pub(crate) fn write_integer_u32<B>(buf: &mut B, val: u32)
9+
where
10+
B: ?Sized + WriteExt + BufMut,
11+
{
12+
write_integer(buf, val)
13+
}
14+
15+
#[inline]
16+
pub(crate) fn write_integer_i32<B>(buf: &mut B, val: i32)
17+
where
18+
B: ?Sized + WriteExt + BufMut,
19+
{
20+
write_integer(buf, val)
21+
}
22+
23+
#[inline]
24+
pub(crate) fn write_integer_u64<B>(buf: &mut B, val: u64)
25+
where
26+
B: ?Sized + WriteExt + BufMut,
27+
{
28+
write_integer(buf, val)
29+
}
30+
31+
#[inline]
32+
pub(crate) fn write_integer_i64<B>(buf: &mut B, val: i64)
33+
where
34+
B: ?Sized + WriteExt + BufMut,
35+
{
36+
write_integer(buf, val)
37+
}
38+
39+
#[inline]
40+
fn write_integer<B, V: itoap::Integer>(buf: &mut B, val: V)
41+
where
42+
B: ?Sized + WriteExt + BufMut,
43+
{
44+
unsafe {
45+
debug_assert!(buf.remaining_mut() >= 20);
46+
let len = itoap::write_to_ptr(buf.as_mut_buffer_ptr(), val);
47+
buf.advance_mut(len);
48+
}
49+
}
50+
51+
#[inline]
52+
pub(crate) fn write_float32<B>(buf: &mut B, val: f32)
53+
where
54+
B: ?Sized + WriteExt + BufMut,
55+
{
56+
if val.is_infinite() || val.is_nan() {
57+
cold_path!();
58+
buf.put_slice(b"null");
59+
} else {
60+
unsafe {
61+
debug_assert!(buf.remaining_mut() >= 40);
62+
let len = ryu::raw::format32(val, buf.as_mut_buffer_ptr());
63+
buf.advance_mut(len);
64+
}
65+
}
66+
}
67+
68+
#[inline]
69+
pub(crate) fn write_float64<B>(buf: &mut B, val: f64)
70+
where
71+
B: ?Sized + WriteExt + BufMut,
72+
{
73+
if val.is_infinite() || val.is_nan() {
74+
cold_path!();
75+
buf.put_slice(b"null");
76+
} else {
77+
unsafe {
78+
debug_assert!(buf.remaining_mut() >= 40);
79+
let len = ryu::raw::format64(val, buf.as_mut_buffer_ptr());
80+
buf.advance_mut(len);
81+
}
82+
}
83+
}

0 commit comments

Comments
 (0)