Fix g++ compilation errors

This commit is contained in:
Andreas Wass 2017-11-02 11:09:49 +01:00
parent ce25d969d6
commit 958b5a756e

View File

@ -4086,67 +4086,86 @@ void format_arg(fmt::BasicFormatter<Char, ArgFormatter> &f,
format_str = end + 1;
}
struct ArgConcatNoSeparator
{
struct ArgConcatNoSeparator {
template<typename ArgFormatter>
void add_separator(fmt::BasicFormatter<char, ArgFormatter>&) const {}
template<typename ArgFormatter>
void add_separator(fmt::BasicFormatter<wchar_t, ArgFormatter>&) const {}
};
template<typename Char>
struct ArgConcatSeparator {
BasicCStringRef<Char> sep;
ArgConcatSeparator(const BasicCStringRef<Char> &sep): sep(sep) {}
template<typename ArgFormatter>
void add_separator(fmt::BasicFormatter<Char, ArgFormatter> &f) const {
f.writer().write(sep);
}
};
template<typename Separator, typename ...Args>
struct ArgConcat: public Separator {
std::tuple<Args...> a;
ArgConcat(const Separator &sep, Args&&...args):
Separator(sep), a(std::forward<Args>(args)...){
struct ArgConcat {
};
template<typename Separator>
struct ArgConcat<Separator>: public Separator {
ArgConcat(const Separator &sep): Separator(sep) {}
template<typename Char, typename ArgFormatter>
void format(fmt::BasicFormatter<Char, ArgFormatter> &,
const Char *&) const {
}
template<std::size_t I, typename Char, typename ArgFormatter>
std::enable_if_t<I == sizeof...(Args), void>
format(fmt::BasicFormatter<Char, ArgFormatter> &,
const Char *&) const {
template<typename Char, typename ArgFormatter>
void format_first(fmt::BasicFormatter<Char, ArgFormatter> &,
const Char *&) const {
}
};
template<typename Separator, typename A, typename ...Args>
struct ArgConcat<Separator, A, Args...>: public ArgConcat<Separator, Args...> {
A a;
ArgConcat(const Separator &sep, A a, Args...args):
ArgConcat<Separator, Args...>(sep, args...),
a(a){
}
template<std::size_t I, typename Char, typename ArgFormatter>
std::enable_if_t<I < sizeof...(Args) &&
std::is_same<Separator, ArgConcatNoSeparator>::value, void>
format(fmt::BasicFormatter<Char, ArgFormatter> &f,
template<typename Char, typename ArgFormatter>
void format(fmt::BasicFormatter<Char, ArgFormatter> &f,
const Char *&format_str) const {
const Char* save = format_str;
this->add_separator(f);
f.format(format_str,
internal::MakeArg<fmt::BasicFormatter<Char, ArgFormatter> >(std::get<I>(a)));
format<I+1>(f, save);
internal::MakeArg<fmt::BasicFormatter<Char, ArgFormatter> >(a));
ArgConcat<Separator, Args...>::format(f, save);
}
template<std::size_t I, typename Char, typename ArgFormatter>
std::enable_if_t<I < sizeof...(Args) &&
std::is_same<Separator,ArgConcatSeparator<Char>>::value, void>
format(fmt::BasicFormatter<Char, ArgFormatter> &f,
const Char *&format_str) const {
template<typename Char, typename ArgFormatter>
void format_first(fmt::BasicFormatter<Char, ArgFormatter> &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<fmt::BasicFormatter<Char, ArgFormatter> >(std::get<I>(a)));
format<I+1>(f, save);
internal::MakeArg<fmt::BasicFormatter<Char, ArgFormatter> >(a));
ArgConcat<Separator, Args...>::format(f, save);
}
};
template<typename ...Args>
ArgConcat<ArgConcatNoSeparator, Args...> concat(Args&&...args) {
return ArgConcat<ArgConcatNoSeparator, Args...>{ArgConcatNoSeparator{}, std::forward<Args>(args)...};
ArgConcat<ArgConcatNoSeparator, Args...> concat(Args...args) {
return ArgConcat<ArgConcatNoSeparator, Args...>(ArgConcatNoSeparator(), args...);
}
template<typename ...Args>
ArgConcat<ArgConcatSeparator<char>, Args...> concat_separated(const BasicCStringRef<char> &sep, Args&&...args) {
return ArgConcat<ArgConcatSeparator<char>, Args...>{ArgConcatSeparator<char>{sep}, std::forward<Args>(args)...};
ArgConcat<ArgConcatSeparator<char>, Args...> concat_separated(const BasicCStringRef<char> &sep, Args...args) {
return ArgConcat<ArgConcatSeparator<char>, Args...>(ArgConcatSeparator<char>(sep), args...);
}
template<typename ...Args>
ArgConcat<ArgConcatSeparator<wchar_t>, Args...> concat_separated(const BasicCStringRef<wchar_t> &sep, Args&&...args) {
return ArgConcat<ArgConcatSeparator<wchar_t>, Args...>{ArgConcatSeparator<wchar_t>{sep}, std::forward<Args>(args)...};
ArgConcat<ArgConcatSeparator<wchar_t>, Args...> concat_separated(const BasicCStringRef<wchar_t> &sep, Args...args) {
return ArgConcat<ArgConcatSeparator<wchar_t>, Args...>(ArgConcatSeparator<wchar_t>(sep), args...);
}
template<typename ArgFormatter, typename Char, typename Separator, typename ...Args>
@ -4160,7 +4179,7 @@ void format_arg(fmt::BasicFormatter<Char, ArgFormatter> &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