From 2017cc3ce45a4c1827c5ccee400199bca8f22594 Mon Sep 17 00:00:00 2001 From: blake2-ppc Date: Thu, 12 Sep 2013 05:05:12 +0200 Subject: [PATCH] std::num: Add uint::next_power_of_two_opt Like next_power_of_two, but returns None on overflow. --- src/libstd/num/uint.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libstd/num/uint.rs b/src/libstd/num/uint.rs index dfdd6cf72f74..38a4df270fc2 100644 --- a/src/libstd/num/uint.rs +++ b/src/libstd/num/uint.rs @@ -101,7 +101,17 @@ pub fn next_power_of_two(n: uint) -> uint { let mut tmp: uint = n - 1u; let mut shift: uint = 1u; while shift <= halfbits { tmp |= tmp >> shift; shift <<= 1u; } - return tmp + 1u; + tmp + 1u +} + +/// Returns the smallest power of 2 greater than or equal to `n` +#[inline] +pub fn next_power_of_two_opt(n: uint) -> Option { + let halfbits: uint = sys::size_of::() * 4u; + let mut tmp: uint = n - 1u; + let mut shift: uint = 1u; + while shift <= halfbits { tmp |= tmp >> shift; shift <<= 1u; } + tmp.checked_add(&1) } #[cfg(target_word_size = "32")]