Merge branch 'master' into dgbx
This commit is contained in:
commit
c05c675ec7
@ -493,7 +493,9 @@ System APIs
|
|||||||
========================
|
========================
|
||||||
|
|
||||||
``fmt/ostream.h`` provides ``std::ostream`` support including formatting of
|
``fmt/ostream.h`` provides ``std::ostream`` support including formatting of
|
||||||
user-defined types that have an overloaded insertion operator (``operator<<``)::
|
user-defined types that have an overloaded insertion operator (``operator<<``).
|
||||||
|
In order to make a type formattable via ``std::ostream`` you should provide a
|
||||||
|
``formatter`` specialization inherited from ``ostream_formatter``:
|
||||||
|
|
||||||
#include <fmt/ostream.h>
|
#include <fmt/ostream.h>
|
||||||
|
|
||||||
@ -507,14 +509,11 @@ user-defined types that have an overloaded insertion operator (``operator<<``)::
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <> struct fmt::formatter<date> : ostream_formatter<date> {};
|
template <> struct fmt::formatter<date> : ostream_formatter {};
|
||||||
|
|
||||||
std::string s = fmt::format("The date is {}", date(2012, 12, 9));
|
std::string s = fmt::format("The date is {}", date(2012, 12, 9));
|
||||||
// s == "The date is 2012-12-9"
|
// s == "The date is 2012-12-9"
|
||||||
|
|
||||||
{fmt} only supports insertion operators that are defined in the same namespaces
|
|
||||||
as the types they format and can be found with the argument-dependent lookup.
|
|
||||||
|
|
||||||
.. doxygenfunction:: print(std::basic_ostream<Char> &os, const S &format_str, Args&&... args)
|
.. doxygenfunction:: print(std::basic_ostream<Char> &os, const S &format_str, Args&&... args)
|
||||||
|
|
||||||
.. _printf-api:
|
.. _printf-api:
|
||||||
|
|||||||
@ -1431,8 +1431,8 @@ template <typename Context> struct arg_mapper {
|
|||||||
!std::is_const<remove_reference_t<T>>::value ||
|
!std::is_const<remove_reference_t<T>>::value ||
|
||||||
has_fallback_formatter<U, char_type>::value> {};
|
has_fallback_formatter<U, char_type>::value> {};
|
||||||
|
|
||||||
#if FMT_MSC_VER != 0 && FMT_MSC_VER < 1910
|
#if (FMT_MSC_VER != 0 && FMT_MSC_VER < 1910) || FMT_ICC_VERSION != 0
|
||||||
// Workaround a bug in MSVC.
|
// Workaround a bug in MSVC and Intel (Issue 2746).
|
||||||
template <typename T> FMT_CONSTEXPR FMT_INLINE auto do_map(T&& val) -> T& {
|
template <typename T> FMT_CONSTEXPR FMT_INLINE auto do_map(T&& val) -> T& {
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
@ -2282,7 +2282,7 @@ FMT_CONSTEXPR auto parse_align(const Char* begin, const Char* end,
|
|||||||
FMT_ASSERT(begin != end, "");
|
FMT_ASSERT(begin != end, "");
|
||||||
auto align = align::none;
|
auto align = align::none;
|
||||||
auto p = begin + code_point_length(begin);
|
auto p = begin + code_point_length(begin);
|
||||||
if (p >= end) p = begin;
|
if (end - p <= 0) p = begin;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
switch (to_ascii(*p)) {
|
switch (to_ascii(*p)) {
|
||||||
case '<':
|
case '<':
|
||||||
|
|||||||
@ -304,7 +304,8 @@ struct formatter<TupleT, Char, enable_if_t<fmt::is_tuple_like<TupleT>::value>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename FormatContext = format_context>
|
template <typename FormatContext = format_context>
|
||||||
auto format(const TupleT& values, FormatContext& ctx) -> decltype(ctx.out()) {
|
auto format(const TupleT& values, FormatContext& ctx) const
|
||||||
|
-> decltype(ctx.out()) {
|
||||||
auto out = ctx.out();
|
auto out = ctx.out();
|
||||||
*out++ = '(';
|
*out++ = '(';
|
||||||
detail::for_each(values, format_each<FormatContext>{0, out});
|
detail::for_each(values, format_each<FormatContext>{0, out});
|
||||||
@ -385,7 +386,7 @@ struct formatter<
|
|||||||
FMT_ENABLE_IF(
|
FMT_ENABLE_IF(
|
||||||
std::is_same<U, conditional_t<detail::has_const_begin_end<R>::value,
|
std::is_same<U, conditional_t<detail::has_const_begin_end<R>::value,
|
||||||
const R, R>>::value)>
|
const R, R>>::value)>
|
||||||
auto format(U& range, FormatContext& ctx) -> decltype(ctx.out()) {
|
auto format(U& range, FormatContext& ctx) const -> decltype(ctx.out()) {
|
||||||
#ifdef FMT_DEPRECATED_BRACED_RANGES
|
#ifdef FMT_DEPRECATED_BRACED_RANGES
|
||||||
Char prefix = '{';
|
Char prefix = '{';
|
||||||
Char postfix = '}';
|
Char postfix = '}';
|
||||||
@ -435,7 +436,7 @@ struct formatter<
|
|||||||
FMT_ENABLE_IF(
|
FMT_ENABLE_IF(
|
||||||
std::is_same<U, conditional_t<detail::has_const_begin_end<T>::value,
|
std::is_same<U, conditional_t<detail::has_const_begin_end<T>::value,
|
||||||
const T, T>>::value)>
|
const T, T>>::value)>
|
||||||
auto format(U& map, FormatContext& ctx) -> decltype(ctx.out()) {
|
auto format(U& map, FormatContext& ctx) const -> decltype(ctx.out()) {
|
||||||
auto out = ctx.out();
|
auto out = ctx.out();
|
||||||
*out++ = '{';
|
*out++ = '{';
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user