Add support for more formattable types in ranges

This commit is contained in:
Victor Zverovich 2021-08-08 09:36:56 -07:00
parent 4fd9a00f35
commit 60cd5ea3f2
3 changed files with 16 additions and 8 deletions

View File

@ -72,10 +72,11 @@ class is_streamable {
template <typename T, typename Char> template <typename T, typename Char>
struct is_streamable< struct is_streamable<
T, Char, T, Char,
enable_if_t<std::is_arithmetic<T>::value || std::is_array<T>::value || enable_if_t<
std::is_same<T, char8_type>::value || std::is_arithmetic<T>::value || std::is_array<T>::value ||
(std::is_convertible<T, int>::value && std::is_pointer<T>::value || std::is_same<T, char8_type>::value ||
!std::is_enum<T>::value)>> : std::false_type {}; (std::is_convertible<T, int>::value && !std::is_enum<T>::value)>>
: std::false_type {};
// Write the content of buf to os. // Write the content of buf to os.
// It is a separate function rather than a part of vprint to simplify testing. // It is a separate function rather than a part of vprint to simplify testing.

View File

@ -582,9 +582,9 @@ struct formatter<
T, Char, T, Char,
enable_if_t< enable_if_t<
fmt::is_range<T, Char>::value fmt::is_range<T, Char>::value
// Workaround a bug in MSVC 2017 and earlier. // Workaround a bug in MSVC 2019 and earlier.
#if !FMT_MSC_VER || FMT_MSC_VER >= 1927 #if !FMT_MSC_VER
&& (has_formatter<detail::value_type<T>, format_context>::value || && (is_formattable<detail::value_type<T>, Char>::value ||
detail::has_fallback_formatter<detail::value_type<T>, Char>::value) detail::has_fallback_formatter<detail::value_type<T>, Char>::value)
#endif #endif
>> { >> {

View File

@ -190,7 +190,14 @@ TEST(ranges_test, range) {
EXPECT_EQ(fmt::format("{}", z), "[0, 0, 0]"); EXPECT_EQ(fmt::format("{}", z), "[0, 0, 0]");
} }
#if !FMT_MSC_VER || FMT_MSC_VER >= 1927 enum class test_enum { foo };
TEST(ranges_test, enum_range) {
auto v = std::vector<test_enum>{test_enum::foo};
EXPECT_EQ(fmt::format("{}", v), "[0]");
}
#if !FMT_MSC_VER
struct unformattable {}; struct unformattable {};
TEST(ranges_test, unformattable_range) { TEST(ranges_test, unformattable_range) {