From b3287e69e13fabcf7bdc212ad0d44deee23124e3 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 24 Nov 2015 16:46:48 -0500 Subject: [PATCH] Use Boost.Preprocessor to generate C++03 execute() overloads. --- boost/process/config.hpp | 3 ++ boost/process/posix/execute.hpp | 75 +++++++++---------------------- boost/process/windows/execute.hpp | 75 +++++++++---------------------- 3 files changed, 47 insertions(+), 106 deletions(-) diff --git a/boost/process/config.hpp b/boost/process/config.hpp index 7aae4d3..4e3433f 100644 --- a/boost/process/config.hpp +++ b/boost/process/config.hpp @@ -41,6 +41,9 @@ using namespace boost::process::BOOST_PROCESS_PLATFORM::initializers; }}} /** \endcond */ +/// number of initializer arguments execute() can accept +#define BOOST_PROCESS_EXECUTE_INITIALIZERS 10 + #if defined(BOOST_PROCESS_DOXYGEN) /** * \def BOOST_POSIX_API diff --git a/boost/process/posix/execute.hpp b/boost/process/posix/execute.hpp index 2708219..077eb21 100644 --- a/boost/process/posix/execute.hpp +++ b/boost/process/posix/execute.hpp @@ -13,69 +13,38 @@ #include #include #include +#include +#include +#include #include namespace boost { namespace process { namespace posix { -template -child execute(const I0 &i0) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0))); -} +// The following helpers are used to generate C++03 execute() overloads from +// execute(i0) through execute(i0, ..., i(BOOST_PROCESS_EXECUTE_INITIALIZERS-1)). -template -child execute(const I0 &i0, const I1 &i1) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1))); -} +// template are handled by BOOST_PP_ENUM_PARAMS. -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2))); -} +// execute() params 'const I0 &i0, const I1 &i1, ...' +#define execute_param(z, n, data) const I##n &i##n -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3))); -} +// make_tuple() params 'boost::cref(i0), boost::cref(i1), ...' +#define tuple_param(z, n, data) boost::cref(i##n) -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4))); +#define BOOST_PP_LOCAL_MACRO(n) \ +/* */ \ +template \ +/* execute(const I0 &i0, const I1 &i1, ...) */ \ +child execute(BOOST_PP_ENUM(n, execute_param, xx)) \ +{ \ + /* executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), ...); */ \ + return executor()(boost::fusion::make_tuple(BOOST_PP_ENUM(n, tuple_param, xx))); \ } -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5))); -} - -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6))); -} - -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7))); -} - -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8))); -} - -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8, const I9 &i9) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8), boost::cref(i9))); -} +#define BOOST_PP_LOCAL_LIMITS (1, BOOST_PROCESS_EXECUTE_INITIALIZERS) +#include BOOST_PP_LOCAL_ITERATE() +#undef execute_param +#undef tuple_param }}} diff --git a/boost/process/windows/execute.hpp b/boost/process/windows/execute.hpp index 4306752..69bb9a9 100644 --- a/boost/process/windows/execute.hpp +++ b/boost/process/windows/execute.hpp @@ -13,69 +13,38 @@ #include #include #include +#include +#include +#include #include namespace boost { namespace process { namespace windows { -template -child execute(const I0 &i0) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0))); -} +// The following helpers are used to generate C++03 execute() overloads from +// execute(i0) through execute(i0, ..., i(BOOST_PROCESS_EXECUTE_INITIALIZERS-1)). -template -child execute(const I0 &i0, const I1 &i1) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1))); -} +// template are handled by BOOST_PP_ENUM_PARAMS. -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2))); -} +// execute() params 'const I0 &i0, const I1 &i1, ...' +#define execute_param(z, n, data) const I##n &i##n -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3))); -} +// make_tuple() params 'boost::cref(i0), boost::cref(i1), ...' +#define tuple_param(z, n, data) boost::cref(i##n) -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4))); +#define BOOST_PP_LOCAL_MACRO(n) \ +/* */ \ +template \ +/* execute(const I0 &i0, const I1 &i1, ...) */ \ +child execute(BOOST_PP_ENUM(n, execute_param, xx)) \ +{ \ + /* executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), ...); */ \ + return executor()(boost::fusion::make_tuple(BOOST_PP_ENUM(n, tuple_param, xx))); \ } -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5))); -} - -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6))); -} - -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7))); -} - -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8))); -} - -template -child execute(const I0 &i0, const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4, const I5 &i5, const I6 &i6, const I7 &i7, const I8 &i8, const I9 &i9) -{ - return executor()(boost::fusion::make_tuple(boost::cref(i0), boost::cref(i1), boost::cref(i2), boost::cref(i3), boost::cref(i4), boost::cref(i5), boost::cref(i6), boost::cref(i7), boost::cref(i8), boost::cref(i9))); -} +#define BOOST_PP_LOCAL_LIMITS (1, BOOST_PROCESS_EXECUTE_INITIALIZERS) +#include BOOST_PP_LOCAL_ITERATE() +#undef execute_param +#undef tuple_param }}}