mirror of
https://github.com/fmtlib/fmt.git
synced 2024-11-14 15:01:05 +00:00
Replace a bunch of craft with type_traits
This commit is contained in:
parent
3a6c7d0cbd
commit
e79588d6c1
@ -336,47 +336,13 @@ inline void require_wchar() {
|
|||||||
"formatting of wide characters into a narrow output is disallowed");
|
"formatting of wide characters into a narrow output is disallowed");
|
||||||
}
|
}
|
||||||
|
|
||||||
using yes = char[1];
|
template <typename T, bool ENABLE = true>
|
||||||
using no = char[2];
|
|
||||||
|
|
||||||
yes &convert(unsigned long long);
|
|
||||||
no &convert(...);
|
|
||||||
|
|
||||||
template<typename T, bool ENABLE_CONVERSION>
|
|
||||||
struct convert_to_int_impl {
|
|
||||||
enum { value = ENABLE_CONVERSION };
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T, bool ENABLE_CONVERSION>
|
|
||||||
struct convert_to_int_impl2 {
|
|
||||||
enum { value = false };
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
struct convert_to_int_impl2<T, true> {
|
|
||||||
enum {
|
|
||||||
// Don't convert arithmetic types.
|
|
||||||
value = convert_to_int_impl<T, !std::is_arithmetic<T>::value>::value
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
struct convert_to_int {
|
struct convert_to_int {
|
||||||
enum {
|
enum {
|
||||||
enable_conversion = sizeof(convert(std::declval<T>())) == sizeof(yes)
|
value = !std::is_arithmetic<T>::value && std::is_convertible<T, int>::value
|
||||||
};
|
};
|
||||||
enum { value = convert_to_int_impl2<T, enable_conversion>::value };
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FMT_DISABLE_CONVERSION_TO_INT(Type) \
|
|
||||||
template <> \
|
|
||||||
struct convert_to_int<Type> { enum { value = 0 }; }
|
|
||||||
|
|
||||||
// Silence warnings about convering float to int.
|
|
||||||
FMT_DISABLE_CONVERSION_TO_INT(float);
|
|
||||||
FMT_DISABLE_CONVERSION_TO_INT(double);
|
|
||||||
FMT_DISABLE_CONVERSION_TO_INT(long double);
|
|
||||||
|
|
||||||
template <typename Char>
|
template <typename Char>
|
||||||
struct named_arg_base;
|
struct named_arg_base;
|
||||||
|
|
||||||
|
@ -47,22 +47,12 @@ class FormatBuf : public std::basic_streambuf<Char> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
yes &convert(std::ostream &);
|
template <typename T>
|
||||||
|
struct convert_to_int<T,
|
||||||
struct DummyStream : std::ostream {
|
sizeof(std::declval<std::ostream>() << std::declval<T>()) != 0> {
|
||||||
DummyStream(); // Suppress a bogus warning in MSVC.
|
|
||||||
// Hide all operator<< overloads from std::ostream.
|
|
||||||
void operator<<(null<>);
|
|
||||||
};
|
|
||||||
|
|
||||||
no &operator<<(std::ostream &, int);
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
struct convert_to_int_impl<T, true> {
|
|
||||||
// Convert to int only if T doesn't have an overloaded operator<<.
|
// Convert to int only if T doesn't have an overloaded operator<<.
|
||||||
enum {
|
enum {
|
||||||
value = sizeof(convert(std::declval<DummyStream&>() << std::declval<T>()))
|
value = false
|
||||||
== sizeof(no)
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -827,15 +827,15 @@ TEST(UtilTest, ReportWindowsError) {
|
|||||||
enum TestEnum2 {};
|
enum TestEnum2 {};
|
||||||
|
|
||||||
TEST(UtilTest, ConvertToInt) {
|
TEST(UtilTest, ConvertToInt) {
|
||||||
EXPECT_TRUE(fmt::internal::convert_to_int<char>::enable_conversion);
|
EXPECT_FALSE(fmt::internal::convert_to_int<char>::value);
|
||||||
EXPECT_FALSE(fmt::internal::convert_to_int<const char *>::enable_conversion);
|
EXPECT_FALSE(fmt::internal::convert_to_int<const char *>::value);
|
||||||
EXPECT_TRUE(fmt::internal::convert_to_int<TestEnum2>::value);
|
EXPECT_TRUE(fmt::internal::convert_to_int<TestEnum2>::value);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if FMT_USE_ENUM_BASE
|
#if FMT_USE_ENUM_BASE
|
||||||
enum TestEnum : char {TestValue};
|
enum TestEnum : char {TestValue};
|
||||||
TEST(UtilTest, IsEnumConvertibleToInt) {
|
TEST(UtilTest, IsEnumConvertibleToInt) {
|
||||||
EXPECT_TRUE(fmt::internal::convert_to_int<TestEnum>::enable_conversion);
|
EXPECT_TRUE(fmt::internal::convert_to_int<TestEnum>::value);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user