From 2f752abe97cfc54e55d352a574612f719d4d7f0a Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Tue, 24 Jun 2014 19:27:26 -0700 Subject: [PATCH] Add FMT_VARIADIC_VOID to emulate variadic functions on old compilers. --- format.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/format.h b/format.h index 04c11e75..9e6eae89 100644 --- a/format.h +++ b/format.h @@ -864,6 +864,35 @@ public: } }; +// Generates a comma-separated list by applying f to numbers 1..n. +#define FMT_GEN(n, f) FMT_GEN##n(f) +#define FMT_GEN1(f) f(1) +#define FMT_GEN2(f) FMT_GEN1(f), f(2) +#define FMT_GEN3(f) FMT_GEN2(f), f(3) +#define FMT_GEN4(f) FMT_GEN3(f), f(4) +#define FMT_GEN5(f) FMT_GEN4(f), f(5) +#define FMT_GEN6(f) FMT_GEN5(f), f(6) +#define FMT_GEN7(f) FMT_GEN6(f), f(7) +#define FMT_GEN8(f) FMT_GEN7(f), f(8) +#define FMT_GEN9(f) FMT_GEN8(f), f(9) + +#define FMT_MAKE_TEMPLATE_ARG(n) typename T##n +#define FMT_MAKE_ARG(n) const T##n &v##n +#define FMT_MAKE_REF(n) MakeArg(v##n) + +#define FMT_TEMPLATE(func_name, n) \ + template \ + inline void func_name(BasicStringRef format, FMT_GEN(n, FMT_MAKE_ARG)) { \ + const fmt::internal::ArgInfo args[] = {FMT_GEN(n, FMT_MAKE_REF)}; \ + func_name(format, fmt::ArgList(args, sizeof(args) / sizeof(*args))); \ + } + +// Defines a variadic function returning void. +#define FMT_VARIADIC_VOID(func_name) \ + FMT_TEMPLATE(format, 1) FMT_TEMPLATE(format, 2) FMT_TEMPLATE(format, 3) \ + FMT_TEMPLATE(format, 4) FMT_TEMPLATE(format, 5) FMT_TEMPLATE(format, 6) \ + FMT_TEMPLATE(format, 7) FMT_TEMPLATE(format, 8) FMT_TEMPLATE(format, 9) + /** \rst This template provides operations for formatting and writing data into @@ -1249,6 +1278,9 @@ class BasicWriter { BasicArg<> arg_array[internal::NonZero::VALUE] = {args...}; this->printf(format, ArgList(arg_array, sizeof...(Args))); } + +#else + FMT_VARIADIC_VOID(format) #endif template