Skip to content

Commit

Permalink
Replace template recursion with array initialization
Browse files Browse the repository at this point in the history
  • Loading branch information
dean0x7d committed Dec 13, 2015
1 parent 9222f0e commit 204bb39
Showing 1 changed file with 23 additions and 32 deletions.
55 changes: 23 additions & 32 deletions format.h
Original file line number Diff line number Diff line change
Expand Up @@ -1921,7 +1921,9 @@ struct ArgArray {
enum { SIZE = N + (N == 0 || N >= ArgList::MAX_PACKED_ARGS ? 1 : 0) };

typedef typename Conditional<
(N < ArgList::MAX_PACKED_ARGS), Value, Arg>::type Type[SIZE];
(N < ArgList::MAX_PACKED_ARGS), Value, Arg>::type Element;

typedef Element Type[SIZE];
};

#if FMT_USE_VARIADIC_TEMPLATES
Expand All @@ -1930,32 +1932,15 @@ inline uint64_t make_type(const Arg &first, const Args & ... tail) {
return make_type(first) | (make_type(tail...) << 4);
}

template <typename Formatter>
inline void store_args(Arg *args) {
*args = MakeArg<Formatter>();
}

template <typename Formatter, typename T, typename... Args>
inline void store_args(Arg *args, const T &arg, const Args & ... tail) {
*args = MakeArg<Formatter>(arg);
store_args<Formatter>(args + 1, tail...);
}
template <typename Formatter, typename Element>
struct SelectMake;

template <typename Formatter>
inline void store_args(Value *) {}
struct SelectMake<Formatter, Value> { typedef MakeValue<Formatter> Make; };

template <typename Formatter, typename T, typename... Args>
inline void store_args(Value *args, const T &arg, const Args & ... tail) {
*args = MakeValue<Formatter>(arg);
store_args<Formatter>(args + 1, tail...);
}
template <typename Formatter>
struct SelectMake<Formatter, Arg> { typedef MakeArg<Formatter> Make; };

template <typename Formatter, typename... Args>
ArgList make_arg_list(typename ArgArray<sizeof...(Args)>::Type array,
const Args & ... args) {
store_args<Formatter>(array, args...);
return ArgList(make_type(args...), array);
}
#else

struct ArgType {
Expand Down Expand Up @@ -2023,18 +2008,22 @@ class FormatBuf : public std::basic_streambuf<Char> {
# define FMT_VARIADIC_VOID(func, arg_type) \
template <typename... Args> \
void func(arg_type arg0, const Args & ... args) { \
typename fmt::internal::ArgArray<sizeof...(Args)>::Type array; \
func(arg0, fmt::internal::make_arg_list< \
fmt::BasicFormatter<Char> >(array, args...)); \
typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \
typename ArgArray::Type array{ \
typename fmt::internal::SelectMake<fmt::BasicFormatter<Char>, \
typename ArgArray::Element>::Make(args)...}; \
func(arg0, fmt::ArgList(fmt::internal::make_type(args...), array)); \
}

// Defines a variadic constructor.
# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \
template <typename... Args> \
ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \
typename fmt::internal::ArgArray<sizeof...(Args)>::Type array; \
func(arg0, arg1, fmt::internal::make_arg_list< \
fmt::BasicFormatter<Char> >(array, args...)); \
typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \
typename ArgArray::Type array{ \
typename fmt::internal::SelectMake<fmt::BasicFormatter<Char>, \
typename ArgArray::Element>::Make(args)...}; \
func(arg0, arg1, fmt::ArgList(fmt::internal::make_type(args...), array)); \
}

#else
Expand Down Expand Up @@ -3253,10 +3242,12 @@ void arg(WStringRef, const internal::NamedArg<Char>&) FMT_DELETED_OR_UNDEFINED;
template <typename... Args> \
ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \
const Args & ... args) { \
typename fmt::internal::ArgArray<sizeof...(Args)>::Type array; \
typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \
typename ArgArray::Type array{ \
typename fmt::internal::SelectMake<fmt::BasicFormatter<Char>, \
typename ArgArray::Element>::Make(args)...}; \
call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), \
fmt::internal::make_arg_list< \
fmt::BasicFormatter<Char> >(array, args...)); \
fmt::ArgList(fmt::internal::make_type(args...), array)); \
}
#else
// Defines a wrapper for a function taking __VA_ARGS__ arguments
Expand Down

0 comments on commit 204bb39

Please sign in to comment.