Fix handling of _BitInt

This commit is contained in:
Victor Zverovich
2024-09-03 11:19:27 -07:00
parent 7a6a2a79ed
commit 894b71da85
3 changed files with 39 additions and 60 deletions
+17 -40
View File
@@ -2518,59 +2518,36 @@ TEST(format_test, writer) {
#if FMT_USE_BITINT
# pragma clang diagnostic ignored "-Wbit-int-extension"
template <size_t N, bool is_signed>
using bitint_helper =
fmt::conditional_t<is_signed, _BitInt(N), unsigned _BitInt(N)>;
template <size_t N> using signed_bitint = bitint_helper<N, true>;
template <size_t N> using unsigned_bitint = bitint_helper<N, false>;
TEST(format_test, bitint) {
EXPECT_EQ(fmt::format("{}", unsigned_bitint<3>(7)), "7");
EXPECT_EQ(fmt::format("{}", signed_bitint<7>()), "0");
using fmt::detail::bitint;
using fmt::detail::ubitint;
EXPECT_EQ(fmt::format("{}", ubitint<3>(7)), "7");
EXPECT_EQ(fmt::format("{}", bitint<7>()), "0");
EXPECT_EQ(fmt::format("{}", unsigned_bitint<15>(31000)), "31000");
EXPECT_EQ(fmt::format("{}", signed_bitint<16>(INT16_MIN)), "-32768");
EXPECT_EQ(fmt::format("{}", signed_bitint<16>(INT16_MAX)), "32767");
EXPECT_EQ(fmt::format("{}", ubitint<15>(31000)), "31000");
EXPECT_EQ(fmt::format("{}", bitint<16>(INT16_MIN)), "-32768");
EXPECT_EQ(fmt::format("{}", bitint<16>(INT16_MAX)), "32767");
EXPECT_EQ(fmt::format("{}", unsigned_bitint<32>(4294967295)), "4294967295");
EXPECT_EQ(fmt::format("{}", ubitint<32>(4294967295)), "4294967295");
EXPECT_EQ(fmt::format("{}", unsigned_bitint<47>(140737488355327ULL)),
EXPECT_EQ(fmt::format("{}", ubitint<47>(140737488355327ULL)),
"140737488355327");
EXPECT_EQ(fmt::format("{}", signed_bitint<47>(-40737488355327LL)),
EXPECT_EQ(fmt::format("{}", bitint<47>(-40737488355327LL)),
"-40737488355327");
// Check lvalues and const
auto a = signed_bitint<8>(0);
auto b = unsigned_bitint<32>(4294967295);
const auto c = signed_bitint<7>(0);
const auto d = unsigned_bitint<32>(4294967295);
auto a = bitint<8>(0);
auto b = ubitint<32>(4294967295);
const auto c = bitint<7>(0);
const auto d = ubitint<32>(4294967295);
EXPECT_EQ(fmt::format("{}", a), "0");
EXPECT_EQ(fmt::format("{}", b), "4294967295");
EXPECT_EQ(fmt::format("{}", c), "0");
EXPECT_EQ(fmt::format("{}", d), "4294967295");
static_assert(fmt::is_formattable<signed_bitint<64>, char>{}, "");
static_assert(fmt::is_formattable<unsigned_bitint<64>, char>{}, "");
# if FMT_USE_INT128
static_assert(fmt::is_formattable<signed_bitint<128>, char>{}, "");
static_assert(fmt::is_formattable<unsigned_bitint<128>, char>{}, "");
EXPECT_EQ(fmt::format("{}", signed_bitint<128>(0)), "0");
EXPECT_EQ(fmt::format("{}", unsigned_bitint<128>(0)), "0");
EXPECT_EQ("9223372036854775808",
fmt::format("{}", signed_bitint<65>(INT64_MAX) + 1));
EXPECT_EQ("-9223372036854775809",
fmt::format("{}", signed_bitint<65>(INT64_MIN) - 1));
EXPECT_EQ("18446744073709551616",
fmt::format("{}", unsigned_bitint<66>(UINT64_MAX) + 1));
EXPECT_EQ("170141183460469231731687303715884105727",
fmt::format("{}", signed_bitint<128>(int128_max)));
EXPECT_EQ("-170141183460469231731687303715884105728",
fmt::format("{}", signed_bitint<128>(int128_min)));
EXPECT_EQ("340282366920938463463374607431768211455",
fmt::format("{}", unsigned_bitint<128>(uint128_max)));
# endif
static_assert(fmt::is_formattable<bitint<64>, char>{}, "");
static_assert(fmt::is_formattable<ubitint<64>, char>{}, "");
}
#endif