1
Fork 0

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:
Alex Crichton 2015-04-24 15:58:27 -07:00
parent f3345cb0a7
commit 12910418fb
6 changed files with 22 additions and 47 deletions

View file

@ -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

View file

@ -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)
} }
} }

View file

@ -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()
} }
} }

View file

@ -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.

View file

@ -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.

View file

@ -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::*;