diff --git a/src/etc/vim/syntax/rust.vim b/src/etc/vim/syntax/rust.vim index 65e7cd061496d..fdb978ae7e12b 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 6fd42f74a767f..e04617780758b 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 ed731298b52a5..8f491e836b8f2 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 73d39d8145fc5..ee2f7638be988 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 06970561fac4f..909b25fe7563b 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 beecf8a44f632..a8eaa89565084 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 6a266c6c59f7a..fe51cb07646ec 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 5f431dfdf0427..e19e7c6c3b8bd 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 8bb03344923de..372d9f680d72e 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 891043ad5f82d..2a91ee4dd71cc 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 fd123ec57cc74..66162ce350269 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 123555e4a63d8..8068d4a74cbf8 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 0e7e4277dd6cd..5c878cd0302ff 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 2bf3158e6b435..05f21c7d44804 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 7e4145fc723db..770db889af55f 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 34c2a892d56b7..9e08ffed3b70b 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 c307b038627f9..a579e7ebbbe4a 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 06bda72c5fe6d..4aa34b6d88044 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 a752cd938ba0d..d304f94754214 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 1a256981d74ee..289af9f61290f 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 9045bafbe4591..2f5f3e8f4568d 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};