Adding a put(formatter, object) overload too.

This commit is contained in:
Barry Revzin 2022-01-30 01:21:33 -06:00
parent 931cfcfbbe
commit a02f7b84c7
2 changed files with 37 additions and 3 deletions

View File

@ -1778,11 +1778,18 @@ template <typename OutputIt, typename Char> class basic_format_context {
FMT_CONSTEXPR auto put(char_type c) -> iterator {
*out_++ = c;
return out;
return out_;
}
FMT_CONSTEXPR auto put(basic_string_view<char_type> sv) -> iterator {
detail::copy_str<char_type>(sv.data(), sv.data() + sv.size(), out);
return out;
detail::copy_str<char_type>(sv.data(), sv.data() + sv.size(), out_);
return out_;
}
template <typename T, typename U,
FMT_ENABLE_IF(std::is_same<T, std::remove_const_t<U>>::value)>
FMT_CONSTEXPR auto put(formatter<T>& f, U& object) -> iterator {
advance_to(f.format(object, *this));
return out_;
}
FMT_CONSTEXPR auto locale() -> detail::locale_ref { return loc_; }

View File

@ -2194,3 +2194,30 @@ TEST(format_int_test, format_int) {
os << max_value<int64_t>();
EXPECT_EQ(os.str(), fmt::format_int(max_value<int64_t>()).str());
}
struct put_on_the_ritz {
int i;
};
FMT_BEGIN_NAMESPACE
template <> struct formatter<put_on_the_ritz> {
formatter<int> underlying;
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
return underlying.parse(ctx);
}
auto format(put_on_the_ritz r, format_context& ctx) -> decltype(ctx.out()) {
ctx.put('{');
ctx.put(".i=");
ctx.put(underlying, r.i);
ctx.put('}');
return ctx.out();
}
};
FMT_END_NAMESPACE
TEST(format_test, format_context_put) {
EXPECT_EQ(fmt::format("[{}]", put_on_the_ritz{42}), "[{.i=42}]");
EXPECT_EQ(fmt::format("[{:#x}]", put_on_the_ritz{42}), "[{.i=0x2a}]");
}