summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.co.uk>2010-12-13 15:04:08 +0200
committerGeorge Kiagiadakis <george.kiagiadakis@collabora.co.uk>2010-12-20 13:05:21 +0200
commitd3e8e2d22ed480e427fa1f0f61d3fc3a370b250e (patch)
tree3b6764233a196cdc0a6ed81e1ee43118d45790f5
parentc85edea1f9a6d9ea3a4313e692105307564bc3b3 (diff)
Make the preprocessor macros in signals/slots a bit more readable.
-rw-r--r--src/QGlib/connectimpl.h52
-rw-r--r--src/QGlib/emitimpl.h34
-rw-r--r--src/QGlib/signal.h30
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