From 84d6d95e01621281f3e1228a9b35c66086b5fa9e Mon Sep 17 00:00:00 2001 From: Nathan West Date: Wed, 19 Oct 2022 16:26:34 -0400 Subject: [PATCH] Add direct support for i128 and u128 via itoa --- src/ser.rs | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/ser.rs b/src/ser.rs index 64cb00e1a..d3d06c726 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -121,7 +121,7 @@ where serde_if_integer128! { fn serialize_i128(self, value: i128) -> Result<()> { self.formatter - .write_number_str(&mut self.writer, &value.to_string()) + .write_i128(&mut self.writer, value) .map_err(Error::io) } } @@ -165,7 +165,7 @@ where serde_if_integer128! { fn serialize_u128(self, value: u128) -> Result<()> { self.formatter - .write_number_str(&mut self.writer, &value.to_string()) + .write_u128(&mut self.writer, value) .map_err(Error::io) } } @@ -974,7 +974,7 @@ where tri!(self .ser .formatter - .write_number_str(&mut self.ser.writer, &value.to_string()) + .write_i128(&mut self.ser.writer, value) .map_err(Error::io)); tri!(self .ser @@ -1071,7 +1071,7 @@ where tri!(self .ser .formatter - .write_number_str(&mut self.ser.writer, &value.to_string()) + .write_u128(&mut self.ser.writer, value) .map_err(Error::io)); tri!(self .ser @@ -1661,6 +1661,17 @@ pub trait Formatter { writer.write_all(s.as_bytes()) } + /// Writes an integer value like `123` to the specified writer. + #[inline] + fn write_i128(&mut self, writer: &mut W, value: i128) -> io::Result<()> + where + W: ?Sized + io::Write, + { + let mut buffer = itoa::Buffer::new(); + let s = buffer.format(value); + writer.write_all(s.as_bytes()) + } + /// Writes an integer value like `123` to the specified writer. #[inline] fn write_u8(&mut self, writer: &mut W, value: u8) -> io::Result<()> @@ -1705,6 +1716,17 @@ pub trait Formatter { writer.write_all(s.as_bytes()) } + /// Writes an integer value like `123` to the specified writer. + #[inline] + fn write_u128(&mut self, writer: &mut W, value: u128) -> io::Result<()> + where + W: ?Sized + io::Write, + { + let mut buffer = itoa::Buffer::new(); + let s = buffer.format(value); + writer.write_all(s.as_bytes()) + } + /// Writes a floating point value like `-31.26e+12` to the specified writer. #[inline] fn write_f32(&mut self, writer: &mut W, value: f32) -> io::Result<()>