mirror of
https://github.com/fmtlib/fmt.git
synced 2025-03-28 05:37:01 +00:00
Detemplatize parse
This commit is contained in:
parent
7e3aa6d982
commit
8c4cfab57a
@ -1006,7 +1006,7 @@ struct format_specs : basic_specs {
|
|||||||
* You can use the `format_parse_context` type alias for `char` instead.
|
* You can use the `format_parse_context` type alias for `char` instead.
|
||||||
*/
|
*/
|
||||||
FMT_EXPORT
|
FMT_EXPORT
|
||||||
template <typename Char> class parse_context {
|
template <typename Char = char> class parse_context {
|
||||||
private:
|
private:
|
||||||
basic_string_view<Char> format_str_;
|
basic_string_view<Char> format_str_;
|
||||||
int next_arg_id_;
|
int next_arg_id_;
|
||||||
|
@ -2098,7 +2098,7 @@ struct formatter<weekday, Char> : private formatter<std::tm, Char> {
|
|||||||
bool use_tm_formatter_ = false;
|
bool use_tm_formatter_ = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
auto it = ctx.begin(), end = ctx.end();
|
auto it = ctx.begin(), end = ctx.end();
|
||||||
if (it != end && *it == 'L') {
|
if (it != end && *it == 'L') {
|
||||||
++it;
|
++it;
|
||||||
@ -2127,7 +2127,7 @@ struct formatter<day, Char> : private formatter<std::tm, Char> {
|
|||||||
bool use_tm_formatter_ = false;
|
bool use_tm_formatter_ = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
auto it = ctx.begin(), end = ctx.end();
|
auto it = ctx.begin(), end = ctx.end();
|
||||||
use_tm_formatter_ = it != end && *it != '}';
|
use_tm_formatter_ = it != end && *it != '}';
|
||||||
return use_tm_formatter_ ? formatter<std::tm, Char>::parse(ctx) : it;
|
return use_tm_formatter_ ? formatter<std::tm, Char>::parse(ctx) : it;
|
||||||
@ -2152,7 +2152,7 @@ struct formatter<month, Char> : private formatter<std::tm, Char> {
|
|||||||
bool use_tm_formatter_ = false;
|
bool use_tm_formatter_ = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
auto it = ctx.begin(), end = ctx.end();
|
auto it = ctx.begin(), end = ctx.end();
|
||||||
if (it != end && *it == 'L') {
|
if (it != end && *it == 'L') {
|
||||||
++it;
|
++it;
|
||||||
@ -2181,7 +2181,7 @@ struct formatter<year, Char> : private formatter<std::tm, Char> {
|
|||||||
bool use_tm_formatter_ = false;
|
bool use_tm_formatter_ = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
auto it = ctx.begin(), end = ctx.end();
|
auto it = ctx.begin(), end = ctx.end();
|
||||||
use_tm_formatter_ = it != end && *it != '}';
|
use_tm_formatter_ = it != end && *it != '}';
|
||||||
return use_tm_formatter_ ? formatter<std::tm, Char>::parse(ctx) : it;
|
return use_tm_formatter_ ? formatter<std::tm, Char>::parse(ctx) : it;
|
||||||
@ -2205,7 +2205,7 @@ struct formatter<year_month_day, Char> : private formatter<std::tm, Char> {
|
|||||||
bool use_tm_formatter_ = false;
|
bool use_tm_formatter_ = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
auto it = ctx.begin(), end = ctx.end();
|
auto it = ctx.begin(), end = ctx.end();
|
||||||
use_tm_formatter_ = it != end && *it != '}';
|
use_tm_formatter_ = it != end && *it != '}';
|
||||||
return use_tm_formatter_ ? formatter<std::tm, Char>::parse(ctx) : it;
|
return use_tm_formatter_ ? formatter<std::tm, Char>::parse(ctx) : it;
|
||||||
@ -2236,7 +2236,7 @@ struct formatter<std::chrono::duration<Rep, Period>, Char> {
|
|||||||
basic_string_view<Char> format_str_;
|
basic_string_view<Char> format_str_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
auto it = ctx.begin(), end = ctx.end();
|
auto it = ctx.begin(), end = ctx.end();
|
||||||
if (it == end || *it == '}') return it;
|
if (it == end || *it == '}') return it;
|
||||||
|
|
||||||
@ -2321,7 +2321,7 @@ template <typename Char> struct formatter<std::tm, Char> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
auto it = ctx.begin(), end = ctx.end();
|
auto it = ctx.begin(), end = ctx.end();
|
||||||
if (it == end || *it == '}') return it;
|
if (it == end || *it == '}') return it;
|
||||||
|
|
||||||
|
@ -4015,8 +4015,7 @@ template <> struct formatter<bytes> {
|
|||||||
detail::dynamic_format_specs<> specs_;
|
detail::dynamic_format_specs<> specs_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<>& ctx) -> const char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> const char* {
|
|
||||||
return parse_format_specs(ctx.begin(), ctx.end(), specs_, ctx,
|
return parse_format_specs(ctx.begin(), ctx.end(), specs_, ctx,
|
||||||
detail::type::string_type);
|
detail::type::string_type);
|
||||||
}
|
}
|
||||||
@ -4055,8 +4054,7 @@ template <typename T> struct formatter<group_digits_view<T>> : formatter<T> {
|
|||||||
detail::dynamic_format_specs<> specs_;
|
detail::dynamic_format_specs<> specs_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<>& ctx) -> const char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> const char* {
|
|
||||||
return parse_format_specs(ctx.begin(), ctx.end(), specs_, ctx,
|
return parse_format_specs(ctx.begin(), ctx.end(), specs_, ctx,
|
||||||
detail::type::int_type);
|
detail::type::int_type);
|
||||||
}
|
}
|
||||||
@ -4083,8 +4081,7 @@ template <typename T, typename Char> struct nested_view {
|
|||||||
|
|
||||||
template <typename T, typename Char>
|
template <typename T, typename Char>
|
||||||
struct formatter<nested_view<T, Char>, Char> {
|
struct formatter<nested_view<T, Char>, Char> {
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
return ctx.begin();
|
return ctx.begin();
|
||||||
}
|
}
|
||||||
template <typename FormatContext>
|
template <typename FormatContext>
|
||||||
@ -4103,7 +4100,7 @@ template <typename T, typename Char = char> struct nested_formatter {
|
|||||||
public:
|
public:
|
||||||
constexpr nested_formatter() : width_(0) {}
|
constexpr nested_formatter() : width_(0) {}
|
||||||
|
|
||||||
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
auto it = ctx.begin(), end = ctx.end();
|
auto it = ctx.begin(), end = ctx.end();
|
||||||
if (it == end) return it;
|
if (it == end) return it;
|
||||||
auto specs = format_specs();
|
auto specs = format_specs();
|
||||||
|
@ -266,12 +266,12 @@ template <range_format K>
|
|||||||
using range_format_constant = std::integral_constant<range_format, K>;
|
using range_format_constant = std::integral_constant<range_format, K>;
|
||||||
|
|
||||||
// These are not generic lambdas for compatibility with C++11.
|
// These are not generic lambdas for compatibility with C++11.
|
||||||
template <typename ParseContext> struct parse_empty_specs {
|
template <typename Char> struct parse_empty_specs {
|
||||||
template <typename Formatter> FMT_CONSTEXPR void operator()(Formatter& f) {
|
template <typename Formatter> FMT_CONSTEXPR void operator()(Formatter& f) {
|
||||||
f.parse(ctx);
|
f.parse(ctx);
|
||||||
detail::maybe_set_debug_format(f, true);
|
detail::maybe_set_debug_format(f, true);
|
||||||
}
|
}
|
||||||
ParseContext& ctx;
|
parse_context<Char>& ctx;
|
||||||
};
|
};
|
||||||
template <typename FormatContext> struct format_tuple_element {
|
template <typename FormatContext> struct format_tuple_element {
|
||||||
using char_type = typename FormatContext::char_type;
|
using char_type = typename FormatContext::char_type;
|
||||||
@ -327,8 +327,7 @@ struct formatter<Tuple, Char,
|
|||||||
closing_bracket_ = close;
|
closing_bracket_ = close;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
auto it = ctx.begin();
|
auto it = ctx.begin();
|
||||||
auto end = ctx.end();
|
auto end = ctx.end();
|
||||||
if (it != end && detail::to_ascii(*it) == 'n') {
|
if (it != end && detail::to_ascii(*it) == 'n') {
|
||||||
@ -338,7 +337,7 @@ struct formatter<Tuple, Char,
|
|||||||
}
|
}
|
||||||
if (it != end && *it != '}') report_error("invalid format specifier");
|
if (it != end && *it != '}') report_error("invalid format specifier");
|
||||||
ctx.advance_to(it);
|
ctx.advance_to(it);
|
||||||
detail::for_each(formatters_, detail::parse_empty_specs<ParseContext>{ctx});
|
detail::for_each(formatters_, detail::parse_empty_specs<Char>{ctx});
|
||||||
return it;
|
return it;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -449,8 +448,7 @@ struct range_formatter<
|
|||||||
closing_bracket_ = close;
|
closing_bracket_ = close;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
auto it = ctx.begin();
|
auto it = ctx.begin();
|
||||||
auto end = ctx.end();
|
auto end = ctx.end();
|
||||||
detail::maybe_set_debug_format(underlying_, true);
|
detail::maybe_set_debug_format(underlying_, true);
|
||||||
@ -549,8 +547,7 @@ struct formatter<
|
|||||||
detail::string_literal<Char, '}'>{});
|
detail::string_literal<Char, '}'>{});
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
return range_formatter_.parse(ctx);
|
return range_formatter_.parse(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -577,8 +574,7 @@ struct formatter<
|
|||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR formatter() {}
|
FMT_CONSTEXPR formatter() {}
|
||||||
|
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
auto it = ctx.begin();
|
auto it = ctx.begin();
|
||||||
auto end = ctx.end();
|
auto end = ctx.end();
|
||||||
if (it != end) {
|
if (it != end) {
|
||||||
@ -592,7 +588,7 @@ struct formatter<
|
|||||||
}
|
}
|
||||||
ctx.advance_to(it);
|
ctx.advance_to(it);
|
||||||
}
|
}
|
||||||
detail::for_each(formatters_, detail::parse_empty_specs<ParseContext>{ctx});
|
detail::for_each(formatters_, detail::parse_empty_specs<Char>{ctx});
|
||||||
return it;
|
return it;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -637,8 +633,7 @@ struct formatter<
|
|||||||
formatter<string_type, Char> underlying_;
|
formatter<string_type, Char> underlying_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
return underlying_.parse(ctx);
|
return underlying_.parse(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -686,8 +681,7 @@ struct formatter<join_view<It, Sentinel, Char>, Char> {
|
|||||||
public:
|
public:
|
||||||
using nonlocking = void;
|
using nonlocking = void;
|
||||||
|
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> const Char* {
|
|
||||||
return value_formatter_.parse(ctx);
|
return value_formatter_.parse(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -754,8 +748,7 @@ template <typename Char, typename... T> struct tuple_join_view : detail::view {
|
|||||||
|
|
||||||
template <typename Char, typename... T>
|
template <typename Char, typename... T>
|
||||||
struct formatter<tuple_join_view<Char, T...>, Char> {
|
struct formatter<tuple_join_view<Char, T...>, Char> {
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
return do_parse(ctx, std::integral_constant<size_t, sizeof...(T)>());
|
return do_parse(ctx, std::integral_constant<size_t, sizeof...(T)>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -769,17 +762,16 @@ struct formatter<tuple_join_view<Char, T...>, Char> {
|
|||||||
private:
|
private:
|
||||||
std::tuple<formatter<typename std::decay<T>::type, Char>...> formatters_;
|
std::tuple<formatter<typename std::decay<T>::type, Char>...> formatters_;
|
||||||
|
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto do_parse(parse_context<Char>& ctx,
|
||||||
FMT_CONSTEXPR auto do_parse(ParseContext& ctx,
|
|
||||||
std::integral_constant<size_t, 0>)
|
std::integral_constant<size_t, 0>)
|
||||||
-> decltype(ctx.begin()) {
|
-> const Char* {
|
||||||
return ctx.begin();
|
return ctx.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename ParseContext, size_t N>
|
template <size_t N>
|
||||||
FMT_CONSTEXPR auto do_parse(ParseContext& ctx,
|
FMT_CONSTEXPR auto do_parse(parse_context<Char>& ctx,
|
||||||
std::integral_constant<size_t, N>)
|
std::integral_constant<size_t, N>)
|
||||||
-> decltype(ctx.begin()) {
|
-> const Char* {
|
||||||
auto end = ctx.begin();
|
auto end = ctx.begin();
|
||||||
#if FMT_TUPLE_JOIN_SPECIFIERS
|
#if FMT_TUPLE_JOIN_SPECIFIERS
|
||||||
end = std::get<sizeof...(T) - N>(formatters_).parse(ctx);
|
end = std::get<sizeof...(T) - N>(formatters_).parse(ctx);
|
||||||
|
@ -122,7 +122,7 @@ template <typename Char> struct formatter<std::filesystem::path, Char> {
|
|||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR void set_debug_format(bool set = true) { debug_ = set; }
|
FMT_CONSTEXPR void set_debug_format(bool set = true) { debug_ = set; }
|
||||||
|
|
||||||
template <typename ParseContext> FMT_CONSTEXPR auto parse(ParseContext& ctx) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) {
|
||||||
auto it = ctx.begin(), end = ctx.end();
|
auto it = ctx.begin(), end = ctx.end();
|
||||||
if (it == end) return it;
|
if (it == end) return it;
|
||||||
|
|
||||||
@ -235,7 +235,7 @@ struct formatter<std::optional<T>, Char,
|
|||||||
FMT_CONSTEXPR static void maybe_set_debug_format(U&, ...) {}
|
FMT_CONSTEXPR static void maybe_set_debug_format(U&, ...) {}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
template <typename ParseContext> FMT_CONSTEXPR auto parse(ParseContext& ctx) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) {
|
||||||
maybe_set_debug_format(underlying_, true);
|
maybe_set_debug_format(underlying_, true);
|
||||||
return underlying_.parse(ctx);
|
return underlying_.parse(ctx);
|
||||||
}
|
}
|
||||||
@ -281,8 +281,7 @@ template <typename T, typename E, typename Char>
|
|||||||
struct formatter<std::expected<T, E>, Char,
|
struct formatter<std::expected<T, E>, Char,
|
||||||
std::enable_if_t<is_formattable<T, Char>::value &&
|
std::enable_if_t<is_formattable<T, Char>::value &&
|
||||||
is_formattable<E, Char>::value>> {
|
is_formattable<E, Char>::value>> {
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
return ctx.begin();
|
return ctx.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,9 +308,7 @@ FMT_END_NAMESPACE
|
|||||||
FMT_BEGIN_NAMESPACE
|
FMT_BEGIN_NAMESPACE
|
||||||
FMT_EXPORT
|
FMT_EXPORT
|
||||||
template <> struct formatter<std::source_location> {
|
template <> struct formatter<std::source_location> {
|
||||||
template <typename ParseContext> FMT_CONSTEXPR auto parse(ParseContext& ctx) {
|
FMT_CONSTEXPR auto parse(parse_context<>& ctx) { return ctx.begin(); }
|
||||||
return ctx.begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename FormatContext>
|
template <typename FormatContext>
|
||||||
auto format(const std::source_location& loc, FormatContext& ctx) const
|
auto format(const std::source_location& loc, FormatContext& ctx) const
|
||||||
@ -367,8 +364,7 @@ template <typename T, typename C> struct is_variant_formattable {
|
|||||||
|
|
||||||
FMT_EXPORT
|
FMT_EXPORT
|
||||||
template <typename Char> struct formatter<std::monostate, Char> {
|
template <typename Char> struct formatter<std::monostate, Char> {
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
return ctx.begin();
|
return ctx.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -385,8 +381,7 @@ struct formatter<
|
|||||||
Variant, Char,
|
Variant, Char,
|
||||||
std::enable_if_t<std::conjunction_v<
|
std::enable_if_t<std::conjunction_v<
|
||||||
is_variant_like<Variant>, is_variant_formattable<Variant, Char>>>> {
|
is_variant_like<Variant>, is_variant_formattable<Variant, Char>>>> {
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
return ctx.begin();
|
return ctx.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,8 +411,7 @@ FMT_END_NAMESPACE
|
|||||||
FMT_BEGIN_NAMESPACE
|
FMT_BEGIN_NAMESPACE
|
||||||
FMT_EXPORT
|
FMT_EXPORT
|
||||||
template <typename Char> struct formatter<std::error_code, Char> {
|
template <typename Char> struct formatter<std::error_code, Char> {
|
||||||
template <typename ParseContext>
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
|
||||||
return ctx.begin();
|
return ctx.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -508,7 +502,7 @@ template <typename Char>
|
|||||||
struct formatter<std::type_info, Char // DEPRECATED! Mixing code unit types.
|
struct formatter<std::type_info, Char // DEPRECATED! Mixing code unit types.
|
||||||
> {
|
> {
|
||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
return ctx.begin();
|
return ctx.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -529,7 +523,7 @@ struct formatter<
|
|||||||
bool with_typename_ = false;
|
bool with_typename_ = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
auto it = ctx.begin();
|
auto it = ctx.begin();
|
||||||
auto end = ctx.end();
|
auto end = ctx.end();
|
||||||
if (it == end || *it == '}') return it;
|
if (it == end || *it == '}') return it;
|
||||||
@ -657,7 +651,7 @@ template <typename T, typename Char> struct formatter<std::complex<T>, Char> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* {
|
||||||
if (ctx.begin() == ctx.end() || *ctx.begin() == '}') return ctx.begin();
|
if (ctx.begin() == ctx.end() || *ctx.begin() == '}') return ctx.begin();
|
||||||
return parse_format_specs(ctx.begin(), ctx.end(), specs_, ctx,
|
return parse_format_specs(ctx.begin(), ctx.end(), specs_, ctx,
|
||||||
detail::type_constant<T, Char>::value);
|
detail::type_constant<T, Char>::value);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user