mirror of
https://github.com/fmtlib/fmt.git
synced 2025-07-31 19:24:48 +02:00
Detect presence of uintptr_t
This commit is contained in:
@@ -28,10 +28,10 @@
|
|||||||
#ifndef FMT_FORMAT_H_
|
#ifndef FMT_FORMAT_H_
|
||||||
#define FMT_FORMAT_H_
|
#define FMT_FORMAT_H_
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <cstdint>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@@ -248,6 +248,12 @@ namespace internal {
|
|||||||
# define FMT_USE_GRISU 1
|
# define FMT_USE_GRISU 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// A fallback implementation of uintptr_t for systems that lack it.
|
||||||
|
struct uintptr_t {
|
||||||
|
unsigned char value[sizeof(void*)];
|
||||||
|
};
|
||||||
|
typedef std::numeric_limits<uintptr_t> numutil;
|
||||||
|
|
||||||
template <typename T> inline bool use_grisu() {
|
template <typename T> inline bool use_grisu() {
|
||||||
return FMT_USE_GRISU && std::numeric_limits<double>::is_iec559 &&
|
return FMT_USE_GRISU && std::numeric_limits<double>::is_iec559 &&
|
||||||
sizeof(T) <= sizeof(double);
|
sizeof(T) <= sizeof(double);
|
||||||
@@ -297,6 +303,20 @@ typename Allocator::value_type* allocate(Allocator& alloc, std::size_t n) {
|
|||||||
} // namespace internal
|
} // namespace internal
|
||||||
FMT_END_NAMESPACE
|
FMT_END_NAMESPACE
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
using namespace fmt::internal;
|
||||||
|
// Standard permits specialization of std::numeric_limits. This specialization
|
||||||
|
// is used to detect presence of uintptr_t.
|
||||||
|
template <>
|
||||||
|
class numeric_limits<fmt::internal::uintptr_t>
|
||||||
|
: public std::numeric_limits<int> {
|
||||||
|
public:
|
||||||
|
static uintptr_t to_uint(const void* p) {
|
||||||
|
return fmt::internal::bit_cast<uintptr_t>(p);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
FMT_BEGIN_NAMESPACE
|
FMT_BEGIN_NAMESPACE
|
||||||
template <typename Range> class basic_writer;
|
template <typename Range> class basic_writer;
|
||||||
|
|
||||||
@@ -1392,7 +1412,7 @@ template <typename Range> class arg_formatter_base {
|
|||||||
format_specs specs = specs_ ? *specs_ : format_specs();
|
format_specs specs = specs_ ? *specs_ : format_specs();
|
||||||
specs.flags = HASH_FLAG;
|
specs.flags = HASH_FLAG;
|
||||||
specs.type = 'x';
|
specs.type = 'x';
|
||||||
writer_.write_int(reinterpret_cast<uintptr_t>(p), specs);
|
writer_.write_int(internal::numutil::to_uint(p), specs);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -2764,7 +2784,7 @@ template <typename Range> class basic_writer {
|
|||||||
format_specs specs;
|
format_specs specs;
|
||||||
specs.flags = HASH_FLAG;
|
specs.flags = HASH_FLAG;
|
||||||
specs.type = 'x';
|
specs.type = 'x';
|
||||||
write_int(reinterpret_cast<uintptr_t>(p), specs);
|
write_int(internal::numutil::to_uint(p), specs);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user