|
30 | 30 | # include <version> |
31 | 31 | #endif |
32 | 32 |
|
| 33 | +#include <limits.h> |
| 34 | + |
| 35 | +#include <limits> |
| 36 | + |
33 | 37 | #include "gtest-extra.h" |
34 | 38 | #include "mock-allocator.h" |
35 | 39 | #include "util.h" |
36 | | - |
37 | 40 | using fmt::basic_memory_buffer; |
38 | 41 | using fmt::format_error; |
39 | 42 | using fmt::memory_buffer; |
@@ -931,8 +934,7 @@ TEST(format_test, runtime_width) { |
931 | 934 | } |
932 | 935 |
|
933 | 936 | TEST(format_test, exponent_range) { |
934 | | - for (int e = -1074; e <= 1023; ++e) |
935 | | - (void)fmt::format("{}", std::ldexp(1, e)); |
| 937 | + for (int e = -1074; e <= 1023; ++e) (void)fmt::format("{}", std::ldexp(1, e)); |
936 | 938 | } |
937 | 939 |
|
938 | 940 | TEST(format_test, precision) { |
@@ -2507,3 +2509,62 @@ TEST(format_test, writer) { |
2507 | 2509 | fmt::writer(s).print("foo"); |
2508 | 2510 | EXPECT_EQ(s.str(), "foo"); |
2509 | 2511 | } |
| 2512 | + |
| 2513 | +#if FMT_USE_BITINT |
| 2514 | +# pragma clang diagnostic ignored "-Wbit-int-extension" |
| 2515 | + |
| 2516 | +template <size_t N, bool is_signed> |
| 2517 | +using bitint_helper = |
| 2518 | + fmt::conditional_t<is_signed, _BitInt(N), unsigned _BitInt(N)>; |
| 2519 | +template <size_t N> using signed_bitint = bitint_helper<N, true>; |
| 2520 | +template <size_t N> using unsigned_bitint = bitint_helper<N, false>; |
| 2521 | + |
| 2522 | +TEST(format_test, bitint) { |
| 2523 | + EXPECT_EQ(fmt::format("{}", unsigned_bitint<3>(7)), "7"); |
| 2524 | + EXPECT_EQ(fmt::format("{}", signed_bitint<7>()), "0"); |
| 2525 | + |
| 2526 | + EXPECT_EQ(fmt::format("{}", unsigned_bitint<15>(31000)), "31000"); |
| 2527 | + EXPECT_EQ(fmt::format("{}", signed_bitint<16>(INT16_MIN)), "-32768"); |
| 2528 | + EXPECT_EQ(fmt::format("{}", signed_bitint<16>(INT16_MAX)), "32767"); |
| 2529 | + |
| 2530 | + EXPECT_EQ(fmt::format("{}", unsigned_bitint<32>(4294967295)), "4294967295"); |
| 2531 | + |
| 2532 | + EXPECT_EQ(fmt::format("{}", unsigned_bitint<47>(140737488355327ULL)), |
| 2533 | + "140737488355327"); |
| 2534 | + EXPECT_EQ(fmt::format("{}", signed_bitint<47>(-40737488355327LL)), |
| 2535 | + "-40737488355327"); |
| 2536 | + |
| 2537 | + // Check lvalues and const |
| 2538 | + auto a = signed_bitint<8>(0); |
| 2539 | + auto b = unsigned_bitint<32>(4294967295); |
| 2540 | + const auto c = signed_bitint<7>(0); |
| 2541 | + const auto d = unsigned_bitint<32>(4294967295); |
| 2542 | + EXPECT_EQ(fmt::format("{}", a), "0"); |
| 2543 | + EXPECT_EQ(fmt::format("{}", b), "4294967295"); |
| 2544 | + EXPECT_EQ(fmt::format("{}", c), "0"); |
| 2545 | + EXPECT_EQ(fmt::format("{}", d), "4294967295"); |
| 2546 | + |
| 2547 | + static_assert(fmt::is_formattable<signed_bitint<64>, char>{}, ""); |
| 2548 | + static_assert(fmt::is_formattable<unsigned_bitint<64>, char>{}, ""); |
| 2549 | + |
| 2550 | +# if FMT_USE_INT128 |
| 2551 | + static_assert(fmt::is_formattable<signed_bitint<128>, char>{}, ""); |
| 2552 | + static_assert(fmt::is_formattable<unsigned_bitint<128>, char>{}, ""); |
| 2553 | + |
| 2554 | + EXPECT_EQ(fmt::format("{}", signed_bitint<128>(0)), "0"); |
| 2555 | + EXPECT_EQ(fmt::format("{}", unsigned_bitint<128>(0)), "0"); |
| 2556 | + EXPECT_EQ("9223372036854775808", |
| 2557 | + fmt::format("{}", signed_bitint<65>(INT64_MAX) + 1)); |
| 2558 | + EXPECT_EQ("-9223372036854775809", |
| 2559 | + fmt::format("{}", signed_bitint<65>(INT64_MIN) - 1)); |
| 2560 | + EXPECT_EQ("18446744073709551616", |
| 2561 | + fmt::format("{}", unsigned_bitint<66>(UINT64_MAX) + 1)); |
| 2562 | + EXPECT_EQ("170141183460469231731687303715884105727", |
| 2563 | + fmt::format("{}", signed_bitint<128>(int128_max))); |
| 2564 | + EXPECT_EQ("-170141183460469231731687303715884105728", |
| 2565 | + fmt::format("{}", signed_bitint<128>(int128_min))); |
| 2566 | + EXPECT_EQ("340282366920938463463374607431768211455", |
| 2567 | + fmt::format("{}", unsigned_bitint<128>(uint128_max))); |
| 2568 | +# endif |
| 2569 | +} |
| 2570 | +#endif |
0 commit comments