diff --git a/src/libcore/tests/lib.rs b/src/libcore/tests/lib.rs index 86cf6fc104c8..36476cf01c08 100644 --- a/src/libcore/tests/lib.rs +++ b/src/libcore/tests/lib.rs @@ -41,6 +41,7 @@ #![feature(const_raw_ptr_deref)] #![feature(never_type)] #![feature(unwrap_infallible)] +#![feature(leading_trailing_ones)] extern crate test; diff --git a/src/libcore/tests/num/int_macros.rs b/src/libcore/tests/num/int_macros.rs index 4a44b5f24b91..48a49073b2cf 100644 --- a/src/libcore/tests/num/int_macros.rs +++ b/src/libcore/tests/num/int_macros.rs @@ -89,6 +89,33 @@ macro_rules! int_module { assert_eq!(C.count_zeros(), bits as u32 - 5); } + #[test] + fn test_leading_trailing_ones() { + let bits = (mem::size_of::<$T>() * 8) as u32; + + let a: $T = 0b0101_1111; + assert_eq!(a.trailing_ones(), 5); + assert_eq!((!a).leading_ones(), bits - 7); + + assert_eq!(a.reverse_bits().leading_ones(), 5); + + assert_eq!(_1.leading_ones(), bits); + assert_eq!(_1.trailing_ones(), bits); + + assert_eq!((_1 << 1).trailing_ones(), 0); + assert_eq!(MAX.leading_ones(), 0); + + assert_eq!((_1 << 1).leading_ones(), bits - 1); + assert_eq!(MAX.trailing_ones(), bits - 1); + + assert_eq!(_0.leading_ones(), 0); + assert_eq!(_0.trailing_ones(), 0); + + let x: $T = 0b0010_1100; + assert_eq!(x.leading_ones(), 0); + assert_eq!(x.trailing_ones(), 0); + } + #[test] fn test_rotate() { assert_eq!(A.rotate_left(6).rotate_right(2).rotate_right(4), A); diff --git a/src/libcore/tests/num/uint_macros.rs b/src/libcore/tests/num/uint_macros.rs index f94b2f56bbbe..8f1ca8e6fac2 100644 --- a/src/libcore/tests/num/uint_macros.rs +++ b/src/libcore/tests/num/uint_macros.rs @@ -53,6 +53,33 @@ macro_rules! uint_module { assert!(C.count_zeros() == bits as u32 - 5); } + #[test] + fn test_leading_trailing_ones() { + let bits = (mem::size_of::<$T>() * 8) as u32; + + let a: $T = 0b0101_1111; + assert_eq!(a.trailing_ones(), 5); + assert_eq!((!a).leading_ones(), bits - 7); + + assert_eq!(a.reverse_bits().leading_ones(), 5); + + assert_eq!(_1.leading_ones(), bits); + assert_eq!(_1.trailing_ones(), bits); + + assert_eq!((_1 << 1).trailing_ones(), 0); + assert_eq!((_1 >> 1).leading_ones(), 0); + + assert_eq!((_1 << 1).leading_ones(), bits - 1); + assert_eq!((_1 >> 1).trailing_ones(), bits - 1); + + assert_eq!(_0.leading_ones(), 0); + assert_eq!(_0.trailing_ones(), 0); + + let x: $T = 0b0010_1100; + assert_eq!(x.leading_ones(), 0); + assert_eq!(x.trailing_ones(), 0); + } + #[test] fn test_rotate() { assert_eq!(A.rotate_left(6).rotate_right(2).rotate_right(4), A);