@@ -674,6 +674,40 @@ impl Serialize for net::IpAddr {
674674 }
675675}
676676
677+ #[ inline]
678+ fn format_u8 ( mut v : u8 , out : & mut [ u8 ] ) -> usize {
679+ assert ! ( out. len( ) >= 3 ) ;
680+ let mut written = 0 ;
681+ let hundreds = v / 100 ;
682+ v -= 100 * hundreds;
683+ let tens = v / 10 ;
684+ v -= 10 * tens;
685+ let ones = v;
686+ if hundreds > 0 {
687+ out[ written] = b'0' + hundreds;
688+ written += 1 ;
689+ }
690+ if hundreds > 0 || tens > 0 {
691+ out[ written] = b'0' + tens;
692+ written += 1 ;
693+ }
694+ out[ written] = b'0' + ones;
695+ written += 1 ;
696+ written
697+ }
698+
699+ #[ cfg( test) ]
700+ mod format_u8_tests {
701+ #[ test]
702+ fn all ( ) {
703+ for i in 0 ..( u8:: MAX as u16 ) {
704+ let mut buf = [ 0u8 ; 3 ] ;
705+ let written = super :: format_u8 ( i as u8 , & mut buf) ;
706+ assert_eq ! ( i. to_string( ) . as_bytes( ) , & buf[ ..written] ) ;
707+ }
708+ }
709+ }
710+
677711#[ cfg( feature = "std" ) ]
678712impl Serialize for net:: Ipv4Addr {
679713 fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
@@ -683,7 +717,15 @@ impl Serialize for net::Ipv4Addr {
683717 if serializer. is_human_readable ( ) {
684718 const MAX_LEN : usize = 15 ;
685719 debug_assert_eq ! ( MAX_LEN , "101.102.103.104" . len( ) ) ;
686- serialize_display_bounded_length ! ( self , MAX_LEN , serializer)
720+ let mut buf = [ 0u8 ; MAX_LEN ] ;
721+ let mut written = 0 ;
722+ written += format_u8 ( self . octets ( ) [ 0 ] , & mut buf) ;
723+ for oct in & self . octets ( ) [ 1 ..] {
724+ buf[ written] = b'.' ;
725+ written += 1 ;
726+ written += format_u8 ( * oct, & mut buf[ written..] ) ;
727+ }
728+ serializer. serialize_str ( str:: from_utf8 ( & buf[ ..written] ) . unwrap ( ) )
687729 } else {
688730 self . octets ( ) . serialize ( serializer)
689731 }
0 commit comments