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() {
|
||||
None => return Err(PFE { kind: Empty }),
|
||||
Some(('-', "")) => return Err(PFE { kind: Empty }),
|
||||
None => return Err(PFE { __kind: Empty }),
|
||||
Some(('-', "")) => return Err(PFE { __kind: Empty }),
|
||||
Some(('-', src)) => (false, src),
|
||||
Some((_, _)) => (true, src),
|
||||
};
|
||||
|
@ -88,7 +88,7 @@ macro_rules! from_str_radix_float_impl {
|
|||
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
|
||||
},
|
||||
_ => {
|
||||
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 {
|
||||
'E' | 'e' if radix == 10 => 10.0,
|
||||
'P' | 'p' if radix == 16 => 2.0,
|
||||
_ => return Err(PFE { kind: Invalid }),
|
||||
_ => return Err(PFE { __kind: Invalid }),
|
||||
};
|
||||
|
||||
// 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)) => (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) {
|
||||
(true, Ok(exp)) => 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
|
||||
|
|
|
@ -1524,7 +1524,11 @@ impl fmt::Display for ParseIntError {
|
|||
|
||||
/// An error which can be returned when parsing a float.
|
||||
#[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)]
|
||||
pub enum FloatErrorKind {
|
||||
|
@ -1533,9 +1537,9 @@ pub enum FloatErrorKind {
|
|||
}
|
||||
|
||||
impl ParseFloatError {
|
||||
#[unstable(feature = "core", reason = "available through Error trait")]
|
||||
pub fn description(&self) -> &str {
|
||||
match self.kind {
|
||||
#[doc(hidden)]
|
||||
pub fn __description(&self) -> &str {
|
||||
match self.__kind {
|
||||
FloatErrorKind::Empty => "cannot parse float from empty string",
|
||||
FloatErrorKind::Invalid => "invalid float literal",
|
||||
}
|
||||
|
@ -1545,6 +1549,6 @@ impl ParseFloatError {
|
|||
#[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)
|
||||
self.__description().fmt(f)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -147,7 +147,7 @@ impl Error for num::ParseIntError {
|
|||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl Error for num::ParseFloatError {
|
||||
fn description(&self) -> &str {
|
||||
self.description()
|
||||
self.__description()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@ use core::num;
|
|||
use intrinsics;
|
||||
use libc::c_int;
|
||||
use num::{FpCategory, ParseFloatError};
|
||||
use sys_common::FromInner;
|
||||
|
||||
pub use core::f32::{RADIX, MANTISSA_DIGITS, DIGITS, EPSILON};
|
||||
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
|
||||
#[unstable(feature = "float_from_str_radix", reason = "recently moved API")]
|
||||
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.
|
||||
|
|
|
@ -20,7 +20,6 @@ use core::num;
|
|||
use intrinsics;
|
||||
use libc::c_int;
|
||||
use num::{FpCategory, ParseFloatError};
|
||||
use sys_common::FromInner;
|
||||
|
||||
pub use core::f64::{RADIX, MANTISSA_DIGITS, DIGITS, EPSILON};
|
||||
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
|
||||
#[unstable(feature = "float_from_str_radix", reason = "recently moved API")]
|
||||
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.
|
||||
|
|
|
@ -16,16 +16,14 @@
|
|||
#![stable(feature = "rust1", since = "1.0.0")]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use fmt;
|
||||
use core::num;
|
||||
|
||||
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};
|
||||
|
||||
#[cfg(test)] use ops::{Add, Sub, Mul, Div, Rem};
|
||||
#[cfg(test)] use cmp::PartialEq;
|
||||
#[cfg(test)] use fmt;
|
||||
#[cfg(test)] use marker::Copy;
|
||||
#[cfg(test)] use ops::{Add, Sub, Mul, Div, Rem};
|
||||
|
||||
/// Helper function for testing numeric operations
|
||||
#[cfg(test)]
|
||||
|
@ -43,31 +41,6 @@ pub fn test_num<T>(ten: T, two: T) where
|
|||
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)]
|
||||
mod tests {
|
||||
use core::prelude::*;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue