Rename and namespace FPCategory

Rename `FPCategory` to `FpCategory` and `Fp* to `*` in order to adhere to the
naming convention

This is a [breaking-change].

Existing code like this:
```
use std::num::{FPCategory, FPNaN};
```
should be adjusted to this:
```
use std::num::FpCategory as Fp
```

In the following code you can use the constants `Fp::Nan`, `Fp::Normal`, etc.
This commit is contained in:
Tobias Bucher 2014-12-22 22:50:57 +01:00
parent 658529467d
commit 16f01cc13f
9 changed files with 59 additions and 56 deletions

View File

@ -18,8 +18,8 @@ use char;
use char::Char; use char::Char;
use fmt; use fmt;
use iter::{range, DoubleEndedIteratorExt}; use iter::{range, DoubleEndedIteratorExt};
use num::{Float, FPNaN, FPInfinite, ToPrimitive}; use num::{cast, Float, ToPrimitive};
use num::cast; use num::FpCategory as Fp;
use ops::FnOnce; use ops::FnOnce;
use result::Result::Ok; use result::Result::Ok;
use slice::{mod, SliceExt}; use slice::{mod, SliceExt};
@ -109,11 +109,11 @@ pub fn float_to_str_bytes_common<T: Float, U, F>(
let _1: T = Float::one(); let _1: T = Float::one();
match num.classify() { match num.classify() {
FPNaN => return f("NaN".as_bytes()), Fp::Nan => return f("NaN".as_bytes()),
FPInfinite if num > _0 => { Fp::Infinite if num > _0 => {
return f("inf".as_bytes()); return f("inf".as_bytes());
} }
FPInfinite if num < _0 => { Fp::Infinite if num < _0 => {
return f("-inf".as_bytes()); return f("-inf".as_bytes());
} }
_ => {} _ => {}

View File

@ -18,7 +18,8 @@
use intrinsics; use intrinsics;
use mem; use mem;
use num::{Float, FPNormal, FPCategory, FPZero, FPSubnormal, FPInfinite, FPNaN}; use num::Float;
use num::FpCategory as Fp;
use num::from_str_radix; use num::from_str_radix;
use option::Option; use option::Option;
@ -156,23 +157,23 @@ impl Float for f32 {
/// Returns `true` if the number is neither zero, infinite, subnormal or NaN. /// Returns `true` if the number is neither zero, infinite, subnormal or NaN.
#[inline] #[inline]
fn is_normal(self) -> bool { fn is_normal(self) -> bool {
self.classify() == FPNormal self.classify() == Fp::Normal
} }
/// Returns the floating point category of the number. If only one property /// Returns the floating point category of the number. If only one property
/// is going to be tested, it is generally faster to use the specific /// is going to be tested, it is generally faster to use the specific
/// predicate instead. /// predicate instead.
fn classify(self) -> FPCategory { fn classify(self) -> Fp {
const EXP_MASK: u32 = 0x7f800000; const EXP_MASK: u32 = 0x7f800000;
const MAN_MASK: u32 = 0x007fffff; const MAN_MASK: u32 = 0x007fffff;
let bits: u32 = unsafe { mem::transmute(self) }; let bits: u32 = unsafe { mem::transmute(self) };
match (bits & MAN_MASK, bits & EXP_MASK) { match (bits & MAN_MASK, bits & EXP_MASK) {
(0, 0) => FPZero, (0, 0) => Fp::Zero,
(_, 0) => FPSubnormal, (_, 0) => Fp::Subnormal,
(0, EXP_MASK) => FPInfinite, (0, EXP_MASK) => Fp::Infinite,
(_, EXP_MASK) => FPNaN, (_, EXP_MASK) => Fp::Nan,
_ => FPNormal, _ => Fp::Normal,
} }
} }

View File

@ -18,7 +18,8 @@
use intrinsics; use intrinsics;
use mem; use mem;
use num::{Float, FPNormal, FPCategory, FPZero, FPSubnormal, FPInfinite, FPNaN}; use num::Float;
use num::FpCategory as Fp;
use num::from_str_radix; use num::from_str_radix;
use option::Option; use option::Option;
@ -164,23 +165,23 @@ impl Float for f64 {
/// Returns `true` if the number is neither zero, infinite, subnormal or NaN. /// Returns `true` if the number is neither zero, infinite, subnormal or NaN.
#[inline] #[inline]
fn is_normal(self) -> bool { fn is_normal(self) -> bool {
self.classify() == FPNormal self.classify() == Fp::Normal
} }
/// Returns the floating point category of the number. If only one property /// Returns the floating point category of the number. If only one property
/// is going to be tested, it is generally faster to use the specific /// is going to be tested, it is generally faster to use the specific
/// predicate instead. /// predicate instead.
fn classify(self) -> FPCategory { fn classify(self) -> Fp {
const EXP_MASK: u64 = 0x7ff0000000000000; const EXP_MASK: u64 = 0x7ff0000000000000;
const MAN_MASK: u64 = 0x000fffffffffffff; const MAN_MASK: u64 = 0x000fffffffffffff;
let bits: u64 = unsafe { mem::transmute(self) }; let bits: u64 = unsafe { mem::transmute(self) };
match (bits & MAN_MASK, bits & EXP_MASK) { match (bits & MAN_MASK, bits & EXP_MASK) {
(0, 0) => FPZero, (0, 0) => Fp::Zero,
(_, 0) => FPSubnormal, (_, 0) => Fp::Subnormal,
(0, EXP_MASK) => FPInfinite, (0, EXP_MASK) => Fp::Infinite,
(_, EXP_MASK) => FPNaN, (_, EXP_MASK) => Fp::Nan,
_ => FPNormal, _ => Fp::Normal,
} }
} }

View File

@ -15,8 +15,6 @@
#![stable] #![stable]
#![allow(missing_docs)] #![allow(missing_docs)]
pub use self::FPCategory::*;
use {int, i8, i16, i32, i64}; use {int, i8, i16, i32, i64};
use {uint, u8, u16, u32, u64}; use {uint, u8, u16, u32, u64};
use {f32, f64}; use {f32, f64};
@ -1222,17 +1220,17 @@ impl_num_cast! { f64, to_f64 }
/// Used for representing the classification of floating point numbers /// Used for representing the classification of floating point numbers
#[deriving(Copy, PartialEq, Show)] #[deriving(Copy, PartialEq, Show)]
#[unstable = "may be renamed"] #[unstable = "may be renamed"]
pub enum FPCategory { pub enum FpCategory {
/// "Not a Number", often obtained by dividing by zero /// "Not a Number", often obtained by dividing by zero
FPNaN, Nan,
/// Positive or negative infinity /// Positive or negative infinity
FPInfinite , Infinite ,
/// Positive or negative zero /// Positive or negative zero
FPZero, Zero,
/// De-normalized floating point representation (less precise than `FPNormal`) /// De-normalized floating point representation (less precise than `Normal`)
FPSubnormal, Subnormal,
/// A regular floating point number /// A regular floating point number
FPNormal, Normal,
} }
/// A built-in floating point number. /// A built-in floating point number.
@ -1277,7 +1275,7 @@ pub trait Float
/// Returns true if this number is neither zero, infinite, denormal, or NaN. /// Returns true if this number is neither zero, infinite, denormal, or NaN.
fn is_normal(self) -> bool; fn is_normal(self) -> bool;
/// Returns the category that this number falls into. /// Returns the category that this number falls into.
fn classify(self) -> FPCategory; fn classify(self) -> FpCategory;
// FIXME (#5527): These should be associated constants // FIXME (#5527): These should be associated constants

View File

@ -201,8 +201,9 @@ use std;
use std::collections::{HashMap, BTreeMap}; use std::collections::{HashMap, BTreeMap};
use std::{char, f64, fmt, io, num, str}; use std::{char, f64, fmt, io, num, str};
use std::mem::{swap, transmute}; use std::mem::{swap, transmute};
use std::num::{Float, FPNaN, FPInfinite, Int}; use std::num::{Float, Int};
use std::str::{FromStr}; use std::num::FpCategory as Fp;
use std::str::FromStr;
use std::string; use std::string;
use std::ops; use std::ops;
use unicode::str as unicode_str; use unicode::str as unicode_str;
@ -414,7 +415,7 @@ fn spaces(wr: &mut io::Writer, mut n: uint) -> Result<(), io::IoError> {
fn fmt_number_or_null(v: f64) -> string::String { fn fmt_number_or_null(v: f64) -> string::String {
match v.classify() { match v.classify() {
FPNaN | FPInfinite => string::String::from_str("null"), Fp::Nan | Fp::Infinite => string::String::from_str("null"),
_ if v.fract() != 0f64 => f64::to_str_digits(v, 6u), _ if v.fract() != 0f64 => f64::to_str_digits(v, 6u),
_ => f64::to_str_digits(v, 6u) + ".0", _ => f64::to_str_digits(v, 6u) + ".0",
} }
@ -2332,7 +2333,7 @@ impl ToJson for f32 {
impl ToJson for f64 { impl ToJson for f64 {
fn to_json(&self) -> Json { fn to_json(&self) -> Json {
match self.classify() { match self.classify() {
FPNaN | FPInfinite => Json::Null, Fp::Nan | Fp::Infinite => Json::Null,
_ => Json::F64(*self) _ => Json::F64(*self)
} }
} }

View File

@ -351,6 +351,7 @@ pub fn to_str_exp_digits(num: f32, dig: uint, upper: bool) -> String {
mod tests { mod tests {
use f32::*; use f32::*;
use num::*; use num::*;
use num::FpCategory as Fp;
#[test] #[test]
fn test_min_nan() { fn test_min_nan() {
@ -620,14 +621,14 @@ mod tests {
let neg_inf: f32 = Float::neg_infinity(); let neg_inf: f32 = Float::neg_infinity();
let zero: f32 = Float::zero(); let zero: f32 = Float::zero();
let neg_zero: f32 = Float::neg_zero(); let neg_zero: f32 = Float::neg_zero();
assert_eq!(nan.classify(), FPNaN); assert_eq!(nan.classify(), Fp::Nan);
assert_eq!(inf.classify(), FPInfinite); assert_eq!(inf.classify(), Fp::Infinite);
assert_eq!(neg_inf.classify(), FPInfinite); assert_eq!(neg_inf.classify(), Fp::Infinite);
assert_eq!(zero.classify(), FPZero); assert_eq!(zero.classify(), Fp::Zero);
assert_eq!(neg_zero.classify(), FPZero); assert_eq!(neg_zero.classify(), Fp::Zero);
assert_eq!(1f32.classify(), FPNormal); assert_eq!(1f32.classify(), Fp::Normal);
assert_eq!(1e-37f32.classify(), FPNormal); assert_eq!(1e-37f32.classify(), Fp::Normal);
assert_eq!(1e-38f32.classify(), FPSubnormal); assert_eq!(1e-38f32.classify(), Fp::Subnormal);
} }
#[test] #[test]

View File

@ -359,6 +359,7 @@ pub fn to_str_exp_digits(num: f64, dig: uint, upper: bool) -> String {
mod tests { mod tests {
use f64::*; use f64::*;
use num::*; use num::*;
use num::FpCategory as Fp;
#[test] #[test]
fn test_min_nan() { fn test_min_nan() {
@ -623,13 +624,13 @@ mod tests {
let neg_inf: f64 = Float::neg_infinity(); let neg_inf: f64 = Float::neg_infinity();
let zero: f64 = Float::zero(); let zero: f64 = Float::zero();
let neg_zero: f64 = Float::neg_zero(); let neg_zero: f64 = Float::neg_zero();
assert_eq!(nan.classify(), FPNaN); assert_eq!(nan.classify(), Fp::Nan);
assert_eq!(inf.classify(), FPInfinite); assert_eq!(inf.classify(), Fp::Infinite);
assert_eq!(neg_inf.classify(), FPInfinite); assert_eq!(neg_inf.classify(), Fp::Infinite);
assert_eq!(zero.classify(), FPZero); assert_eq!(zero.classify(), Fp::Zero);
assert_eq!(neg_zero.classify(), FPZero); assert_eq!(neg_zero.classify(), Fp::Zero);
assert_eq!(1e-307f64.classify(), FPNormal); assert_eq!(1e-307f64.classify(), Fp::Normal);
assert_eq!(1e-308f64.classify(), FPSubnormal); assert_eq!(1e-308f64.classify(), Fp::Subnormal);
} }
#[test] #[test]

View File

@ -31,8 +31,7 @@ pub use core::num::{from_int, from_i8, from_i16, from_i32, from_i64};
pub use core::num::{from_uint, from_u8, from_u16, from_u32, from_u64}; pub use core::num::{from_uint, from_u8, from_u16, from_u32, from_u64};
pub use core::num::{from_f32, from_f64}; pub use core::num::{from_f32, from_f64};
pub use core::num::{FromStrRadix, from_str_radix}; pub use core::num::{FromStrRadix, from_str_radix};
pub use core::num::{FPCategory, FPNaN, FPInfinite, FPZero, FPSubnormal}; pub use core::num::{FpCategory, Float};
pub use core::num::{FPNormal, Float};
#[experimental = "may be removed or relocated"] #[experimental = "may be removed or relocated"]
pub mod strconv; pub mod strconv;

View File

@ -17,7 +17,8 @@ use self::SignificantDigits::*;
use self::SignFormat::*; use self::SignFormat::*;
use char::{mod, Char}; use char::{mod, Char};
use num::{mod, Int, Float, FPNaN, FPInfinite, ToPrimitive}; use num::{mod, Int, Float, ToPrimitive};
use num::FpCategory as Fp;
use ops::FnMut; use ops::FnMut;
use slice::{SliceExt, CloneSliceExt}; use slice::{SliceExt, CloneSliceExt};
use str::StrExt; use str::StrExt;
@ -199,14 +200,14 @@ pub fn float_to_str_bytes_common<T: Float>(
let _1: T = Float::one(); let _1: T = Float::one();
match num.classify() { match num.classify() {
FPNaN => { return (b"NaN".to_vec(), true); } Fp::Nan => { return (b"NaN".to_vec(), true); }
FPInfinite if num > _0 => { Fp::Infinite if num > _0 => {
return match sign { return match sign {
SignAll => (b"+inf".to_vec(), true), SignAll => (b"+inf".to_vec(), true),
_ => (b"inf".to_vec(), true) _ => (b"inf".to_vec(), true)
}; };
} }
FPInfinite if num < _0 => { Fp::Infinite if num < _0 => {
return match sign { return match sign {
SignNone => (b"inf".to_vec(), true), SignNone => (b"inf".to_vec(), true),
_ => (b"-inf".to_vec(), true), _ => (b"-inf".to_vec(), true),