From 958b5a756e482b368b362ef1fbebbdae3fd59652 Mon Sep 17 00:00:00 2001 From: Andreas Wass Date: Thu, 2 Nov 2017 11:09:49 +0100 Subject: [PATCH] Fix g++ compilation errors --- fmt/format.h | 85 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 33 deletions(-) diff --git a/fmt/format.h b/fmt/format.h index ba6c8935..89d9a6c9 100644 --- a/fmt/format.h +++ b/fmt/format.h @@ -4086,67 +4086,86 @@ void format_arg(fmt::BasicFormatter &f, format_str = end + 1; } -struct ArgConcatNoSeparator -{ +struct ArgConcatNoSeparator { + template + void add_separator(fmt::BasicFormatter&) const {} + + template + void add_separator(fmt::BasicFormatter&) const {} }; template struct ArgConcatSeparator { BasicCStringRef sep; + ArgConcatSeparator(const BasicCStringRef &sep): sep(sep) {} + template + void add_separator(fmt::BasicFormatter &f) const { + f.writer().write(sep); + } }; template -struct ArgConcat: public Separator { - std::tuple a; - ArgConcat(const Separator &sep, Args&&...args): - Separator(sep), a(std::forward(args)...){ +struct ArgConcat { +}; + +template +struct ArgConcat: public Separator { + + ArgConcat(const Separator &sep): Separator(sep) {} + + template + void format(fmt::BasicFormatter &, + const Char *&) const { } - template - std::enable_if_t - format(fmt::BasicFormatter &, - const Char *&) const { + template + void format_first(fmt::BasicFormatter &, + const Char *&) const { + } +}; + +template +struct ArgConcat: public ArgConcat { + A a; + + ArgConcat(const Separator &sep, A a, Args...args): + ArgConcat(sep, args...), + a(a){ } - template - std::enable_if_t::value, void> - format(fmt::BasicFormatter &f, + template + void format(fmt::BasicFormatter &f, const Char *&format_str) const { const Char* save = format_str; + this->add_separator(f); f.format(format_str, - internal::MakeArg >(std::get(a))); - format(f, save); + internal::MakeArg >(a)); + ArgConcat::format(f, save); } - template - std::enable_if_t>::value, void> - format(fmt::BasicFormatter &f, - const Char *&format_str) const { + template + void format_first(fmt::BasicFormatter &f, + const Char *&format_str) const { const Char* save = format_str; - if(I != 0) { - f.writer().write(Separator::sep); - } f.format(format_str, - internal::MakeArg >(std::get(a))); - format(f, save); + internal::MakeArg >(a)); + ArgConcat::format(f, save); } }; template -ArgConcat concat(Args&&...args) { - return ArgConcat{ArgConcatNoSeparator{}, std::forward(args)...}; +ArgConcat concat(Args...args) { + return ArgConcat(ArgConcatNoSeparator(), args...); } template -ArgConcat, Args...> concat_separated(const BasicCStringRef &sep, Args&&...args) { - return ArgConcat, Args...>{ArgConcatSeparator{sep}, std::forward(args)...}; +ArgConcat, Args...> concat_separated(const BasicCStringRef &sep, Args...args) { + return ArgConcat, Args...>(ArgConcatSeparator(sep), args...); } template -ArgConcat, Args...> concat_separated(const BasicCStringRef &sep, Args&&...args) { - return ArgConcat, Args...>{ArgConcatSeparator{sep}, std::forward(args)...}; +ArgConcat, Args...> concat_separated(const BasicCStringRef &sep, Args...args) { + return ArgConcat, Args...>(ArgConcatSeparator(sep), args...); } template @@ -4160,7 +4179,7 @@ void format_arg(fmt::BasicFormatter &f, if (*end != '}') FMT_THROW(FormatError("missing '}' in format string")); - e.format<0>(f, format_str); + e.format_first(f, format_str); format_str = end + 1; } } // namespace fmt