diff options
author | George Kiagiadakis <george.kiagiadakis@collabora.co.uk> | 2010-12-13 15:04:08 +0200 |
---|---|---|
committer | George Kiagiadakis <george.kiagiadakis@collabora.co.uk> | 2010-12-20 13:05:21 +0200 |
commit | d3e8e2d22ed480e427fa1f0f61d3fc3a370b250e (patch) | |
tree | 3b6764233a196cdc0a6ed81e1ee43118d45790f5 | |
parent | c85edea1f9a6d9ea3a4313e692105307564bc3b3 (diff) |
Make the preprocessor macros in signals/slots a bit more readable.
-rw-r--r-- | src/QGlib/connectimpl.h | 52 | ||||
-rw-r--r-- | src/QGlib/emitimpl.h | 34 | ||||
-rw-r--r-- | src/QGlib/signal.h | 30 |
3 files changed, 47 insertions, 69 deletions
diff --git a/src/QGlib/connectimpl.h b/src/QGlib/connectimpl.h index 1921b9f..ebc7960 100644 --- a/src/QGlib/connectimpl.h +++ b/src/QGlib/connectimpl.h @@ -261,20 +261,17 @@ SignalHandler Signal::connect(void *instance, const char *detailedSignal, The concept is based on the implementation of boost::function. */ -# define QGLIB_SIGNAL_IMPL_NUM_ARGS BOOST_PP_ITERATION() +# define QGLIB_SIGNAL_IMPL_NUM_ARGS \ + BOOST_PP_ITERATION() -# define QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS \ - BOOST_PP_ENUM_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, typename A) +# define QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS \ + BOOST_PP_ENUM_TRAILING_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, typename A) -# define QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS \ - BOOST_PP_ENUM_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, A) - -# if QGLIB_SIGNAL_IMPL_NUM_ARGS > 0 -# define QGLIB_SIGNAL_IMPL_COMMA , -# else -# define QGLIB_SIGNAL_IMPL_COMMA -# endif +# define QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_ARGS \ + BOOST_PP_ENUM_TRAILING_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, A) +# define QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS \ + BOOST_PP_ENUM_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, A) namespace QGlib { namespace Private { @@ -282,19 +279,19 @@ namespace Private { //BEGIN ******** boostpp CppClosure ******** # define QGLIB_SIGNAL_IMPL_CPPCLOSUREN \ - BOOST_PP_CAT(CppClosure, QGLIB_SIGNAL_IMPL_NUM_ARGS) - -# define QGLIB_SIGNAL_IMPL_UNPACK_ARGS_STEP(z, n, list) \ - ,list.at(n).get< typename boost::remove_const< typename boost::remove_reference<A ##n>::type >::type >() + BOOST_PP_CAT(CppClosure, QGLIB_SIGNAL_IMPL_NUM_ARGS) # define QGLIB_SIGNAL_IMPL_UNPACK_ARGS_STEP(z, n, list) \ - ,ValueImpl< typename boost::remove_const< typename boost::remove_reference<A ##n>::type >::type >::get(list.at(n)) + ,ValueImpl< \ + typename boost::remove_const< \ + typename boost::remove_reference<A ##n>::type \ + >::type \ + >::get(list.at(n)) # define QGLIB_SIGNAL_IMPL_UNPACK_ARGS(list) \ BOOST_PP_REPEAT(QGLIB_SIGNAL_IMPL_NUM_ARGS, QGLIB_SIGNAL_IMPL_UNPACK_ARGS_STEP, list) -template <typename F, typename R QGLIB_SIGNAL_IMPL_COMMA - QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS> +template <typename F, typename R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS> struct QGLIB_SIGNAL_IMPL_CPPCLOSUREN { class ClosureData : public ClosureDataBase @@ -329,11 +326,9 @@ struct QGLIB_SIGNAL_IMPL_CPPCLOSUREN }; //partial specialization of struct CppClosure to support the CppClosure<R (Args...), F> syntax -template <typename F, typename R QGLIB_SIGNAL_IMPL_COMMA - QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS> +template <typename F, typename R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS> struct CppClosure<R (QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS), F> - : public QGLIB_SIGNAL_IMPL_CPPCLOSUREN< F, R QGLIB_SIGNAL_IMPL_COMMA - QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS > + : public QGLIB_SIGNAL_IMPL_CPPCLOSUREN< F, R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_ARGS > { }; @@ -348,17 +343,16 @@ struct CppClosure<R (QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS), F> //BEGIN ******** bostpp Signal::connect ******** # define QGLIB_SIGNAL_IMPL_BIND_ARGS \ - BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(QGLIB_SIGNAL_IMPL_NUM_ARGS), _) + BOOST_PP_COMMA_IF(QGLIB_SIGNAL_IMPL_NUM_ARGS) \ + BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(QGLIB_SIGNAL_IMPL_NUM_ARGS), _) -template <typename T, typename R QGLIB_SIGNAL_IMPL_COMMA - QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS> +template <typename T, typename R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS> SignalHandler Signal::connect(void *instance, const char *detailedSignal, T *receiver, R (T::*slot)(QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS), ConnectFlags flags) { boost::function<R (QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS)> f - = boost::bind(slot, receiver QGLIB_SIGNAL_IMPL_COMMA - QGLIB_SIGNAL_IMPL_BIND_ARGS); + = boost::bind(slot, receiver QGLIB_SIGNAL_IMPL_BIND_ARGS); ClosurePtr closure = QGlib::Private::CppClosure< R (QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS), @@ -373,9 +367,9 @@ SignalHandler Signal::connect(void *instance, const char *detailedSignal, } //namespace QGlib -# undef QGLIB_SIGNAL_IMPL_COMMA # undef QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS -# undef QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS +# undef QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_ARGS +# undef QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS # undef QGLIB_SIGNAL_IMPL_NUM_ARGS #endif // !defined(BOOST_PP_IS_ITERATING) || !BOOST_PP_IS_ITERATING diff --git a/src/QGlib/emitimpl.h b/src/QGlib/emitimpl.h index 0d295ab..ff69384 100644 --- a/src/QGlib/emitimpl.h +++ b/src/QGlib/emitimpl.h @@ -135,25 +135,26 @@ R Signal::emit(void *instance, const char *detailedSignal, Args&&... args) The concept is based on the implementation of boost::function. */ -# define QGLIB_SIGNAL_IMPL_NUM_ARGS BOOST_PP_ITERATION() +# define QGLIB_SIGNAL_IMPL_NUM_ARGS \ + BOOST_PP_ITERATION() + +# define QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS \ + BOOST_PP_ENUM_TRAILING_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, typename A) # define QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS \ - BOOST_PP_ENUM_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, typename A) + BOOST_PP_ENUM_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, typename A) + +# define QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_ARGS \ + BOOST_PP_ENUM_TRAILING_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, A) # define QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS \ - BOOST_PP_ENUM_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, A) + BOOST_PP_ENUM_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, A) # define QGLIB_SIGNAL_IMPL_FUNCTION_PARAMS \ - BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, A, a) + BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, A, a) # define QGLIB_SIGNAL_IMPL_FUNCTION_ARGS \ - BOOST_PP_ENUM_TRAILING_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, a) - -# if QGLIB_SIGNAL_IMPL_NUM_ARGS > 0 -# define QGLIB_SIGNAL_IMPL_COMMA , -# else -# define QGLIB_SIGNAL_IMPL_COMMA -# endif + BOOST_PP_ENUM_TRAILING_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, a) namespace QGlib { @@ -170,10 +171,9 @@ namespace Private { } # define QGLIB_SIGNAL_IMPL_PACK_ARGS(list) \ - BOOST_PP_REPEAT(QGLIB_SIGNAL_IMPL_NUM_ARGS, QGLIB_SIGNAL_IMPL_PACK_ARGS_STEP, list) + BOOST_PP_REPEAT(QGLIB_SIGNAL_IMPL_NUM_ARGS, QGLIB_SIGNAL_IMPL_PACK_ARGS_STEP, list) -template <typename R QGLIB_SIGNAL_IMPL_COMMA - QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS> +template <typename R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS> struct EmitImpl<R (QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS)> { static inline R emit(void *instance, const char *detailedSignal @@ -219,8 +219,7 @@ struct EmitImpl<void (QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS)> //BEGIN ******** boostpp Signal::emit ******** -template <typename R QGLIB_SIGNAL_IMPL_COMMA - QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS> +template <typename R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS> R Signal::emit(void *instance, const char *detailedSignal QGLIB_SIGNAL_IMPL_FUNCTION_PARAMS) { return QGlib::Private::EmitImpl<R (QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS)> @@ -231,11 +230,12 @@ R Signal::emit(void *instance, const char *detailedSignal QGLIB_SIGNAL_IMPL_FUNC } //namespace QGlib -# undef QGLIB_SIGNAL_IMPL_COMMA # undef QGLIB_SIGNAL_IMPL_FUNCTION_ARGS # undef QGLIB_SIGNAL_IMPL_FUNCTION_PARAMS # undef QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS +# undef QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_ARGS # undef QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS +# undef QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS # undef QGLIB_SIGNAL_IMPL_NUM_ARGS #endif // !defined(BOOST_PP_IS_ITERATING) || !BOOST_PP_IS_ITERATING diff --git a/src/QGlib/signal.h b/src/QGlib/signal.h index e9b7e46..9238dcd 100644 --- a/src/QGlib/signal.h +++ b/src/QGlib/signal.h @@ -207,38 +207,22 @@ public: #else //QGLIB_HAVE_CXX0X - //versions that take no arguments - template <typename R> - static R emit(void *instance, const char *detailedSignal); - - template <typename T, typename R> - static SignalHandler connect(void *instance, const char *detailedSignal, - T *receiver, R (T::*slot)(), ConnectFlags flags = 0); - -# define QGLIB_SIGNAL_TMPL_PARAMS(n) \ - BOOST_PP_ENUM_PARAMS(n, typename A) - -# define QGLIB_SIGNAL_TMPL_ARGS(n) \ - BOOST_PP_ENUM_PARAMS(n, A) - # define QGLIB_SIGNAL_EMIT_DECLARATION(z, n, data) \ - template <typename R, QGLIB_SIGNAL_TMPL_PARAMS(n) > \ - static R emit(void *instance, const char *detailedSignal, QGLIB_SIGNAL_TMPL_ARGS(n)); + template <typename R BOOST_PP_ENUM_TRAILING_PARAMS(n, typename A) > \ + static R emit(void *instance, const char *detailedSignal \ + BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(n, A, a) ); # define QGLIB_SIGNAL_CONNECT_DECLARATION(z, n, data) \ - template <typename T, typename R, QGLIB_SIGNAL_TMPL_PARAMS(n) > \ + template <typename T, typename R BOOST_PP_ENUM_TRAILING_PARAMS(n, typename A) > \ static SignalHandler connect(void *instance, const char *detailedSignal, \ - T *receiver, R (T::*slot)(QGLIB_SIGNAL_TMPL_ARGS(n)), \ + T *receiver, R (T::*slot)(BOOST_PP_ENUM_PARAMS(n, A)), \ ConnectFlags flags = 0); - //versions that take from 1 to QGLIB_SIGNAL_MAX_ARGS arguments - BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(QGLIB_SIGNAL_MAX_ARGS), QGLIB_SIGNAL_EMIT_DECLARATION, dummy) - BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(QGLIB_SIGNAL_MAX_ARGS), QGLIB_SIGNAL_CONNECT_DECLARATION, dummy) + BOOST_PP_REPEAT_FROM_TO(0, BOOST_PP_INC(QGLIB_SIGNAL_MAX_ARGS), QGLIB_SIGNAL_EMIT_DECLARATION, dummy) + BOOST_PP_REPEAT_FROM_TO(0, BOOST_PP_INC(QGLIB_SIGNAL_MAX_ARGS), QGLIB_SIGNAL_CONNECT_DECLARATION, dummy) # undef QGLIB_SIGNAL_CONNECT_DECLARATION # undef QGLIB_SIGNAL_EMIT_DECLARATION -# undef QGLIB_SIGNAL_TMPL_ARGS -# undef QGLIB_SIGNAL_TMPL_PARAMS #endif //QGLIB_HAVE_CXX0X |