std: Don't use a wrapper for the float error type
Ensures that the same error type is propagated throughout. Unnecessary leakage of the internals is prevented through the usage of stability attributes. Closes #24748
This commit is contained in:
parent
f3345cb0a7
commit
12910418fb
6 changed files with 22 additions and 47 deletions
|
@ -35,8 +35,8 @@ macro_rules! from_str_radix_float_impl {
|
||||||
}
|
}
|
||||||
|
|
||||||
let (is_positive, src) = match src.slice_shift_char() {
|
let (is_positive, src) = match src.slice_shift_char() {
|
||||||
None => return Err(PFE { kind: Empty }),
|
None => return Err(PFE { __kind: Empty }),
|
||||||
Some(('-', "")) => return Err(PFE { kind: Empty }),
|
Some(('-', "")) => return Err(PFE { __kind: Empty }),
|
||||||
Some(('-', src)) => (false, src),
|
Some(('-', src)) => (false, src),
|
||||||
Some((_, _)) => (true, src),
|
Some((_, _)) => (true, src),
|
||||||
};
|
};
|
||||||
|
@ -88,7 +88,7 @@ macro_rules! from_str_radix_float_impl {
|
||||||
break; // start of fractional part
|
break; // start of fractional part
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
return Err(PFE { kind: Invalid });
|
return Err(PFE { __kind: Invalid });
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -122,7 +122,7 @@ macro_rules! from_str_radix_float_impl {
|
||||||
break; // start of exponent
|
break; // start of exponent
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
return Err(PFE { kind: Invalid });
|
return Err(PFE { __kind: Invalid });
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -135,7 +135,7 @@ macro_rules! from_str_radix_float_impl {
|
||||||
let base = match c {
|
let base = match c {
|
||||||
'E' | 'e' if radix == 10 => 10.0,
|
'E' | 'e' if radix == 10 => 10.0,
|
||||||
'P' | 'p' if radix == 16 => 2.0,
|
'P' | 'p' if radix == 16 => 2.0,
|
||||||
_ => return Err(PFE { kind: Invalid }),
|
_ => return Err(PFE { __kind: Invalid }),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Parse the exponent as decimal integer
|
// Parse the exponent as decimal integer
|
||||||
|
@ -144,13 +144,13 @@ macro_rules! from_str_radix_float_impl {
|
||||||
Some(('-', src)) => (false, src.parse::<usize>()),
|
Some(('-', src)) => (false, src.parse::<usize>()),
|
||||||
Some(('+', src)) => (true, src.parse::<usize>()),
|
Some(('+', src)) => (true, src.parse::<usize>()),
|
||||||
Some((_, _)) => (true, src.parse::<usize>()),
|
Some((_, _)) => (true, src.parse::<usize>()),
|
||||||
None => return Err(PFE { kind: Invalid }),
|
None => return Err(PFE { __kind: Invalid }),
|
||||||
};
|
};
|
||||||
|
|
||||||
match (is_positive, exp) {
|
match (is_positive, exp) {
|
||||||
(true, Ok(exp)) => base.powi(exp as i32),
|
(true, Ok(exp)) => base.powi(exp as i32),
|
||||||
(false, Ok(exp)) => 1.0 / base.powi(exp as i32),
|
(false, Ok(exp)) => 1.0 / base.powi(exp as i32),
|
||||||
(_, Err(_)) => return Err(PFE { kind: Invalid }),
|
(_, Err(_)) => return Err(PFE { __kind: Invalid }),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
None => 1.0, // no exponent
|
None => 1.0, // no exponent
|
||||||
|
|
|
@ -1524,7 +1524,11 @@ impl fmt::Display for ParseIntError {
|
||||||
|
|
||||||
/// An error which can be returned when parsing a float.
|
/// An error which can be returned when parsing a float.
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub struct ParseFloatError { pub kind: FloatErrorKind }
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
pub struct ParseFloatError {
|
||||||
|
#[doc(hidden)]
|
||||||
|
pub __kind: FloatErrorKind
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub enum FloatErrorKind {
|
pub enum FloatErrorKind {
|
||||||
|
@ -1533,9 +1537,9 @@ pub enum FloatErrorKind {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ParseFloatError {
|
impl ParseFloatError {
|
||||||
#[unstable(feature = "core", reason = "available through Error trait")]
|
#[doc(hidden)]
|
||||||
pub fn description(&self) -> &str {
|
pub fn __description(&self) -> &str {
|
||||||
match self.kind {
|
match self.__kind {
|
||||||
FloatErrorKind::Empty => "cannot parse float from empty string",
|
FloatErrorKind::Empty => "cannot parse float from empty string",
|
||||||
FloatErrorKind::Invalid => "invalid float literal",
|
FloatErrorKind::Invalid => "invalid float literal",
|
||||||
}
|
}
|
||||||
|
@ -1545,6 +1549,6 @@ impl ParseFloatError {
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl fmt::Display for ParseFloatError {
|
impl fmt::Display for ParseFloatError {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
self.description().fmt(f)
|
self.__description().fmt(f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -147,7 +147,7 @@ impl Error for num::ParseIntError {
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl Error for num::ParseFloatError {
|
impl Error for num::ParseFloatError {
|
||||||
fn description(&self) -> &str {
|
fn description(&self) -> &str {
|
||||||
self.description()
|
self.__description()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@ use core::num;
|
||||||
use intrinsics;
|
use intrinsics;
|
||||||
use libc::c_int;
|
use libc::c_int;
|
||||||
use num::{FpCategory, ParseFloatError};
|
use num::{FpCategory, ParseFloatError};
|
||||||
use sys_common::FromInner;
|
|
||||||
|
|
||||||
pub use core::f32::{RADIX, MANTISSA_DIGITS, DIGITS, EPSILON};
|
pub use core::f32::{RADIX, MANTISSA_DIGITS, DIGITS, EPSILON};
|
||||||
pub use core::f32::{MIN_EXP, MAX_EXP, MIN_10_EXP};
|
pub use core::f32::{MIN_EXP, MAX_EXP, MIN_10_EXP};
|
||||||
|
@ -77,7 +76,7 @@ impl f32 {
|
||||||
/// Parses a float as with a given radix
|
/// Parses a float as with a given radix
|
||||||
#[unstable(feature = "float_from_str_radix", reason = "recently moved API")]
|
#[unstable(feature = "float_from_str_radix", reason = "recently moved API")]
|
||||||
pub fn from_str_radix(s: &str, radix: u32) -> Result<f32, ParseFloatError> {
|
pub fn from_str_radix(s: &str, radix: u32) -> Result<f32, ParseFloatError> {
|
||||||
num::Float::from_str_radix(s, radix).map_err(FromInner::from_inner)
|
num::Float::from_str_radix(s, radix)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if this value is `NaN` and false otherwise.
|
/// Returns `true` if this value is `NaN` and false otherwise.
|
||||||
|
|
|
@ -20,7 +20,6 @@ use core::num;
|
||||||
use intrinsics;
|
use intrinsics;
|
||||||
use libc::c_int;
|
use libc::c_int;
|
||||||
use num::{FpCategory, ParseFloatError};
|
use num::{FpCategory, ParseFloatError};
|
||||||
use sys_common::FromInner;
|
|
||||||
|
|
||||||
pub use core::f64::{RADIX, MANTISSA_DIGITS, DIGITS, EPSILON};
|
pub use core::f64::{RADIX, MANTISSA_DIGITS, DIGITS, EPSILON};
|
||||||
pub use core::f64::{MIN_EXP, MAX_EXP, MIN_10_EXP};
|
pub use core::f64::{MIN_EXP, MAX_EXP, MIN_10_EXP};
|
||||||
|
@ -85,7 +84,7 @@ impl f64 {
|
||||||
/// Parses a float as with a given radix
|
/// Parses a float as with a given radix
|
||||||
#[unstable(feature = "float_from_str_radix", reason = "recently moved API")]
|
#[unstable(feature = "float_from_str_radix", reason = "recently moved API")]
|
||||||
pub fn from_str_radix(s: &str, radix: u32) -> Result<f64, ParseFloatError> {
|
pub fn from_str_radix(s: &str, radix: u32) -> Result<f64, ParseFloatError> {
|
||||||
num::Float::from_str_radix(s, radix).map_err(FromInner::from_inner)
|
num::Float::from_str_radix(s, radix)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if this value is `NaN` and false otherwise.
|
/// Returns `true` if this value is `NaN` and false otherwise.
|
||||||
|
|
|
@ -16,16 +16,14 @@
|
||||||
#![stable(feature = "rust1", since = "1.0.0")]
|
#![stable(feature = "rust1", since = "1.0.0")]
|
||||||
#![allow(missing_docs)]
|
#![allow(missing_docs)]
|
||||||
|
|
||||||
use fmt;
|
|
||||||
use core::num;
|
|
||||||
|
|
||||||
pub use core::num::{Zero, One};
|
pub use core::num::{Zero, One};
|
||||||
pub use core::num::{FpCategory, ParseIntError};
|
pub use core::num::{FpCategory, ParseIntError, ParseFloatError};
|
||||||
pub use core::num::{wrapping, Wrapping};
|
pub use core::num::{wrapping, Wrapping};
|
||||||
|
|
||||||
#[cfg(test)] use ops::{Add, Sub, Mul, Div, Rem};
|
|
||||||
#[cfg(test)] use cmp::PartialEq;
|
#[cfg(test)] use cmp::PartialEq;
|
||||||
|
#[cfg(test)] use fmt;
|
||||||
#[cfg(test)] use marker::Copy;
|
#[cfg(test)] use marker::Copy;
|
||||||
|
#[cfg(test)] use ops::{Add, Sub, Mul, Div, Rem};
|
||||||
|
|
||||||
/// Helper function for testing numeric operations
|
/// Helper function for testing numeric operations
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -43,31 +41,6 @@ pub fn test_num<T>(ten: T, two: T) where
|
||||||
assert_eq!(ten.rem(two), ten % two);
|
assert_eq!(ten.rem(two), ten % two);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An error which can be returned when parsing a float.
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
|
||||||
pub struct ParseFloatError { inner: num::ParseFloatError }
|
|
||||||
|
|
||||||
impl ::sys_common::FromInner<num::ParseFloatError> for ParseFloatError {
|
|
||||||
fn from_inner(inner: num::ParseFloatError) -> ParseFloatError {
|
|
||||||
ParseFloatError { inner: inner }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ParseFloatError {
|
|
||||||
#[unstable(feature = "core", reason = "available through Error trait")]
|
|
||||||
pub fn description(&self) -> &str {
|
|
||||||
self.inner.description()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
|
||||||
impl fmt::Display for ParseFloatError {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
self.description().fmt(f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use core::prelude::*;
|
use core::prelude::*;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue