diff options
| author | Aaron Liblong <liblonga@physics.utoronto.ca> | 2014-12-08 01:03:35 -0500 |
|---|---|---|
| committer | Aaron Liblong <liblonga@physics.utoronto.ca> | 2014-12-19 18:21:24 -0500 |
| commit | f6328b60da4c506f0f15dc0194f9b9a89aa61a79 (patch) | |
| tree | fa079f83c6ba1a4d2651230958c078e7c6ef1a27 /src/libstd/num | |
| parent | 99d6956c3bdb290b9fd539c5dc15a2b502da5e7a (diff) | |
| download | rust-f6328b60da4c506f0f15dc0194f9b9a89aa61a79.tar.gz rust-f6328b60da4c506f0f15dc0194f9b9a89aa61a79.zip | |
Reform power_of_two methods for perf increase & semantic change to consider 0 not a power of 2.
Vec panics when attempting to reserve capacity > int::MAX (uint::MAX / 2).
Diffstat (limited to 'src/libstd/num')
| -rw-r--r-- | src/libstd/num/mod.rs | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/libstd/num/mod.rs b/src/libstd/num/mod.rs index a568aafe1ed..fdece4fbc0d 100644 --- a/src/libstd/num/mod.rs +++ b/src/libstd/num/mod.rs @@ -664,11 +664,32 @@ mod tests { assert_eq!(third.checked_mul(4), None); } + macro_rules! test_is_power_of_two { + ($test_name:ident, $T:ident) => ( + fn $test_name() { + #![test] + assert_eq!((0 as $T).is_power_of_two(), false); + assert_eq!((1 as $T).is_power_of_two(), true); + assert_eq!((2 as $T).is_power_of_two(), true); + assert_eq!((3 as $T).is_power_of_two(), false); + assert_eq!((4 as $T).is_power_of_two(), true); + assert_eq!((5 as $T).is_power_of_two(), false); + assert!(($T::MAX / 2 + 1).is_power_of_two(), true); + } + ) + } + + test_is_power_of_two!{ test_is_power_of_two_u8, u8 } + test_is_power_of_two!{ test_is_power_of_two_u16, u16 } + test_is_power_of_two!{ test_is_power_of_two_u32, u32 } + test_is_power_of_two!{ test_is_power_of_two_u64, u64 } + test_is_power_of_two!{ test_is_power_of_two_uint, uint } + macro_rules! test_next_power_of_two { ($test_name:ident, $T:ident) => ( fn $test_name() { #![test] - assert_eq!((0 as $T).next_power_of_two(), 0); + assert_eq!((0 as $T).next_power_of_two(), 1); let mut next_power = 1; for i in range::<$T>(1, 40) { assert_eq!(i.next_power_of_two(), next_power); @@ -688,15 +709,15 @@ mod tests { ($test_name:ident, $T:ident) => ( fn $test_name() { #![test] - assert_eq!((0 as $T).checked_next_power_of_two(), None); + assert_eq!((0 as $T).checked_next_power_of_two(), Some(1)); + assert!(($T::MAX / 2).checked_next_power_of_two().is_some()); + assert_eq!(($T::MAX - 1).checked_next_power_of_two(), None); + assert_eq!($T::MAX.checked_next_power_of_two(), None); let mut next_power = 1; for i in range::<$T>(1, 40) { assert_eq!(i.checked_next_power_of_two(), Some(next_power)); if i == next_power { next_power *= 2 } } - assert!(($T::MAX / 2).checked_next_power_of_two().is_some()); - assert_eq!(($T::MAX - 1).checked_next_power_of_two(), None); - assert_eq!($T::MAX.checked_next_power_of_two(), None); } ) } |
