diff options
| author | bors <bors@rust-lang.org> | 2015-10-08 17:19:59 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-10-08 17:19:59 +0000 |
| commit | 64c4b51dd6771a0dd61639092ae5b349082b6eb0 (patch) | |
| tree | 224bb02b8d7e31e1d7d1631c2e08d7d3ec392c75 /src/libcore/num | |
| parent | 95285c496f58a326eace11bddb25a7ce7adcfe44 (diff) | |
| parent | 123a83326fb95366e94a3be1a74775df4db97739 (diff) | |
| download | rust-64c4b51dd6771a0dd61639092ae5b349082b6eb0.tar.gz rust-64c4b51dd6771a0dd61639092ae5b349082b6eb0.zip | |
Auto merge of #28826 - arthurprs:leading_plus, r=alexcrichton
Closes #27580
Diffstat (limited to 'src/libcore/num')
| -rw-r--r-- | src/libcore/num/mod.rs | 81 |
1 files changed, 41 insertions, 40 deletions
diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index e942e8b6923..340028b4beb 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -1387,50 +1387,51 @@ fn from_str_radix<T: FromStrRadixHelper>(src: &str, radix: u32) // of multi-byte sequences let src = src.as_bytes(); - match (src[0], &src[1..]) { - (b'-', digits) if digits.is_empty() => Err(PIE { kind: Empty }), - (b'-', digits) if is_signed_ty => { - // The number is negative - let mut result = T::from_u32(0); - for &c in digits { - let x = match (c as char).to_digit(radix) { - Some(x) => x, - None => return Err(PIE { kind: InvalidDigit }), - }; - result = match result.checked_mul(radix) { - Some(result) => result, - None => return Err(PIE { kind: Underflow }), - }; - result = match result.checked_sub(x) { - Some(result) => result, - None => return Err(PIE { kind: Underflow }), - }; - } - Ok(result) - }, - (c, digits) => { - // The number is signed - let mut result = match (c as char).to_digit(radix) { - Some(x) => T::from_u32(x), + let (is_positive, digits) = match src[0] { + b'+' => (true, &src[1..]), + b'-' if is_signed_ty => (false, &src[1..]), + _ => (true, src) + }; + + if digits.is_empty() { + return Err(PIE { kind: Empty }); + } + + let mut result = T::from_u32(0); + if is_positive { + // The number is positive + for &c in digits { + let x = match (c as char).to_digit(radix) { + Some(x) => x, None => return Err(PIE { kind: InvalidDigit }), }; - for &c in digits { - let x = match (c as char).to_digit(radix) { - Some(x) => x, - None => return Err(PIE { kind: InvalidDigit }), - }; - result = match result.checked_mul(radix) { - Some(result) => result, - None => return Err(PIE { kind: Overflow }), - }; - result = match result.checked_add(x) { - Some(result) => result, - None => return Err(PIE { kind: Overflow }), - }; - } - Ok(result) + result = match result.checked_mul(radix) { + Some(result) => result, + None => return Err(PIE { kind: Overflow }), + }; + result = match result.checked_add(x) { + Some(result) => result, + None => return Err(PIE { kind: Overflow }), + }; + } + } else { + // The number is negative + for &c in digits { + let x = match (c as char).to_digit(radix) { + Some(x) => x, + None => return Err(PIE { kind: InvalidDigit }), + }; + result = match result.checked_mul(radix) { + Some(result) => result, + None => return Err(PIE { kind: Underflow }), + }; + result = match result.checked_sub(x) { + Some(result) => result, + None => return Err(PIE { kind: Underflow }), + }; } } + Ok(result) } /// An error which can be returned when parsing an integer. |
