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...);
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
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);
196 return ValueImpl<R>::get(returnValue);
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);
214 if (returnValue.isValid()) {
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
Wrapper class for GQuark.
Wrappers for Glib and GObject classes.
R emitWithDetail(void *instance, const char *signal, Quark detail, const Args &... args)
R emit(void *instance, const char *detailedSignal, const Args &... args)