From b98e8301d5812a4322d29519257ac50c1d9441db Mon Sep 17 00:00:00 2001 From: XZiar Date: Fri, 26 Oct 2018 15:55:03 -0700 Subject: [PATCH] add non-char support for compile-time format check --- include/fmt/core.h | 8 +++++--- include/fmt/format.h | 10 ++++++---- test/format-test.cc | 4 ++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/include/fmt/core.h b/include/fmt/core.h index 676e7f7d..ca06f8c7 100644 --- a/include/fmt/core.h +++ b/include/fmt/core.h @@ -472,9 +472,11 @@ struct compile_string {}; template struct is_compile_string : std::is_base_of {}; -template -inline typename std::enable_if::value, string_view>::type - to_string_view(const S &s) { return {s.data(), s.size() - 1}; } +template ::value>> +inline auto to_string_view(const S &s) -> basic_string_view { + typedef typename S::Char Char; + return basic_string_view{s.data(), s.size() - 1}; +} template class basic_format_arg; diff --git a/include/fmt/format.h b/include/fmt/format.h index 76ceee4b..1689b176 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -2243,9 +2243,10 @@ FMT_CONSTEXPR bool check_format_string( template typename std::enable_if::value>::type check_format_string(String format_str) { + typedef typename String::Char Char; FMT_CONSTEXPR_DECL bool invalid_format = - internal::check_format_string( - string_view(format_str.data(), format_str.size())); + internal::check_format_string( + basic_string_view(format_str.data(), format_str.size())); (void)invalid_format; } @@ -3597,9 +3598,10 @@ FMT_END_NAMESPACE #define FMT_STRING(s) [] { \ typedef typename std::decay::type pointer; \ struct S : fmt::compile_string { \ + typedef typename std::remove_cv::type>::type Char;\ static FMT_CONSTEXPR pointer data() { return s; } \ - static FMT_CONSTEXPR size_t size() { return sizeof(s); } \ - explicit operator fmt::string_view() const { return s; } \ + static FMT_CONSTEXPR size_t size() { return sizeof(s) / sizeof(Char); } \ + explicit operator fmt::basic_string_view() const { return s; } \ }; \ return S{}; \ }() diff --git a/test/format-test.cc b/test/format-test.cc index d6bbd19c..697a2ad2 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -1859,6 +1859,7 @@ TEST(FormatTest, UdlTemplate) { EXPECT_EQ("foo", "foo"_format()); EXPECT_EQ(" 42", "{0:10}"_format(42)); EXPECT_EQ("42", fmt::format(FMT_STRING("{}"), 42)); + EXPECT_EQ(L"42", fmt::format(FMT_STRING(L"{}"), 42)); } #endif // FMT_USE_USER_DEFINED_LITERALS @@ -2378,6 +2379,9 @@ TEST(FormatTest, VFormatTo) { std::wstring w; fmt::vformat_to(std::back_inserter(w), L"{}", wargs); EXPECT_EQ(L"42", w); + w.clear(); + fmt::vformat_to(std::back_inserter(w), FMT_STRING(L"{}"), args); + EXPECT_EQ("42", w); } #endif // FMT_USE_CONSTEXPR