diff --git a/include/fmt/format-inl.h b/include/fmt/format-inl.h index 8778337e..9a00c21f 100644 --- a/include/fmt/format-inl.h +++ b/include/fmt/format-inl.h @@ -236,7 +236,7 @@ FMT_FUNC void system_error::init(int err_code, string_view format_str, namespace internal { -template <> FMT_FUNC int count_digits<4>(internal::uintptr_t n) { +template <> FMT_FUNC int count_digits<4>(internal::uintptr n) { // Assume little endian; pointer formatting is implementation-defined anyway. int i = static_cast(sizeof(void*)) - 1; while (i > 0 && n.value[i] == 0) --i; diff --git a/include/fmt/format.h b/include/fmt/format.h index a0fb6d74..420cf652 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -243,13 +243,14 @@ namespace internal { #endif // A fallback implementation of uintptr_t for systems that lack it. -namespace uintptr { -struct uintptr_t { +struct uintptr { unsigned char value[sizeof(void*)]; }; -} // namespace uintptr -using uintptr::uintptr_t; -typedef std::numeric_limits numutil; +#ifdef UINTPTR_MAX +using uintptr_t = ::uintptr_t; +#else +using uintptr_t = uintptr; +#endif template inline bool use_grisu() { return FMT_USE_GRISU && std::numeric_limits::is_iec559 && @@ -303,25 +304,7 @@ typename Allocator::value_type* allocate(Allocator& alloc, std::size_t n) { #endif } } // namespace internal -FMT_END_NAMESPACE -namespace std { -using namespace fmt::v5::internal::uintptr; -// Standard permits specialization of std::numeric_limits. This specialization -// is used to detect presence of uintptr_t. -template <> -class numeric_limits - : public std::numeric_limits { - public: - typedef uintptr_t uintptr_type; - - static uintptr_type to_uint(const void* p) { - return fmt::internal::bit_cast(p); - } -}; -} // namespace std - -FMT_BEGIN_NAMESPACE template class basic_writer; template @@ -751,7 +734,7 @@ template inline int count_digits(UInt n) { return num_digits; } -template <> int count_digits<4>(internal::uintptr_t n); +template <> int count_digits<4>(internal::uintptr n); template inline size_t count_code_points(basic_string_view s) { @@ -980,7 +963,7 @@ inline Char* format_uint(Char* buffer, UInt value, int num_digits, } template -Char* format_uint(Char* buffer, internal::uintptr_t n, int num_digits, +Char* format_uint(Char* buffer, internal::uintptr n, int num_digits, bool = false) { auto char_digits = std::numeric_limits::digits / 4; int start = (num_digits + char_digits - 1) / char_digits - 1; @@ -1411,7 +1394,7 @@ class arg_formatter_base { } void write_pointer(const void* p) { - writer_.write_pointer(internal::numutil::to_uint(p), specs_); + writer_.write_pointer(internal::bit_cast(p), specs_); } protected: diff --git a/test/format-impl-test.cc b/test/format-impl-test.cc index 25b5aeb0..94bc5eea 100644 --- a/test/format-impl-test.cc +++ b/test/format-impl-test.cc @@ -257,7 +257,7 @@ TEST(UtilTest, CountDigits) { TEST(UtilTest, WriteUIntPtr) { fmt::memory_buffer buf; fmt::writer writer(buf); - writer.write_pointer(fmt::internal::bit_cast( + writer.write_pointer(fmt::internal::bit_cast( reinterpret_cast(0xface)), nullptr); EXPECT_EQ("0xface", to_string(buf));