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>
36QTGLIB_EXPORT Value emit(
void *instance,
const char *signal, Quark detail,
const QList<Value> & args);
38template <
typename Signature>
52inline QList<Value> packArguments()
54 return QList<Value>();
57template <
typename Arg1,
typename... Args>
58QList<Value> packArguments(
const Arg1 & a1,
const Args & ... args)
60 QList<Value> && result = packArguments(args...);
63 ValueImpl<Arg1>::set(v, a1);
72template <
typename R,
typename... Args>
73struct 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();
87template <
typename... Args>
88struct 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();
110template <
typename R,
typename... Args>
111R
emit(
void *instance,
const char *detailedSignal,
const Args & ... args)
113 return Private::EmitImpl<R (Args...)>
::emit(instance, detailedSignal,
Quark(), args...);
116template <
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)
186template <
typename R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS>
187struct 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();
204template <QGLIB_SIGNAL_IMPL_TEMPLATE_PARAMS>
205struct 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
232template <
typename R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS>
233R
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);
239template <
typename R QGLIB_SIGNAL_IMPL_TRAILING_TEMPLATE_PARAMS>
240R
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)