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

constexpr_log2_ceil

Summary: [Folly] `constexpr_log2_ceil`, like `constexpr_log2` but rounding up.

Reviewed By: Orvid

Differential Revision: D6636433

fbshipit-source-id: a10f031cc9c91cfeba7b74bbf143895a311ca772
parent e50d7df4
...@@ -108,6 +108,11 @@ template <typename T> ...@@ -108,6 +108,11 @@ template <typename T>
constexpr T constexpr_log2(T a, T e) { constexpr T constexpr_log2(T a, T e) {
return e == T(1) ? a : constexpr_log2(a + T(1), e / T(2)); return e == T(1) ? a : constexpr_log2(a + T(1), e / T(2));
} }
template <typename T>
constexpr T constexpr_log2_ceil(T l2, T t) {
return l2 + T(T(1) << l2 < t ? 1 : 0);
}
} // namespace detail } // namespace detail
template <typename T> template <typename T>
...@@ -115,6 +120,11 @@ constexpr T constexpr_log2(T t) { ...@@ -115,6 +120,11 @@ constexpr T constexpr_log2(T t) {
return detail::constexpr_log2(T(0), t); return detail::constexpr_log2(T(0), t);
} }
template <typename T>
constexpr T constexpr_log2_ceil(T t) {
return detail::constexpr_log2_ceil(constexpr_log2(t), t);
}
template <typename T> template <typename T>
constexpr T constexpr_ceil(T t, T round) { constexpr T constexpr_ceil(T t, T round) {
return round == T(0) return round == T(0)
......
...@@ -123,6 +123,41 @@ TEST_F(ConstexprMathTest, constexpr_log2_64) { ...@@ -123,6 +123,41 @@ TEST_F(ConstexprMathTest, constexpr_log2_64) {
EXPECT_TRUE((std::is_same<decltype(v), decltype(a)>::value)); EXPECT_TRUE((std::is_same<decltype(v), decltype(a)>::value));
} }
TEST_F(ConstexprMathTest, constexpr_log2_ceil_1) {
constexpr auto v = 1ull;
constexpr auto a = folly::constexpr_log2_ceil(v);
EXPECT_EQ(0ull, a);
EXPECT_TRUE((std::is_same<decltype(v), decltype(a)>::value));
}
TEST_F(ConstexprMathTest, constexpr_log2_ceil_2) {
constexpr auto v = 2ull;
constexpr auto a = folly::constexpr_log2_ceil(v);
EXPECT_EQ(1ull, a);
EXPECT_TRUE((std::is_same<decltype(v), decltype(a)>::value));
}
TEST_F(ConstexprMathTest, constexpr_log2_ceil_3) {
constexpr auto v = 3ull;
constexpr auto a = folly::constexpr_log2_ceil(v);
EXPECT_EQ(2ull, a);
EXPECT_TRUE((std::is_same<decltype(v), decltype(a)>::value));
}
TEST_F(ConstexprMathTest, constexpr_log2_ceil_63) {
constexpr auto v = 63ull;
constexpr auto a = folly::constexpr_log2_ceil(v);
EXPECT_EQ(6ull, a);
EXPECT_TRUE((std::is_same<decltype(v), decltype(a)>::value));
}
TEST_F(ConstexprMathTest, constexpr_log2_ceil_64) {
constexpr auto v = 64ull;
constexpr auto a = folly::constexpr_log2_ceil(v);
EXPECT_EQ(6ull, a);
EXPECT_TRUE((std::is_same<decltype(v), decltype(a)>::value));
}
TEST_F(ConstexprMathTest, constexpr_ceil) { TEST_F(ConstexprMathTest, constexpr_ceil) {
{ {
constexpr auto roundable = 20ull; constexpr auto roundable = 20ull;
......
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