QPICONNECT second version - variadic templates

This commit is contained in:
2021-03-01 20:14:39 +03:00
parent 77a1aecf1a
commit 5ec421c535

View File

@@ -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<typename T> T __removePtr__(T*) {}
template<typename T> QArgument<T> __qargument(const T & v) {return QArgument<T>(QMetaType::typeName(qMetaTypeId<T>()), v);}
template <typename SR, typename O>
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 <typename SR, typename O, typename T1>
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 <typename SR, typename O, typename T1, typename T2>
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 <typename SR, typename O, typename T1, typename T2, typename T3>
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 <typename SR, typename O, typename T1, typename T2, typename T3, typename T4>
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 <typename SR, typename O, typename... ARGS>
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 <typename T1>
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<T1>(__PIVariantFunctions__<T1>::typeNameHelper().dataAscii(), v1));
QMetaObject::invokeMethod(target, slot, Qt::QueuedConnection,
QArgument<T1>(QMetaType::typeName(qMetaTypeId<T1>()), v1));
}), LOCATION);
}
template <typename T1, typename T2>
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<T1>(QMetaType::typeName(qMetaTypeId<T1>()), v1),
QArgument<T2>(QMetaType::typeName(qMetaTypeId<T2>()), v2));
}), LOCATION);
}
template <typename T1, typename T2, typename T3>
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<T1>(QMetaType::typeName(qMetaTypeId<T1>()), v1),
QArgument<T2>(QMetaType::typeName(qMetaTypeId<T2>()), v2),
QArgument<T3>(QMetaType::typeName(qMetaTypeId<T3>()), v3));
}), LOCATION);
}
template <typename T1, typename T2, typename T3, typename T4>
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<T1>(QMetaType::typeName(qMetaTypeId<T1>()), v1),
QArgument<T2>(QMetaType::typeName(qMetaTypeId<T2>()), v2),
QArgument<T3>(QMetaType::typeName(qMetaTypeId<T3>()), v3),
QArgument<T4>(QMetaType::typeName(qMetaTypeId<T4>()), v4));
template <typename... ARGS>
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 <typename SR, typename O>
void __qpiConnect(O * source, SR(O::*signal)(), PIObject * target, void(*handler)(void*)) {
QObject::connect(source, signal, source, [target,handler](){handler(target);});
}
template <typename SR, typename O, typename T1>
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 <typename SR, typename O, typename T1, typename T2>
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 <typename SR, typename O, typename T1, typename T2, typename T3>
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 <typename SR, typename O, typename T1, typename T2, typename T3, typename T4>
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 <typename SR, typename O, typename... ARGS>
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...);});
}