From 472dfe74b32bfa855b70bf8ec59beddbd0514be1 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sat, 18 Jan 2014 08:53:00 +1100 Subject: [PATCH 1/2] Simplify std::num::Primitive trait definition This removes the `Primitive::{bits, bytes, is_signed}` methods and removes the operator trait constraints, for the reasons outlined below: - The `Primitive::{bits, bytes}` associated functions were originally added to reflect the existing `BITS` and `BYTES` statics included in the numeric modules. These statics are only exist as a workaround for Rust's lack of CTFE, and should probably be deprecated in the future in favor of using the `std::mem::size_of` function (see #11621). - `Primitive::is_signed` seems to be of little utility and does not seem to be used anywhere in the Rust compiler or libraries. It is also rather ugly to call due to the `Option` workaround for #8888. - The operator trait constraints are already covered by the `Num` trait. --- src/libstd/num/f32.rs | 18 +----------------- src/libstd/num/f64.rs | 18 +----------------- src/libstd/num/int_macros.rs | 18 +----------------- src/libstd/num/mod.rs | 21 +++++---------------- src/libstd/num/uint_macros.rs | 18 +----------------- 5 files changed, 9 insertions(+), 84 deletions(-) diff --git a/src/libstd/num/f32.rs b/src/libstd/num/f32.rs index a8eaa89565084..6968625356284 100644 --- a/src/libstd/num/f32.rs +++ b/src/libstd/num/f32.rs @@ -554,16 +554,7 @@ impl Bounded for f32 { fn max_value() -> f32 { 3.40282347e+38 } } -impl Primitive for f32 { - #[inline] - fn bits(_: Option) -> uint { 32 } - - #[inline] - fn bytes(_: Option) -> uint { Primitive::bits(Some(0f32)) / 8 } - - #[inline] - fn is_signed(_: Option) -> bool { true } -} +impl Primitive for f32 {} impl Float for f32 { #[inline] @@ -1173,13 +1164,6 @@ mod tests { assert!(!NAN.is_negative()); } - #[test] - fn test_primitive() { - let none: Option = None; - assert_eq!(Primitive::bits(none), mem::size_of::() * 8); - assert_eq!(Primitive::bytes(none), mem::size_of::()); - } - #[test] fn test_is_normal() { let nan: f32 = Float::nan(); diff --git a/src/libstd/num/f64.rs b/src/libstd/num/f64.rs index fe51cb07646ec..bdfb42b4b88dd 100644 --- a/src/libstd/num/f64.rs +++ b/src/libstd/num/f64.rs @@ -556,16 +556,7 @@ impl Bounded for f64 { fn max_value() -> f64 { 1.7976931348623157e+308 } } -impl Primitive for f64 { - #[inline] - fn bits(_: Option) -> uint { 64 } - - #[inline] - fn bytes(_: Option) -> uint { Primitive::bits(Some(0f64)) / 8 } - - #[inline] - fn is_signed(_: Option) -> bool { true } -} +impl Primitive for f64 {} impl Float for f64 { #[inline] @@ -1178,13 +1169,6 @@ mod tests { assert!(!NAN.is_negative()); } - #[test] - fn test_primitive() { - let none: Option = None; - assert_eq!(Primitive::bits(none), mem::size_of::() * 8); - assert_eq!(Primitive::bytes(none), mem::size_of::()); - } - #[test] fn test_is_normal() { let nan: f64 = Float::nan(); diff --git a/src/libstd/num/int_macros.rs b/src/libstd/num/int_macros.rs index add0991f7afb9..80bc24e2d6258 100644 --- a/src/libstd/num/int_macros.rs +++ b/src/libstd/num/int_macros.rs @@ -361,16 +361,7 @@ impl Bounded for $T { impl Int for $T {} -impl Primitive for $T { - #[inline] - fn bits(_: Option<$T>) -> uint { bits } - - #[inline] - fn bytes(_: Option<$T>) -> uint { bits / 8 } - - #[inline] - fn is_signed(_: Option<$T>) -> bool { true } -} +impl Primitive for $T {} // String conversion functions and impl str -> num @@ -639,13 +630,6 @@ mod tests { assert_eq!((0b010101 as $T).population_count(), 3); } - #[test] - fn test_primitive() { - let none: Option<$T> = None; - assert_eq!(Primitive::bits(none), mem::size_of::<$T>() * 8); - assert_eq!(Primitive::bytes(none), mem::size_of::<$T>()); - } - #[test] fn test_from_str() { assert_eq!(from_str::<$T>("0"), Some(0 as $T)); diff --git a/src/libstd/num/mod.rs b/src/libstd/num/mod.rs index 05f21c7d44804..ab2604ee196bb 100644 --- a/src/libstd/num/mod.rs +++ b/src/libstd/num/mod.rs @@ -17,6 +17,7 @@ use clone::{Clone, DeepClone}; use cmp::{Eq, Ord}; +use mem::size_of; use ops::{Add, Sub, Mul, Div, Rem, Neg}; use ops::{Not, BitAnd, BitOr, BitXor, Shl, Shr}; use option::{Option, Some, None}; @@ -381,19 +382,7 @@ pub trait Primitive: Clone + Num + NumCast + Orderable - + Bounded - + Neg - + Add - + Sub - + Mul - + Div - + Rem { - // FIXME (#5527): These should be associated constants - // FIXME (#8888): Removing `unused_self` requires #8888 to be fixed. - fn bits(unused_self: Option) -> uint; - fn bytes(unused_self: Option) -> uint; - fn is_signed(unused_self: Option) -> bool; -} + + Bounded {} /// A collection of traits relevant to primitive signed and unsigned integers pub trait Int: Integer @@ -536,7 +525,7 @@ pub trait ToPrimitive { macro_rules! impl_to_primitive_int_to_int( ($SrcT:ty, $DstT:ty) => ( { - if Primitive::bits(None::<$SrcT>) <= Primitive::bits(None::<$DstT>) { + if size_of::<$SrcT>() <= size_of::<$DstT>() { Some(*self as $DstT) } else { let n = *self as i64; @@ -621,7 +610,7 @@ macro_rules! impl_to_primitive_uint_to_int( macro_rules! impl_to_primitive_uint_to_uint( ($SrcT:ty, $DstT:ty) => ( { - if Primitive::bits(None::<$SrcT>) <= Primitive::bits(None::<$DstT>) { + if size_of::<$SrcT>() <= size_of::<$DstT>() { Some(*self as $DstT) } else { let zero: $SrcT = Zero::zero(); @@ -677,7 +666,7 @@ impl_to_primitive_uint!(u64) macro_rules! impl_to_primitive_float_to_float( ($SrcT:ty, $DstT:ty) => ( - if Primitive::bits(None::<$SrcT>) <= Primitive::bits(None::<$DstT>) { + if size_of::<$SrcT>() <= size_of::<$DstT>() { Some(*self as $DstT) } else { let n = *self as f64; diff --git a/src/libstd/num/uint_macros.rs b/src/libstd/num/uint_macros.rs index 97e547a2d4280..1b822a491c6f3 100644 --- a/src/libstd/num/uint_macros.rs +++ b/src/libstd/num/uint_macros.rs @@ -285,16 +285,7 @@ impl ToStrRadix for $T { } } -impl Primitive for $T { - #[inline] - fn bits(_: Option<$T>) -> uint { bits } - - #[inline] - fn bytes(_: Option<$T>) -> uint { bits / 8 } - - #[inline] - fn is_signed(_: Option<$T>) -> bool { false } -} +impl Primitive for $T {} impl Bitwise for $T { /// Counts the number of bits set. Wraps LLVM's `ctpop` intrinsic. @@ -415,13 +406,6 @@ mod tests { assert_eq!((0b010101 as $T).population_count(), 3); } - #[test] - fn test_primitive() { - let none: Option<$T> = None; - assert_eq!(Primitive::bits(none), mem::size_of::<$T>() * 8); - assert_eq!(Primitive::bytes(none), mem::size_of::<$T>()); - } - #[test] pub fn test_to_str() { assert_eq!((0 as $T).to_str_radix(10u), ~"0"); From f125b71c0081acebbfcdd60bfe517d7e4dd388d4 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sat, 18 Jan 2014 08:54:13 +1100 Subject: [PATCH 2/2] Add FIXME comments regarding issue #11526. --- src/libstd/num/f32.rs | 7 +++++++ src/libstd/num/f64.rs | 7 +++++++ src/libstd/num/int_macros.rs | 8 ++++++++ 3 files changed, 22 insertions(+) diff --git a/src/libstd/num/f32.rs b/src/libstd/num/f32.rs index 6968625356284..6eb964944201e 100644 --- a/src/libstd/num/f32.rs +++ b/src/libstd/num/f32.rs @@ -96,6 +96,9 @@ delegate!( fn tanh(n: c_float) -> c_float = cmath::c_float::tanh ) +// FIXME(#11621): These constants should be deprecated once CTFE is implemented +// in favour of calling their respective functions in `Bounded` and `Float`. + pub static RADIX: uint = 2u; pub static MANTISSA_DIGITS: uint = 53u; @@ -122,6 +125,10 @@ pub static NEG_INFINITY: f32 = -1.0_f32/0.0_f32; pub mod consts { // FIXME (requires Issue #1433 to fix): replace with mathematical // staticants from cmath. + + // FIXME(#11621): These constants should be deprecated once CTFE is + // implemented in favour of calling their respective functions in `Real`. + /// Archimedes' constant pub static PI: f32 = 3.14159265358979323846264338327950288_f32; diff --git a/src/libstd/num/f64.rs b/src/libstd/num/f64.rs index bdfb42b4b88dd..32fe1391db454 100644 --- a/src/libstd/num/f64.rs +++ b/src/libstd/num/f64.rs @@ -101,6 +101,9 @@ delegate!( // FIXME (#1433): obtain these in a different way +// FIXME(#11621): These constants should be deprecated once CTFE is implemented +// in favour of calling their respective functions in `Bounded` and `Float`. + pub static RADIX: uint = 2u; pub static MANTISSA_DIGITS: uint = 53u; @@ -129,6 +132,10 @@ pub static NEG_INFINITY: f64 = -1.0_f64/0.0_f64; pub mod consts { // FIXME (requires Issue #1433 to fix): replace with mathematical // constants from cmath. + + // FIXME(#11621): These constants should be deprecated once CTFE is + // implemented in favour of calling their respective functions in `Real`. + /// Archimedes' constant pub static PI: f64 = 3.14159265358979323846264338327950288_f64; diff --git a/src/libstd/num/int_macros.rs b/src/libstd/num/int_macros.rs index 80bc24e2d6258..7102a8997584e 100644 --- a/src/libstd/num/int_macros.rs +++ b/src/libstd/num/int_macros.rs @@ -13,11 +13,19 @@ macro_rules! int_module (($T:ty, $bits:expr) => ( +// FIXME(#11621): Should be deprecated once CTFE is implemented in favour of +// calling the `mem::size_of` function. pub static bits : uint = $bits; +// FIXME(#11621): Should be deprecated once CTFE is implemented in favour of +// calling the `mem::size_of` function. pub static bytes : uint = ($bits / 8); +// FIXME(#11621): Should be deprecated once CTFE is implemented in favour of +// calling the `Bounded::min_value` function. pub static min_value: $T = (-1 as $T) << (bits - 1); // FIXME(#9837): Compute min_value like this so the high bits that shouldn't exist are 0. +// FIXME(#11621): Should be deprecated once CTFE is implemented in favour of +// calling the `Bounded::max_value` function. pub static max_value: $T = !min_value; impl CheckedDiv for $T {