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

constexpr_clamp

Summary:
[Folly] `constexpr_clamp`.

Like `std::clamp` (C++17).

Reviewed By: Orvid

Differential Revision: D6236825

fbshipit-source-id: 0f6c5dc9a955b148021ee6ed3e86201b53ae090c
parent 36ae3c3e
......@@ -44,6 +44,22 @@ constexpr T constexpr_min(T a, T b, Ts... ts) {
return b < a ? constexpr_min(b, ts...) : constexpr_min(a, ts...);
}
template <typename T, typename Less>
constexpr T const&
constexpr_clamp(T const& v, T const& lo, T const& hi, Less less) {
return less(v, lo) ? lo : less(hi, v) ? hi : v;
}
template <typename T>
constexpr T const& constexpr_clamp(T const& v, T const& lo, T const& hi) {
struct Less {
constexpr bool operator()(T const& a, T const& b) const {
return a < b;
}
};
return constexpr_clamp(v, lo, hi, Less{});
}
namespace detail {
template <typename T, typename = void>
......
......@@ -41,6 +41,18 @@ TEST_F(ConstexprMathTest, constexpr_max) {
EXPECT_TRUE((std::is_same<const uint16_t, decltype(a)>::value));
}
TEST_F(ConstexprMathTest, constexpr_clamp) {
constexpr auto lo = uint16_t(3);
constexpr auto hi = uint16_t(7);
constexpr auto x = folly::constexpr_clamp(uint16_t(2), lo, hi);
constexpr auto y = folly::constexpr_clamp(uint16_t(5), lo, hi);
constexpr auto z = folly::constexpr_clamp(uint16_t(8), lo, hi);
EXPECT_EQ(3, x);
EXPECT_EQ(5, y);
EXPECT_EQ(7, z);
EXPECT_TRUE((std::is_same<const uint16_t, decltype(y)>::value));
}
TEST_F(ConstexprMathTest, constexpr_abs_unsigned) {
constexpr auto v = uint32_t(17);
constexpr auto a = folly::constexpr_abs(v);
......
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