diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-06-28 14:05:10 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-06-30 09:19:25 -0700 |
| commit | d3155faedee97cb916735573fbf067d6305ee730 (patch) | |
| tree | c7fe8365b82802cb8c634500f6444896014e0286 /src/libextra | |
| parent | 8fe6fc11de4d6bfbffd8b961f5f1f24a338601d5 (diff) | |
Specialize to_str_common for floats/integers in strconv
This allows the integral paths to avoid allocations on the heap Closes #4424, #4423
Diffstat (limited to 'src/libextra')
| -rw-r--r-- | src/libextra/terminfo/parm.rs | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/libextra/terminfo/parm.rs b/src/libextra/terminfo/parm.rs index f3edd81f9ac..b7d21ea0ee3 100644 --- a/src/libextra/terminfo/parm.rs +++ b/src/libextra/terminfo/parm.rs @@ -11,7 +11,7 @@ //! Parameterized string expansion use std::{char, vec, util}; -use std::num::strconv::{SignNone,SignNeg,SignAll,DigAll,to_str_bytes_common}; +use std::num::strconv::{SignNone,SignNeg,SignAll,int_to_str_bytes_common}; use std::iterator::IteratorUtil; #[deriving(Eq)] @@ -469,14 +469,20 @@ priv fn format(val: Param, op: FormatOp, flags: Flags) -> Result<~[u8],~str> { FormatHex|FormatHEX => 16, FormatString => util::unreachable() }; - let (s,_) = match op { + let mut s = ~[]; + match op { FormatDigit => { let sign = if flags.sign { SignAll } else { SignNeg }; - to_str_bytes_common(&d, radix, false, sign, DigAll) + do int_to_str_bytes_common(d, radix, sign) |c| { + s.push(c); + } + } + _ => { + do int_to_str_bytes_common(d as uint, radix, SignNone) |c| { + s.push(c); + } } - _ => to_str_bytes_common(&(d as uint), radix, false, SignNone, DigAll) }; - let mut s = s; if flags.precision > s.len() { let mut s_ = vec::with_capacity(flags.precision); let n = flags.precision - s.len(); |
