diff --git a/include/fmt/ranges.h b/include/fmt/ranges.h index 770f43b7b882..a8c663b30161 100644 --- a/include/fmt/ranges.h +++ b/include/fmt/ranges.h @@ -162,6 +162,33 @@ void for_each(Tuple &&tup, F &&f) { const auto indexes = get_indexes(tup); for_each(indexes, std::forward(tup), std::forward(f)); } + +template +FMT_CONSTEXPR const char* format_str_quoted(bool add_space, const Arg&, + typename std::enable_if::type>::value>::type* = nullptr) { + return add_space ? " {}" : "{}"; +} + +template +FMT_CONSTEXPR const char* format_str_quoted(bool add_space, const Arg&, + typename std::enable_if::type>::value>::type* = nullptr) { + return add_space ? " \"{}\"" : "\"{}\""; +} + +FMT_CONSTEXPR const char* format_str_quoted(bool add_space, const char*) { + return add_space ? " \"{}\"" : "\"{}\""; +} +FMT_CONSTEXPR const wchar_t* format_str_quoted(bool add_space, const wchar_t*) { + return add_space ? L" \"{}\"" : L"\"{}\""; +} + +FMT_CONSTEXPR const char* format_str_quoted(bool add_space, const char) { + return add_space ? " '{}'" : "'{}'"; +} +FMT_CONSTEXPR const wchar_t* format_str_quoted(bool add_space, const wchar_t) { + return add_space ? L" '{}'" : L"'{}'"; +} + } // namespace internal template @@ -185,11 +212,7 @@ struct formatter 0) { - format_to(out, " {}", v); - } else { - format_to(out, "{}", v); - } + format_to(out, internal::format_str_quoted((formatting.add_delimiter_spaces && i > 0), v), v); ++i; } @@ -252,11 +275,7 @@ struct formatter 0) { - format_to(out, " {}", *it); - } else { - format_to(out, "{}", *it); - } + format_to(out, internal::format_str_quoted((formatting.add_delimiter_spaces && i > 0), *it), *it); if (++i > formatting.range_length_limit) { format_to(out, " ... "); break; diff --git a/test/ranges-test.cc b/test/ranges-test.cc index 1fab6ab43528..55865d4b21b5 100644 --- a/test/ranges-test.cc +++ b/test/ranges-test.cc @@ -32,7 +32,7 @@ TEST(RangesTest, FormatVector2) { TEST(RangesTest, FormatMap) { std::map simap{{"one", 1}, {"two", 2}}; - EXPECT_EQ("{(one, 1), (two, 2)}", fmt::format("{}", simap)); + EXPECT_EQ("{(\"one\", 1), (\"two\", 2)}", fmt::format("{}", simap)); } TEST(RangesTest, FormatPair) { @@ -42,8 +42,8 @@ TEST(RangesTest, FormatPair) { TEST(RangesTest, FormatTuple) { std::tuple tu1{42, 3.14159265358979f, - "this is tuple"}; - EXPECT_EQ("(42, 3.14159, this is tuple)", fmt::format("{}", tu1)); + "this is tuple", 'i'}; + EXPECT_EQ("(42, 3.14159, \"this is tuple\", 'i')", fmt::format("{}", tu1)); } /// Check if 'if constexpr' is supported. @@ -81,7 +81,7 @@ struct tuple_element { TEST(RangesTest, FormatStruct) { my_struct mst{13, "my struct"}; - EXPECT_EQ("(13, my struct)", fmt::format("{}", mst)); + EXPECT_EQ("(13, \"my struct\")", fmt::format("{}", mst)); } #endif // (__cplusplus > 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >