Fix g++ compilation errors
This commit is contained in:
parent
ce25d969d6
commit
958b5a756e
85
fmt/format.h
85
fmt/format.h
@ -4086,67 +4086,86 @@ void format_arg(fmt::BasicFormatter<Char, ArgFormatter> &f,
|
|||||||
format_str = end + 1;
|
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>
|
template<typename Char>
|
||||||
struct ArgConcatSeparator {
|
struct ArgConcatSeparator {
|
||||||
BasicCStringRef<Char> sep;
|
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>
|
template<typename Separator, typename ...Args>
|
||||||
struct ArgConcat: public Separator {
|
struct ArgConcat {
|
||||||
std::tuple<Args...> a;
|
};
|
||||||
ArgConcat(const Separator &sep, Args&&...args):
|
|
||||||
Separator(sep), a(std::forward<Args>(args)...){
|
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>
|
template<typename Char, typename ArgFormatter>
|
||||||
std::enable_if_t<I == sizeof...(Args), void>
|
void format_first(fmt::BasicFormatter<Char, ArgFormatter> &,
|
||||||
format(fmt::BasicFormatter<Char, ArgFormatter> &,
|
const Char *&) const {
|
||||||
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>
|
template<typename Char, typename ArgFormatter>
|
||||||
std::enable_if_t<I < sizeof...(Args) &&
|
void format(fmt::BasicFormatter<Char, ArgFormatter> &f,
|
||||||
std::is_same<Separator, ArgConcatNoSeparator>::value, void>
|
|
||||||
format(fmt::BasicFormatter<Char, ArgFormatter> &f,
|
|
||||||
const Char *&format_str) const {
|
const Char *&format_str) const {
|
||||||
const Char* save = format_str;
|
const Char* save = format_str;
|
||||||
|
this->add_separator(f);
|
||||||
f.format(format_str,
|
f.format(format_str,
|
||||||
internal::MakeArg<fmt::BasicFormatter<Char, ArgFormatter> >(std::get<I>(a)));
|
internal::MakeArg<fmt::BasicFormatter<Char, ArgFormatter> >(a));
|
||||||
format<I+1>(f, save);
|
ArgConcat<Separator, Args...>::format(f, save);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t I, typename Char, typename ArgFormatter>
|
template<typename Char, typename ArgFormatter>
|
||||||
std::enable_if_t<I < sizeof...(Args) &&
|
void format_first(fmt::BasicFormatter<Char, ArgFormatter> &f,
|
||||||
std::is_same<Separator,ArgConcatSeparator<Char>>::value, void>
|
const Char *&format_str) const {
|
||||||
format(fmt::BasicFormatter<Char, ArgFormatter> &f,
|
|
||||||
const Char *&format_str) const {
|
|
||||||
const Char* save = format_str;
|
const Char* save = format_str;
|
||||||
if(I != 0) {
|
|
||||||
f.writer().write(Separator::sep);
|
|
||||||
}
|
|
||||||
f.format(format_str,
|
f.format(format_str,
|
||||||
internal::MakeArg<fmt::BasicFormatter<Char, ArgFormatter> >(std::get<I>(a)));
|
internal::MakeArg<fmt::BasicFormatter<Char, ArgFormatter> >(a));
|
||||||
format<I+1>(f, save);
|
ArgConcat<Separator, Args...>::format(f, save);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename ...Args>
|
template<typename ...Args>
|
||||||
ArgConcat<ArgConcatNoSeparator, Args...> concat(Args&&...args) {
|
ArgConcat<ArgConcatNoSeparator, Args...> concat(Args...args) {
|
||||||
return ArgConcat<ArgConcatNoSeparator, Args...>{ArgConcatNoSeparator{}, std::forward<Args>(args)...};
|
return ArgConcat<ArgConcatNoSeparator, Args...>(ArgConcatNoSeparator(), args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ...Args>
|
template<typename ...Args>
|
||||||
ArgConcat<ArgConcatSeparator<char>, Args...> concat_separated(const BasicCStringRef<char> &sep, Args&&...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)...};
|
return ArgConcat<ArgConcatSeparator<char>, Args...>(ArgConcatSeparator<char>(sep), args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ...Args>
|
template<typename ...Args>
|
||||||
ArgConcat<ArgConcatSeparator<wchar_t>, Args...> concat_separated(const BasicCStringRef<wchar_t> &sep, 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}, std::forward<Args>(args)...};
|
return ArgConcat<ArgConcatSeparator<wchar_t>, Args...>(ArgConcatSeparator<wchar_t>(sep), args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ArgFormatter, typename Char, typename Separator, typename ...Args>
|
template<typename ArgFormatter, typename Char, typename Separator, typename ...Args>
|
||||||
@ -4160,7 +4179,7 @@ void format_arg(fmt::BasicFormatter<Char, ArgFormatter> &f,
|
|||||||
if (*end != '}')
|
if (*end != '}')
|
||||||
FMT_THROW(FormatError("missing '}' in format string"));
|
FMT_THROW(FormatError("missing '}' in format string"));
|
||||||
|
|
||||||
e.format<0>(f, format_str);
|
e.format_first(f, format_str);
|
||||||
format_str = end + 1;
|
format_str = end + 1;
|
||||||
}
|
}
|
||||||
} // namespace fmt
|
} // namespace fmt
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user