rust-sen/sehn/src/se/base/real/fast.rs

47 lines
1.1 KiB
Rust

use core::fmt::Write as FmtWrite;
use crate::se::{Write, SerializerError};
use super::{
dec_buf::DecBuf,
RealSerializer,
PrimitiveRealSerializer
};
macro_rules! impl_write_real_int_for_fast_serializer {
($($prim:ident)*) => {
$(impl PrimitiveRealSerializer<$prim> for FastRealSerializer {
fn serialize_real<W: Write>(out: &mut W, r: $prim) -> Result<(), W::Error> {
let mut buf = itoa::Buffer::new();
let real_str = buf.format(r);
out.write(real_str.as_bytes())
}
})*
}
}
macro_rules! impl_write_real_float_for_fast_serializer {
($($prim:ident)*) => {
$(impl PrimitiveRealSerializer<$prim> for FastRealSerializer {
fn serialize_real<W: Write>(out: &mut W, r: $prim) -> Result<(), W::Error> {
let mut buf = DecBuf::new();
write!(buf, "{}", r).map_err(|_|
SerializerError::Unexpected("failed to format real")
)?;
out.write(buf.as_bytes())
}
})*
}
}
pub struct FastRealSerializer;
impl_write_real_int_for_fast_serializer!(
u8 u16 u32 u64
i8 i16 i32 i64
);
impl_write_real_float_for_fast_serializer!(
f32
f64
);
impl RealSerializer for FastRealSerializer {}