Enable compilation for all types

This commit is contained in:
Victor Zverovich
2020-06-12 13:24:49 -07:00
parent 2d71d7e030
commit 16637341b9
2 changed files with 10 additions and 7 deletions

View File

@@ -468,12 +468,8 @@ constexpr auto compile_format_string(S format_str) {
return parse_tail<Args, POS + 2, ID>(make_text(str, POS, 1), format_str); return parse_tail<Args, POS + 2, ID>(make_text(str, POS, 1), format_str);
} else if constexpr (str[POS + 1] == '}') { } else if constexpr (str[POS + 1] == '}') {
using type = get_type<ID, Args>; using type = get_type<ID, Args>;
if constexpr (std::is_same<type, int>::value) { return parse_tail<Args, POS + 2, ID + 1>(field<char_type, type, ID>(),
return parse_tail<Args, POS + 2, ID + 1>(field<char_type, type, ID>(), format_str);
format_str);
} else {
return unknown_format();
}
} else { } else {
return unknown_format(); return unknown_format();
} }
@@ -565,7 +561,7 @@ FMT_INLINE std::basic_string<typename S::char_type> format(S, Args&&... args) {
if (str.size() == 2 && str[0] == '{' && str[1] == '}') if (str.size() == 2 && str[0] == '{' && str[1] == '}')
return fmt::to_string(detail::first(args...)); return fmt::to_string(detail::first(args...));
constexpr auto compiled = compile<Args...>(S()); constexpr auto compiled = compile<Args...>(S());
return format(compiled, std::forward<Args...>(args...)); return format(compiled, std::forward<Args>(args)...);
} }
template <typename OutputIt, typename CompiledFormat, typename... Args, template <typename OutputIt, typename CompiledFormat, typename... Args,

View File

@@ -142,3 +142,10 @@ TEST(CompileTest, EmptyFormatString) {
auto f = fmt::compile<>(""); auto f = fmt::compile<>("");
EXPECT_EQ(fmt::format(f), ""); EXPECT_EQ(fmt::format(f), "");
} }
#ifdef __cpp_if_constexpr
TEST(CompileTest, Basic) {
EXPECT_EQ("42", fmt::format(FMT_COMPILE("{}"), 42));
EXPECT_EQ("foo", fmt::format(FMT_COMPILE("{}"), "foo"));
}
#endif