19 #if !defined(BOOST_PP_IS_ITERATING) || !BOOST_PP_IS_ITERATING 21 # ifndef IN_QGLIB_SIGNAL_H 22 # error "This file must not be included directly" 27 # include <QtCore/QList> 28 # include <QtCore/QDebug> 36 QTGLIB_EXPORT Value
emit(
void *instance,
const char *signal, Quark detail,
const QList<Value> & args);
38 template <
typename Signature>
52 inline QList<Value> packArguments()
54 return QList<Value>();
57 template <
typename Arg1,
typename... Args>
58 QList<Value> packArguments(
const Arg1 & a1,
const Args & ... args)
60 QList<Value> && result = packArguments(args...);
63 ValueImpl<Arg1>::set(v, a1);
72 template <
typename R,
typename... Args>
73 struct EmitImpl<R (Args...)>
75 static inline R
emit(
void *instance,
const char *signal, Quark detail,
const Args & ... args)
78 Value && returnValue = Private::emit(instance, signal, detail, packArguments(args...));
79 return ValueImpl<R>::get(returnValue);
80 }
catch(
const std::exception & e) {
81 qCritical() <<
"Error during emission of signal" << signal <<
":" << e.what();
87 template <
typename... Args>
88 struct EmitImpl<void (Args...)>
90 static inline void emit(
void *instance,
const char *signal, Quark detail,
const Args & ... args)
93 Value && returnValue = Private::emit(instance, signal, detail, packArguments(args...));
95 if (returnValue.isValid()) {
96 qWarning() <<
"Ignoring return value from emission of signal" << signal;
98 }
catch(
const std::exception & e) {
99 qCritical() <<
"Error during emission of signal" << signal <<
":" << e.what();
110 template <
typename R,
typename... Args>
111 R
emit(
void *instance,
const char *detailedSignal,
const Args & ... args)
113 return Private::EmitImpl<R (Args...)>
::emit(instance, detailedSignal,
Quark(), args...);
116 template <
typename R,
typename... Args>
119 return Private::EmitImpl<R (Args...)>
::emit(instance, signal, detail, args...);
126 # else //QGLIB_HAVE_CXX0X 128 # include <boost/preprocessor.hpp> 131 # define BOOST_PP_ITERATION_PARAMS_1 (3,(0, QGLIB_SIGNAL_MAX_ARGS, "QGlib/emitimpl.h")) 132 # include BOOST_PP_ITERATE() 133 # undef BOOST_PP_ITERATION_PARAMS_1 135 # endif //QGLIB_HAVE_CXX0X 138 #else // !defined(BOOST_PP_IS_ITERATING) || !BOOST_PP_IS_ITERATING 148 # define QGLIB_SIGNAL_IMPL_NUM_ARGS \ 151 # define QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS \ 152 BOOST_PP_ENUM_TRAILING_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, typename A) 154 # define QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS \ 155 BOOST_PP_ENUM_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, typename A) 157 # define QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_ARGS \ 158 BOOST_PP_ENUM_TRAILING_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, A) 160 # define QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS \ 161 BOOST_PP_ENUM_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, A) 163 # define QGLIB_SIGNAL_IMPL_FUNCTION_PARAMS \ 164 BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, const A, & a) 166 # define QGLIB_SIGNAL_IMPL_FUNCTION_ARGS \ 167 BOOST_PP_ENUM_TRAILING_PARAMS(QGLIB_SIGNAL_IMPL_NUM_ARGS, a) 175 # define QGLIB_SIGNAL_IMPL_PACK_ARGS_STEP(z, n, list) \ 179 ValueImpl<A##n>::set(v, a##n); \ 183 # define QGLIB_SIGNAL_IMPL_PACK_ARGS(list) \ 184 BOOST_PP_REPEAT(QGLIB_SIGNAL_IMPL_NUM_ARGS, QGLIB_SIGNAL_IMPL_PACK_ARGS_STEP, list) 186 template <
typename R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS>
187 struct EmitImpl<R (QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS)>
189 static inline R
emit(
void *instance,
const char *signal,
Quark detail
190 QGLIB_SIGNAL_IMPL_FUNCTION_PARAMS)
194 QGLIB_SIGNAL_IMPL_PACK_ARGS(values)
195 Value returnValue = Private::emit(instance, signal, detail, values);
197 }
catch(
const std::exception & e) {
198 qCritical() <<
"Error during emission of signal" << signal <<
":" << e.what();
204 template <QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS>
205 struct EmitImpl<void (QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS)>
207 static inline void emit(
void *instance,
const char *signal,
Quark detail
208 QGLIB_SIGNAL_IMPL_FUNCTION_PARAMS)
212 QGLIB_SIGNAL_IMPL_PACK_ARGS(values)
213 Value returnValue = Private::emit(instance, signal, detail, values);
215 qWarning() <<
"Ignoring return value from emission of signal" << signal;
217 }
catch(
const std::exception & e) {
218 qCritical() <<
"Error during emission of signal" << signal <<
":" << e.what();
223 # undef QGLIB_SIGNAL_IMPL_PACK_ARGS 224 # undef QGLIB_SIGNAL_IMPL_PACK_ARGS_STEP 232 template <
typename R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS>
233 R
emit(
void *instance,
const char *detailedSignal QGLIB_SIGNAL_IMPL_FUNCTION_PARAMS)
235 return Private::EmitImpl<R (QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS)>
236 ::emit(instance, detailedSignal,
Quark() QGLIB_SIGNAL_IMPL_FUNCTION_ARGS);
239 template <
typename R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS>
240 R
emitWithDetail(
void *instance,
const char *signal,
Quark detail QGLIB_SIGNAL_IMPL_FUNCTION_PARAMS)
242 return Private::EmitImpl<R (QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS)>
243 ::emit(instance, signal, detail QGLIB_SIGNAL_IMPL_FUNCTION_ARGS);
250 # undef QGLIB_SIGNAL_IMPL_FUNCTION_ARGS 251 # undef QGLIB_SIGNAL_IMPL_FUNCTION_PARAMS 252 # undef QGLIB_SIGNAL_IMPL_TEMPLATE_ARGS 253 # undef QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_ARGS 254 # undef QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS 255 # undef QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS 256 # undef QGLIB_SIGNAL_IMPL_NUM_ARGS 258 #endif // !defined(BOOST_PP_IS_ITERATING) || !BOOST_PP_IS_ITERATING
Wrappers for Glib and GObject classes.
R emitWithDetail(void *instance, const char *signal, Quark detail, const Args &...args)
Wrapper class for GValue.
R emit(void *instance, const char *detailedSignal, const Args &...args)
Wrapper class for GQuark.