From 5ec421c5354f2aaecb3106bba5e085f240567397 Mon Sep 17 00:00:00 2001 From: peri4 Date: Mon, 1 Mar 2021 20:14:39 +0300 Subject: [PATCH] QPICONNECT second version - variadic templates --- libs/piqt/piqt_macros.h | 90 ++++++----------------------------------- 1 file changed, 12 insertions(+), 78 deletions(-) diff --git a/libs/piqt/piqt_macros.h b/libs/piqt/piqt_macros.h index 0f0d0a7..b9aab28 100644 --- a/libs/piqt/piqt_macros.h +++ b/libs/piqt/piqt_macros.h @@ -39,98 +39,32 @@ /// connect Qt signal "sig" of object "src" directly to PIP event handler "handler" of object "tgt" /// e.g. QPICONNECT(&qt_obj, someSignal, &pip_obj, someHandler) +/// Returns QMetaObject::Connection #define QPICONNECT(src, sig, tgt, handler) \ __qpiConnect(src, &decltype(__removePtr__(src))::sig, tgt, &(tgt)->__stat_eh_##handler##__); template T __removePtr__(T*) {} +template QArgument __qargument(const T & v) {return QArgument(QMetaType::typeName(qMetaTypeId()), v);} -template -void __piqConnect(PIObject * source, const char * event, void(*func)(void*), O * target, SR(O::*slot)()) { - PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](){(target->*slot)();}), LOCATION); -} -template -void __piqConnect(PIObject * source, const char * event, void(*func)(void*,T1), O * target, SR(O::*slot)(T1)) { - PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1){(target->*slot)(v1);}), LOCATION); -} -template -void __piqConnect(PIObject * source, const char * event, void(*func)(void*,T1,T2), O * target, SR(O::*slot)(T1, T2)) { - PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2){(target->*slot)(v1, v2);}), LOCATION); -} -template -void __piqConnect(PIObject * source, const char * event, void(*func)(void*,T1,T2,T3), O * target, SR(O::*slot)(T1, T2, T3)) { - PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2, T3 v3){(target->*slot)(v1, v2, v3);}), LOCATION); -} -template -void __piqConnect(PIObject * source, const char * event, void(*func)(void*,T1,T2,T3,T4), O * target, SR(O::*slot)(T1, T2, T3, T4)) { - PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2, T3 v3, T4 v4){(target->*slot)(v1, v2, v3, v4);}), LOCATION); +template +void __piqConnect(PIObject * source, const char * event, void(*func)(void*,ARGS...), O * target, SR(O::*slot)(ARGS...)) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](ARGS... args){(target->*slot)(args...);}), LOCATION); } -inline void __piqConnectQ(PIObject * source, const char * event, void(*func)(void*), QObject * target, const char * slot) { - PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](){ - QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection); - }), LOCATION); -} -template -void __piqConnectQ(PIObject * source, const char * event, void(*func)(void*,T1), QObject * target, const char * slot) { - PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1){ - //QMetaObject::invokeMethod(target, slot, (Qt::ConnectionType)type, QArgument(__PIVariantFunctions__::typeNameHelper().dataAscii(), v1)); - QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection, - QArgument(QMetaType::typeName(qMetaTypeId()), v1)); - }), LOCATION); -} -template -void __piqConnectQ(PIObject * source, const char * event, void(*func)(void*,T1,T2), QObject * target, const char * slot) { - PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2){ - QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection, - QArgument(QMetaType::typeName(qMetaTypeId()), v1), - QArgument(QMetaType::typeName(qMetaTypeId()), v2)); - }), LOCATION); -} -template -void __piqConnectQ(PIObject * source, const char * event, void(*func)(void*,T1,T2,T3), QObject * target, const char * slot) { - PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2, T3 v3){ - QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection, - QArgument(QMetaType::typeName(qMetaTypeId()), v1), - QArgument(QMetaType::typeName(qMetaTypeId()), v2), - QArgument(QMetaType::typeName(qMetaTypeId()), v3)); - }), LOCATION); -} -template -void __piqConnectQ(PIObject * source, const char * event, void(*func)(void*,T1,T2,T3,T4), QObject * target, const char * slot) { - PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](T1 v1, T2 v2, T3 v3, T4 v4){ - QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection, - QArgument(QMetaType::typeName(qMetaTypeId()), v1), - QArgument(QMetaType::typeName(qMetaTypeId()), v2), - QArgument(QMetaType::typeName(qMetaTypeId()), v3), - QArgument(QMetaType::typeName(qMetaTypeId()), v4)); +template +void __piqConnectQ(PIObject * source, const char * event, void(*func)(void*,ARGS...), QObject * target, const char * slot) { + PIObject::piConnectLS(source, PIStringAscii(event), PIObject::__newFunctor(func, [target,slot](ARGS... args){ + QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection, __qargument(args)...); }), LOCATION); } - - -template -void __qpiConnect(O * source, SR(O::*signal)(), PIObject * target, void(*handler)(void*)) { - QObject::connect(source, signal, source, [target,handler](){handler(target);}); -} -template -void __qpiConnect(O * source, SR(O::*signal)(T1), PIObject * target, void(*handler)(void*,T1)) { - QObject::connect(source, signal, source, [target,handler](T1 v1){handler(target, v1);}); -} -template -void __qpiConnect(O * source, SR(O::*signal)(T1,T2), PIObject * target, void(*handler)(void*,T1,T2)) { - QObject::connect(source, signal, source, [target,handler](T1 v1, T2 v2){handler(target, v1, v2);}); -} -template -void __qpiConnect(O * source, SR(O::*signal)(T1,T2,T3), PIObject * target, void(*handler)(void*,T1,T2,T3)) { - QObject::connect(source, signal, source, [target,handler](T1 v1, T2 v2, T3 v3){handler(target, v1, v2, v3);}); -} -template -void __qpiConnect(O * source, SR(O::*signal)(T1,T2,T3,T4), PIObject * target, void(*handler)(void*,T1,T2,T3,T4)) { - QObject::connect(source, signal, source, [target,handler](T1 v1, T2 v2, T3 v3, T4 v4){handler(target, v1, v2, v3, v4);}); +template +QMetaObject::Connection __qpiConnect(O * source, SR(O::*signal)(ARGS...), PIObject * target, void(*handler)(void*,ARGS...)) { + return QObject::connect(source, signal, source, [target,handler](ARGS... args){handler(target, args...);}); }