@@ -131,6 +131,8 @@ functions.
131
131
issue = "0" ) ]
132
132
133
133
use i16;
134
+ use mem:: MaybeUninit ;
135
+ use { ptr, slice} ;
134
136
pub use self :: decoder:: { decode, DecodableFloat , FullDecoded , Decoded } ;
135
137
136
138
pub mod estimator;
@@ -604,32 +606,32 @@ pub fn to_exact_exp_str<'a, T, F>(mut format_exact: F, v: T,
604
606
/// `[+][0.][0000][2][0000]` with `frac_digits = 10`.
605
607
pub fn to_exact_fixed_str < ' a , T , F > ( mut format_exact : F , v : T ,
606
608
sign : Sign , frac_digits : usize , _upper : bool ,
607
- buf : & ' a mut [ u8 ] , parts : & ' a mut [ Part < ' a > ] ) -> Formatted < ' a >
609
+ buf : & ' a mut [ u8 ] ,
610
+ parts : & ' a mut MaybeUninit < [ Part < ' a > ; 4 ] > ) -> Formatted < ' a >
608
611
where T : DecodableFloat , F : FnMut ( & Decoded , & mut [ u8 ] , i16 ) -> ( usize , i16 ) {
609
- assert ! ( parts. len( ) >= 4 ) ;
610
-
611
612
let ( negative, full_decoded) = decode ( v) ;
612
613
let sign = determine_sign ( sign, & full_decoded, negative) ;
614
+ let parts_head = parts. as_mut_ptr ( ) as * mut Part ;
613
615
match full_decoded {
614
- FullDecoded :: Nan => {
615
- parts [ 0 ] = Part :: Copy ( b"NaN" ) ;
616
- Formatted { sign, parts : & parts [ .. 1 ] }
616
+ FullDecoded :: Nan => unsafe {
617
+ ptr :: write ( parts_head , Part :: Copy ( b"NaN" ) ) ;
618
+ Formatted { sign, parts : slice :: from_raw_parts ( parts_head , 1 ) }
617
619
}
618
- FullDecoded :: Infinite => {
619
- parts [ 0 ] = Part :: Copy ( b"inf" ) ;
620
- Formatted { sign, parts : & parts [ .. 1 ] }
620
+ FullDecoded :: Infinite => unsafe {
621
+ ptr :: write ( parts_head , Part :: Copy ( b"inf" ) ) ;
622
+ Formatted { sign, parts : slice :: from_raw_parts ( parts_head , 1 ) }
621
623
}
622
- FullDecoded :: Zero => {
624
+ FullDecoded :: Zero => unsafe {
623
625
if frac_digits > 0 { // [0.][0000]
624
- parts [ 0 ] = Part :: Copy ( b"0." ) ;
625
- parts [ 1 ] = Part :: Zero ( frac_digits) ;
626
- Formatted { sign, parts : & parts [ .. 2 ] }
626
+ ptr :: write ( parts_head , Part :: Copy ( b"0." ) ) ;
627
+ ptr :: write ( parts_head . offset ( 1 ) , Part :: Zero ( frac_digits) ) ;
628
+ Formatted { sign, parts : slice :: from_raw_parts ( parts_head , 2 ) }
627
629
} else {
628
- parts [ 0 ] = Part :: Copy ( b"0" ) ;
629
- Formatted { sign, parts : & parts [ .. 1 ] }
630
+ ptr :: write ( parts_head , Part :: Copy ( b"0" ) ) ;
631
+ Formatted { sign, parts : slice :: from_raw_parts ( parts_head , 1 ) }
630
632
}
631
633
}
632
- FullDecoded :: Finite ( ref decoded) => {
634
+ FullDecoded :: Finite ( ref decoded) => unsafe {
633
635
let maxlen = estimate_max_buf_len ( decoded. exp ) ;
634
636
assert ! ( buf. len( ) >= maxlen) ;
635
637
@@ -644,18 +646,17 @@ pub fn to_exact_fixed_str<'a, T, F>(mut format_exact: F, v: T,
644
646
// only after the final rounding-up; it's a regular case with `exp = limit + 1`.
645
647
debug_assert_eq ! ( len, 0 ) ;
646
648
if frac_digits > 0 { // [0.][0000]
647
- parts [ 0 ] = Part :: Copy ( b"0." ) ;
648
- parts [ 1 ] = Part :: Zero ( frac_digits) ;
649
- Formatted { sign, parts : & parts [ .. 2 ] }
649
+ ptr :: write ( parts_head , Part :: Copy ( b"0." ) ) ;
650
+ ptr :: write ( parts_head . offset ( 1 ) , Part :: Zero ( frac_digits) ) ;
651
+ Formatted { sign, parts : slice :: from_raw_parts ( parts_head , 2 ) }
650
652
} else {
651
- parts [ 0 ] = Part :: Copy ( b"0" ) ;
652
- Formatted { sign, parts : & parts [ .. 1 ] }
653
+ ptr :: write ( parts_head , Part :: Copy ( b"0" ) ) ;
654
+ Formatted { sign, parts : slice :: from_raw_parts ( parts_head , 2 ) }
653
655
}
654
656
} else {
655
657
Formatted { sign,
656
- parts : digits_to_dec_str ( & buf[ ..len] , exp, frac_digits, parts) }
658
+ parts : digits_to_dec_str ( & buf[ ..len] , exp, frac_digits, parts. get_mut ( ) ) }
657
659
}
658
660
}
659
661
}
660
662
}
661
-
0 commit comments