Skip to content

Commit fd82b7b

Browse files
authored
Merge pull request #233 from elbeno/missing-constexpr
🐛 Make `as_[un]signed` `constexpr`
2 parents ff61017 + 1db17b9 commit fd82b7b

File tree

2 files changed

+6
-2
lines changed

2 files changed

+6
-2
lines changed

include/stdx/utility.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,14 @@ template <typename T, typename U>
9797
using forward_like_t = decltype(forward_like<T>(std::declval<U>()));
9898

9999
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
100-
[[nodiscard]] auto as_unsigned(T t) {
100+
[[nodiscard]] constexpr auto as_unsigned(T t) {
101101
static_assert(not std::is_same_v<T, bool>,
102102
"as_unsigned is not applicable to bool");
103103
return static_cast<std::make_unsigned_t<T>>(t);
104104
}
105105

106106
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
107-
[[nodiscard]] auto as_signed(T t) {
107+
[[nodiscard]] constexpr auto as_signed(T t) {
108108
static_assert(not std::is_same_v<T, bool>,
109109
"as_signed is not applicable to bool");
110110
return static_cast<std::make_signed_t<T>>(t);

test/utility.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@ TEST_CASE("as_unsigned (changed)", "[utility]") {
3232
std::uint32_t>);
3333
STATIC_REQUIRE(std::is_same_v<decltype(stdx::as_unsigned(std::int64_t{})),
3434
std::uint64_t>);
35+
STATIC_REQUIRE(stdx::as_unsigned(std::int8_t{17}) == 17);
3536
}
3637

3738
TEMPLATE_TEST_CASE("as_unsigned (unchanged)", "[utility]", std::uint8_t,
3839
std::uint16_t, std::uint32_t, std::uint64_t) {
3940
STATIC_REQUIRE(
4041
std::is_same_v<decltype(stdx::as_unsigned(TestType{})), TestType>);
42+
STATIC_REQUIRE(stdx::as_unsigned(TestType{17}) == 17);
4143
}
4244

4345
TEST_CASE("as_signed (changed)", "[utility]") {
@@ -49,12 +51,14 @@ TEST_CASE("as_signed (changed)", "[utility]") {
4951
std::int32_t>);
5052
STATIC_REQUIRE(std::is_same_v<decltype(stdx::as_signed(std::uint64_t{})),
5153
std::int64_t>);
54+
STATIC_REQUIRE(stdx::as_signed(std::uint8_t{17}) == 17);
5255
}
5356

5457
TEMPLATE_TEST_CASE("as_signed (unchanged)", "[utility]", std::int8_t,
5558
std::int16_t, std::int32_t, std::int64_t) {
5659
STATIC_REQUIRE(
5760
std::is_same_v<decltype(stdx::as_signed(TestType{})), TestType>);
61+
STATIC_REQUIRE(stdx::as_signed(TestType{17}) == 17);
5862
}
5963

6064
TEMPLATE_TEST_CASE("sized<T> in (uint8_t zero/one/two case)", "[utility]",

0 commit comments

Comments
 (0)