From 1dd6906db2e6749bc3f113068e7493070b276feb Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Wed, 15 Jan 2014 11:32:04 +1100 Subject: [PATCH] Merge Bitwise and BitCount traits and remove from prelude, along with Bounded One less trait in std::num, and three less exported in the prelude. --- src/etc/vim/syntax/rust.vim | 3 +-- src/libextra/enum_set.rs | 2 ++ src/libextra/num/bigint.rs | 2 +- src/librustc/util/sha2.rs | 1 + src/librustpkg/sha1.rs | 1 + src/libstd/num/f32.rs | 2 +- src/libstd/num/f64.rs | 2 +- src/libstd/num/i16.rs | 4 ++-- src/libstd/num/i32.rs | 4 ++-- src/libstd/num/i64.rs | 4 ++-- src/libstd/num/i8.rs | 4 ++-- src/libstd/num/int.rs | 6 +++--- src/libstd/num/int_macros.rs | 3 +-- src/libstd/num/mod.rs | 31 +++++++++++++++++-------------- src/libstd/num/u16.rs | 2 +- src/libstd/num/u32.rs | 2 +- src/libstd/num/u64.rs | 2 +- src/libstd/num/u8.rs | 2 +- src/libstd/num/uint.rs | 2 +- src/libstd/num/uint_macros.rs | 5 ++--- src/libstd/prelude.rs | 3 +-- 21 files changed, 45 insertions(+), 42 deletions(-) diff --git a/src/etc/vim/syntax/rust.vim b/src/etc/vim/syntax/rust.vim index 65e7cd061496..fdb978ae7e12 100644 --- a/src/etc/vim/syntax/rust.vim +++ b/src/etc/vim/syntax/rust.vim @@ -83,8 +83,7 @@ syn keyword rustTrait OrdIterator MutableDoubleEndedIterator ExactSize syn keyword rustTrait Times syn keyword rustTrait Algebraic Trigonometric Exponential Hyperbolic -syn keyword rustTrait Bitwise BitCount Bounded -syn keyword rustTrait Integer Fractional Real RealExt +syn keyword rustTrait Bitwise Bounded Integer Fractional Real RealExt syn keyword rustTrait Num NumCast CheckedAdd CheckedSub CheckedMul syn keyword rustTrait Orderable Signed Unsigned Round syn keyword rustTrait Primitive Int Float ToStrRadix ToPrimitive FromPrimitive diff --git a/src/libextra/enum_set.rs b/src/libextra/enum_set.rs index 6fd42f74a767..e04617780758 100644 --- a/src/libextra/enum_set.rs +++ b/src/libextra/enum_set.rs @@ -13,6 +13,8 @@ //! This module defines a container which uses an efficient bit mask //! representation to hold C-like enum variants. +use std::num::Bitwise; + #[deriving(Clone, Eq, IterBytes, ToStr, Encodable, Decodable)] /// A specialized Set implementation to use enum types. pub struct EnumSet { diff --git a/src/libextra/num/bigint.rs b/src/libextra/num/bigint.rs index ed731298b52a..8f491e836b8f 100644 --- a/src/libextra/num/bigint.rs +++ b/src/libextra/num/bigint.rs @@ -22,7 +22,7 @@ A `BigInt` is a combination of `BigUint` and `Sign`. use std::cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater}; use std::num; use std::num::{Zero, One, ToStrRadix, FromStrRadix, Orderable}; -use std::num::{ToPrimitive, FromPrimitive}; +use std::num::{Bitwise, ToPrimitive, FromPrimitive}; use std::rand::Rng; use std::str; use std::uint; diff --git a/src/librustc/util/sha2.rs b/src/librustc/util/sha2.rs index 73d39d8145fc..ee2f7638be98 100644 --- a/src/librustc/util/sha2.rs +++ b/src/librustc/util/sha2.rs @@ -523,6 +523,7 @@ static H256: [u32, ..8] = [ #[cfg(test)] mod tests { use super::{Digest, Sha256, FixedBuffer}; + use std::num::Bounded; use std::vec; use std::rand::isaac::IsaacRng; use std::rand::Rng; diff --git a/src/librustpkg/sha1.rs b/src/librustpkg/sha1.rs index 06970561fac4..909b25fe7563 100644 --- a/src/librustpkg/sha1.rs +++ b/src/librustpkg/sha1.rs @@ -445,6 +445,7 @@ impl Digest for Sha1 { #[cfg(test)] mod tests { + use std::num::Bounded; use std::rand::{IsaacRng, Rng}; use std::vec; use extra::hex::FromHex; diff --git a/src/libstd/num/f32.rs b/src/libstd/num/f32.rs index beecf8a44f63..a8eaa8956508 100644 --- a/src/libstd/num/f32.rs +++ b/src/libstd/num/f32.rs @@ -17,7 +17,7 @@ use cmath; use default::Default; use libc::{c_float, c_int}; use num::{FPCategory, FPNaN, FPInfinite , FPZero, FPSubnormal, FPNormal}; -use num::{Zero, One, strconv}; +use num::{Zero, One, Bounded, strconv}; use num; use to_str; use unstable::intrinsics; diff --git a/src/libstd/num/f64.rs b/src/libstd/num/f64.rs index 6a266c6c59f7..fe51cb07646e 100644 --- a/src/libstd/num/f64.rs +++ b/src/libstd/num/f64.rs @@ -18,7 +18,7 @@ use cmath; use default::Default; use libc::{c_double, c_int}; use num::{FPCategory, FPNaN, FPInfinite , FPZero, FPSubnormal, FPNormal}; -use num::{Zero, One, strconv}; +use num::{Zero, One, Bounded, strconv}; use num; use to_str; use unstable::intrinsics; diff --git a/src/libstd/num/i16.rs b/src/libstd/num/i16.rs index 5f431dfdf042..e19e7c6c3b8b 100644 --- a/src/libstd/num/i16.rs +++ b/src/libstd/num/i16.rs @@ -15,7 +15,7 @@ use prelude::*; use default::Default; -use num::{BitCount, CheckedAdd, CheckedSub, CheckedMul}; +use num::{Bitwise, Bounded, CheckedAdd, CheckedSub, CheckedMul}; use num::{CheckedDiv, Zero, One, strconv}; use num::{ToStrRadix, FromStrRadix}; use option::{Option, Some, None}; @@ -24,7 +24,7 @@ use unstable::intrinsics; int_module!(i16, 16) -impl BitCount for i16 { +impl Bitwise for i16 { /// Counts the number of bits set. Wraps LLVM's `ctpop` intrinsic. #[inline] fn population_count(&self) -> i16 { unsafe { intrinsics::ctpop16(*self) } } diff --git a/src/libstd/num/i32.rs b/src/libstd/num/i32.rs index 8bb03344923d..372d9f680d72 100644 --- a/src/libstd/num/i32.rs +++ b/src/libstd/num/i32.rs @@ -15,7 +15,7 @@ use prelude::*; use default::Default; -use num::{BitCount, CheckedAdd, CheckedSub, CheckedMul}; +use num::{Bitwise, Bounded, CheckedAdd, CheckedSub, CheckedMul}; use num::{CheckedDiv, Zero, One, strconv}; use num::{ToStrRadix, FromStrRadix}; use option::{Option, Some, None}; @@ -24,7 +24,7 @@ use unstable::intrinsics; int_module!(i32, 32) -impl BitCount for i32 { +impl Bitwise for i32 { /// Counts the number of bits set. Wraps LLVM's `ctpop` intrinsic. #[inline] fn population_count(&self) -> i32 { unsafe { intrinsics::ctpop32(*self) } } diff --git a/src/libstd/num/i64.rs b/src/libstd/num/i64.rs index 891043ad5f82..2a91ee4dd71c 100644 --- a/src/libstd/num/i64.rs +++ b/src/libstd/num/i64.rs @@ -17,7 +17,7 @@ use prelude::*; use default::Default; #[cfg(target_word_size = "64")] use num::CheckedMul; -use num::{BitCount, CheckedAdd, CheckedSub}; +use num::{Bitwise, Bounded, CheckedAdd, CheckedSub}; use num::{CheckedDiv, Zero, One, strconv}; use num::{ToStrRadix, FromStrRadix}; use option::{Option, Some, None}; @@ -26,7 +26,7 @@ use unstable::intrinsics; int_module!(i64, 64) -impl BitCount for i64 { +impl Bitwise for i64 { /// Counts the number of bits set. Wraps LLVM's `ctpop` intrinsic. #[inline] fn population_count(&self) -> i64 { unsafe { intrinsics::ctpop64(*self) } } diff --git a/src/libstd/num/i8.rs b/src/libstd/num/i8.rs index fd123ec57cc7..66162ce35026 100644 --- a/src/libstd/num/i8.rs +++ b/src/libstd/num/i8.rs @@ -15,7 +15,7 @@ use prelude::*; use default::Default; -use num::{BitCount, CheckedAdd, CheckedSub, CheckedMul}; +use num::{Bitwise, Bounded, CheckedAdd, CheckedSub, CheckedMul}; use num::{CheckedDiv, Zero, One, strconv}; use num::{ToStrRadix, FromStrRadix}; use option::{Option, Some, None}; @@ -24,7 +24,7 @@ use unstable::intrinsics; int_module!(i8, 8) -impl BitCount for i8 { +impl Bitwise for i8 { /// Counts the number of bits set. Wraps LLVM's `ctpop` intrinsic. #[inline] fn population_count(&self) -> i8 { unsafe { intrinsics::ctpop8(*self) } } diff --git a/src/libstd/num/int.rs b/src/libstd/num/int.rs index 123555e4a63d..8068d4a74cbf 100644 --- a/src/libstd/num/int.rs +++ b/src/libstd/num/int.rs @@ -15,7 +15,7 @@ use prelude::*; use default::Default; -use num::{BitCount, CheckedAdd, CheckedSub, CheckedMul}; +use num::{Bitwise, Bounded, CheckedAdd, CheckedSub, CheckedMul}; use num::{CheckedDiv, Zero, One, strconv}; use num::{ToStrRadix, FromStrRadix}; use option::{Option, Some, None}; @@ -26,7 +26,7 @@ use unstable::intrinsics; #[cfg(target_word_size = "64")] int_module!(int, 64) #[cfg(target_word_size = "32")] -impl BitCount for int { +impl Bitwise for int { /// Counts the number of bits set. Wraps LLVM's `ctpop` intrinsic. #[inline] fn population_count(&self) -> int { (*self as i32).population_count() as int } @@ -41,7 +41,7 @@ impl BitCount for int { } #[cfg(target_word_size = "64")] -impl BitCount for int { +impl Bitwise for int { /// Counts the number of bits set. Wraps LLVM's `ctpop` intrinsic. #[inline] fn population_count(&self) -> int { (*self as i64).population_count() as int } diff --git a/src/libstd/num/int_macros.rs b/src/libstd/num/int_macros.rs index 0e7e4277dd6c..5c878cd0302f 100644 --- a/src/libstd/num/int_macros.rs +++ b/src/libstd/num/int_macros.rs @@ -315,8 +315,6 @@ impl Integer for $T { fn is_odd(&self) -> bool { !self.is_even() } } -impl Bitwise for $T {} - #[cfg(not(test))] impl BitOr<$T,$T> for $T { #[inline] @@ -446,6 +444,7 @@ mod tests { use i32; use num; use num::CheckedDiv; + use num::Bitwise; use mem; #[test] diff --git a/src/libstd/num/mod.rs b/src/libstd/num/mod.rs index 2bf3158e6b43..05f21c7d4480 100644 --- a/src/libstd/num/mod.rs +++ b/src/libstd/num/mod.rs @@ -324,21 +324,27 @@ pub trait Real: Signed /// Inverse hyperbolic tangent function. #[inline(always)] pub fn atanh(value: T) -> T { value.atanh() } -/// Collects the bitwise operators under one trait. -pub trait Bitwise: Not +pub trait Bounded { + // FIXME (#5527): These should be associated constants + fn min_value() -> Self; + fn max_value() -> Self; +} + +/// Numbers with a fixed binary representation. +pub trait Bitwise: Bounded + + Not + BitAnd + BitOr + BitXor + Shl - + Shr {} - -/// A trait for common counting operations on bits. -pub trait BitCount { + + Shr { /// Returns the number of bits set in the number. /// /// # Example /// /// ```rust + /// use std::num::Bitwise; + /// /// let n = 0b0101000u16; /// assert_eq!(n.population_count(), 2); /// ``` @@ -348,6 +354,8 @@ pub trait BitCount { /// # Example /// /// ```rust + /// use std::num::Bitwise; + /// /// let n = 0b0101000u16; /// assert_eq!(n.leading_zeros(), 10); /// ``` @@ -357,18 +365,14 @@ pub trait BitCount { /// # Example /// /// ```rust + /// use std::num::Bitwise; + /// /// let n = 0b0101000u16; /// assert_eq!(n.trailing_zeros(), 3); /// ``` fn trailing_zeros(&self) -> Self; } -pub trait Bounded { - // FIXME (#5527): These should be associated constants - fn min_value() -> Self; - fn max_value() -> Self; -} - /// Specifies the available operations common to all of Rust's core numeric primitives. /// These may not always make sense from a purely mathematical point of view, but /// may be useful for systems programming. @@ -394,8 +398,7 @@ pub trait Primitive: Clone /// A collection of traits relevant to primitive signed and unsigned integers pub trait Int: Integer + Primitive - + Bitwise - + BitCount {} + + Bitwise {} /// Used for representing the classification of floating point numbers #[deriving(Eq)] diff --git a/src/libstd/num/u16.rs b/src/libstd/num/u16.rs index 7e4145fc723d..770db889af55 100644 --- a/src/libstd/num/u16.rs +++ b/src/libstd/num/u16.rs @@ -15,7 +15,7 @@ use prelude::*; use default::Default; -use num::BitCount; +use num::{Bitwise, Bounded}; use num::{CheckedAdd, CheckedSub, CheckedMul}; use num::{CheckedDiv, Zero, One, strconv}; use num::{ToStrRadix, FromStrRadix}; diff --git a/src/libstd/num/u32.rs b/src/libstd/num/u32.rs index 34c2a892d56b..9e08ffed3b70 100644 --- a/src/libstd/num/u32.rs +++ b/src/libstd/num/u32.rs @@ -15,7 +15,7 @@ use prelude::*; use default::Default; -use num::BitCount; +use num::{Bitwise, Bounded}; use num::{CheckedAdd, CheckedSub, CheckedMul}; use num::{CheckedDiv, Zero, One, strconv}; use num::{ToStrRadix, FromStrRadix}; diff --git a/src/libstd/num/u64.rs b/src/libstd/num/u64.rs index c307b038627f..a579e7ebbbe4 100644 --- a/src/libstd/num/u64.rs +++ b/src/libstd/num/u64.rs @@ -15,7 +15,7 @@ use prelude::*; use default::Default; -use num::BitCount; +use num::{Bitwise, Bounded}; #[cfg(target_word_size = "64")] use num::CheckedMul; use num::{CheckedAdd, CheckedSub}; diff --git a/src/libstd/num/u8.rs b/src/libstd/num/u8.rs index 06bda72c5fe6..4aa34b6d8804 100644 --- a/src/libstd/num/u8.rs +++ b/src/libstd/num/u8.rs @@ -15,7 +15,7 @@ use prelude::*; use default::Default; -use num::BitCount; +use num::{Bitwise, Bounded}; use num::{CheckedAdd, CheckedSub, CheckedMul}; use num::{CheckedDiv, Zero, One, strconv}; use num::{ToStrRadix, FromStrRadix}; diff --git a/src/libstd/num/uint.rs b/src/libstd/num/uint.rs index a752cd938ba0..d304f9475421 100644 --- a/src/libstd/num/uint.rs +++ b/src/libstd/num/uint.rs @@ -16,7 +16,7 @@ use prelude::*; use default::Default; use mem; -use num::BitCount; +use num::{Bitwise, Bounded}; use num::{CheckedAdd, CheckedSub, CheckedMul}; use num::{CheckedDiv, Zero, One, strconv}; use num::{ToStrRadix, FromStrRadix}; diff --git a/src/libstd/num/uint_macros.rs b/src/libstd/num/uint_macros.rs index 1a256981d74e..289af9f61290 100644 --- a/src/libstd/num/uint_macros.rs +++ b/src/libstd/num/uint_macros.rs @@ -176,8 +176,6 @@ impl Integer for $T { fn is_odd(&self) -> bool { !self.is_even() } } -impl Bitwise for $T {} - #[cfg(not(test))] impl BitOr<$T,$T> for $T { #[inline] @@ -298,7 +296,7 @@ impl Primitive for $T { fn is_signed(_: Option<$T>) -> bool { false } } -impl BitCount for $T { +impl Bitwise for $T { /// Counts the number of bits set. Wraps LLVM's `ctpop` intrinsic. #[inline] fn population_count(&self) -> $T { @@ -325,6 +323,7 @@ mod tests { use num; use num::CheckedDiv; + use num::Bitwise; use mem; use u16; diff --git a/src/libstd/prelude.rs b/src/libstd/prelude.rs index 9045bafbe459..2f5f3e8f4568 100644 --- a/src/libstd/prelude.rs +++ b/src/libstd/prelude.rs @@ -58,8 +58,7 @@ pub use iter::{FromIterator, Extendable}; pub use iter::{Iterator, DoubleEndedIterator, RandomAccessIterator, CloneableIterator}; pub use iter::{OrdIterator, MutableDoubleEndedIterator, ExactSize}; pub use num::Times; -pub use num::{Bitwise, BitCount, Bounded, Integer, Real}; -pub use num::{Num, NumCast, CheckedAdd, CheckedSub, CheckedMul}; +pub use num::{Integer, Real, Num, NumCast, CheckedAdd, CheckedSub, CheckedMul}; pub use num::{Orderable, Signed, Unsigned, Round}; pub use num::{Primitive, Int, Float, ToStrRadix, ToPrimitive, FromPrimitive}; pub use path::{GenericPath, Path, PosixPath, WindowsPath};