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<Self>` workaround for #8888.
- The operator trait constraints are already covered by the `Num` trait.
This commit is contained in:
@@ -554,16 +554,7 @@ impl Bounded for f32 {
|
|||||||
fn max_value() -> f32 { 3.40282347e+38 }
|
fn max_value() -> f32 { 3.40282347e+38 }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Primitive for f32 {
|
impl Primitive for f32 {}
|
||||||
#[inline]
|
|
||||||
fn bits(_: Option<f32>) -> uint { 32 }
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn bytes(_: Option<f32>) -> uint { Primitive::bits(Some(0f32)) / 8 }
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn is_signed(_: Option<f32>) -> bool { true }
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Float for f32 {
|
impl Float for f32 {
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -1173,13 +1164,6 @@ mod tests {
|
|||||||
assert!(!NAN.is_negative());
|
assert!(!NAN.is_negative());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_primitive() {
|
|
||||||
let none: Option<f32> = None;
|
|
||||||
assert_eq!(Primitive::bits(none), mem::size_of::<f32>() * 8);
|
|
||||||
assert_eq!(Primitive::bytes(none), mem::size_of::<f32>());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_is_normal() {
|
fn test_is_normal() {
|
||||||
let nan: f32 = Float::nan();
|
let nan: f32 = Float::nan();
|
||||||
|
|||||||
@@ -556,16 +556,7 @@ impl Bounded for f64 {
|
|||||||
fn max_value() -> f64 { 1.7976931348623157e+308 }
|
fn max_value() -> f64 { 1.7976931348623157e+308 }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Primitive for f64 {
|
impl Primitive for f64 {}
|
||||||
#[inline]
|
|
||||||
fn bits(_: Option<f64>) -> uint { 64 }
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn bytes(_: Option<f64>) -> uint { Primitive::bits(Some(0f64)) / 8 }
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn is_signed(_: Option<f64>) -> bool { true }
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Float for f64 {
|
impl Float for f64 {
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -1178,13 +1169,6 @@ mod tests {
|
|||||||
assert!(!NAN.is_negative());
|
assert!(!NAN.is_negative());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_primitive() {
|
|
||||||
let none: Option<f64> = None;
|
|
||||||
assert_eq!(Primitive::bits(none), mem::size_of::<f64>() * 8);
|
|
||||||
assert_eq!(Primitive::bytes(none), mem::size_of::<f64>());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_is_normal() {
|
fn test_is_normal() {
|
||||||
let nan: f64 = Float::nan();
|
let nan: f64 = Float::nan();
|
||||||
|
|||||||
@@ -361,16 +361,7 @@ impl Bounded for $T {
|
|||||||
|
|
||||||
impl Int for $T {}
|
impl Int for $T {}
|
||||||
|
|
||||||
impl Primitive 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 }
|
|
||||||
}
|
|
||||||
|
|
||||||
// String conversion functions and impl str -> num
|
// String conversion functions and impl str -> num
|
||||||
|
|
||||||
@@ -639,13 +630,6 @@ mod tests {
|
|||||||
assert_eq!((0b010101 as $T).population_count(), 3);
|
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]
|
#[test]
|
||||||
fn test_from_str() {
|
fn test_from_str() {
|
||||||
assert_eq!(from_str::<$T>("0"), Some(0 as $T));
|
assert_eq!(from_str::<$T>("0"), Some(0 as $T));
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
use clone::{Clone, DeepClone};
|
use clone::{Clone, DeepClone};
|
||||||
use cmp::{Eq, Ord};
|
use cmp::{Eq, Ord};
|
||||||
|
use mem::size_of;
|
||||||
use ops::{Add, Sub, Mul, Div, Rem, Neg};
|
use ops::{Add, Sub, Mul, Div, Rem, Neg};
|
||||||
use ops::{Not, BitAnd, BitOr, BitXor, Shl, Shr};
|
use ops::{Not, BitAnd, BitOr, BitXor, Shl, Shr};
|
||||||
use option::{Option, Some, None};
|
use option::{Option, Some, None};
|
||||||
@@ -381,19 +382,7 @@ pub trait Primitive: Clone
|
|||||||
+ Num
|
+ Num
|
||||||
+ NumCast
|
+ NumCast
|
||||||
+ Orderable
|
+ Orderable
|
||||||
+ Bounded
|
+ Bounded {}
|
||||||
+ Neg<Self>
|
|
||||||
+ Add<Self,Self>
|
|
||||||
+ Sub<Self,Self>
|
|
||||||
+ Mul<Self,Self>
|
|
||||||
+ Div<Self,Self>
|
|
||||||
+ Rem<Self,Self> {
|
|
||||||
// FIXME (#5527): These should be associated constants
|
|
||||||
// FIXME (#8888): Removing `unused_self` requires #8888 to be fixed.
|
|
||||||
fn bits(unused_self: Option<Self>) -> uint;
|
|
||||||
fn bytes(unused_self: Option<Self>) -> uint;
|
|
||||||
fn is_signed(unused_self: Option<Self>) -> bool;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A collection of traits relevant to primitive signed and unsigned integers
|
/// A collection of traits relevant to primitive signed and unsigned integers
|
||||||
pub trait Int: Integer
|
pub trait Int: Integer
|
||||||
@@ -536,7 +525,7 @@ pub trait ToPrimitive {
|
|||||||
macro_rules! impl_to_primitive_int_to_int(
|
macro_rules! impl_to_primitive_int_to_int(
|
||||||
($SrcT:ty, $DstT:ty) => (
|
($SrcT:ty, $DstT:ty) => (
|
||||||
{
|
{
|
||||||
if Primitive::bits(None::<$SrcT>) <= Primitive::bits(None::<$DstT>) {
|
if size_of::<$SrcT>() <= size_of::<$DstT>() {
|
||||||
Some(*self as $DstT)
|
Some(*self as $DstT)
|
||||||
} else {
|
} else {
|
||||||
let n = *self as i64;
|
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(
|
macro_rules! impl_to_primitive_uint_to_uint(
|
||||||
($SrcT:ty, $DstT:ty) => (
|
($SrcT:ty, $DstT:ty) => (
|
||||||
{
|
{
|
||||||
if Primitive::bits(None::<$SrcT>) <= Primitive::bits(None::<$DstT>) {
|
if size_of::<$SrcT>() <= size_of::<$DstT>() {
|
||||||
Some(*self as $DstT)
|
Some(*self as $DstT)
|
||||||
} else {
|
} else {
|
||||||
let zero: $SrcT = Zero::zero();
|
let zero: $SrcT = Zero::zero();
|
||||||
@@ -677,7 +666,7 @@ impl_to_primitive_uint!(u64)
|
|||||||
|
|
||||||
macro_rules! impl_to_primitive_float_to_float(
|
macro_rules! impl_to_primitive_float_to_float(
|
||||||
($SrcT:ty, $DstT:ty) => (
|
($SrcT:ty, $DstT:ty) => (
|
||||||
if Primitive::bits(None::<$SrcT>) <= Primitive::bits(None::<$DstT>) {
|
if size_of::<$SrcT>() <= size_of::<$DstT>() {
|
||||||
Some(*self as $DstT)
|
Some(*self as $DstT)
|
||||||
} else {
|
} else {
|
||||||
let n = *self as f64;
|
let n = *self as f64;
|
||||||
|
|||||||
@@ -285,16 +285,7 @@ impl ToStrRadix for $T {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Primitive 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 Bitwise for $T {
|
impl Bitwise for $T {
|
||||||
/// Counts the number of bits set. Wraps LLVM's `ctpop` intrinsic.
|
/// 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);
|
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]
|
#[test]
|
||||||
pub fn test_to_str() {
|
pub fn test_to_str() {
|
||||||
assert_eq!((0 as $T).to_str_radix(10u), ~"0");
|
assert_eq!((0 as $T).to_str_radix(10u), ~"0");
|
||||||
|
|||||||
Reference in New Issue
Block a user