Commit f7ec2efe authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

constexpr_log2

Summary:
[Folly] `constexpr_log2`.

Useful for anything that needs to compute log2 at compile time.

Reviewed By: eduardo-elizondo

Differential Revision: D5734727

fbshipit-source-id: 8eab7991eea2104570eecd8e84ede6160bb0b549
parent 70137200
......@@ -81,6 +81,11 @@ constexpr auto constexpr_abs(T t)
return detail::constexpr_abs_helper<T>::go(t);
}
template <typename T>
constexpr T constexpr_log2(T t) {
return t == T(1) ? T(0) : T(1) + constexpr_log2(t / T(2));
}
namespace detail {
template <typename Char>
......
......@@ -71,3 +71,24 @@ TEST_F(ConstexprTest, constexpr_abs_double_negative) {
EXPECT_EQ(17.5, a);
EXPECT_TRUE((std::is_same<const double, decltype(a)>::value));
}
TEST_F(ConstexprTest, constexpr_log2_1) {
constexpr auto v = 1ull;
constexpr auto a = folly::constexpr_log2(v);
EXPECT_EQ(0ull, a);
EXPECT_TRUE((std::is_same<decltype(v), decltype(a)>::value));
}
TEST_F(ConstexprTest, constexpr_log2_2) {
constexpr auto v = 2ull;
constexpr auto a = folly::constexpr_log2(v);
EXPECT_EQ(1ull, a);
EXPECT_TRUE((std::is_same<decltype(v), decltype(a)>::value));
}
TEST_F(ConstexprTest, constexpr_log2_64) {
constexpr auto v = 64ull;
constexpr auto a = folly::constexpr_log2(v);
EXPECT_EQ(6ull, a);
EXPECT_TRUE((std::is_same<decltype(v), decltype(a)>::value));
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment