diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2023-04-29 22:32:21 +0200 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2023-05-02 06:28:51 +0200 |
commit | 76e25bdfdf324a85234b7e7273e0956107f84195 (patch) | |
tree | 4c337301d757b108a934bb173176b8bad295c2d0 | |
parent | ee308018f36e08d2b23ab81b4e5c9096d521919c (diff) |
Remove QStaticSlotObject, use QFunctorSlotObject instead
The two slot object types are identical as long as we use a universal
reference and perfect forwarding in the respective connect overloads.
Change-Id: I999d71707dd045a17156e3bfecd371da7979beb1
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/kernel/qobject.h | 20 | ||||
-rw-r--r-- | src/corelib/kernel/qobject_impl.h | 24 |
2 files changed, 10 insertions, 34 deletions
diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h index 53c6de654f..95322a9dbd 100644 --- a/src/corelib/kernel/qobject.h +++ b/src/corelib/kernel/qobject.h @@ -226,20 +226,20 @@ public: //connect to a function pointer (not a member) template <typename Func1, typename Func2> static inline typename std::enable_if<int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0, QMetaObject::Connection>::type - connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot) + connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 &&slot) { - return connect(sender, signal, sender, slot, Qt::DirectConnection); + return connect(sender, signal, sender, std::forward<Func2>(slot), Qt::DirectConnection); } //connect to a function pointer (not a member) template <typename Func1, typename Func2> - static inline typename std::enable_if<int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0 && - !QtPrivate::FunctionPointer<Func2>::IsPointerToMemberFunction, QMetaObject::Connection>::type - connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot, + static inline typename std::enable_if<int(QtPrivate::FunctionPointer<std::decay_t<Func2>>::ArgumentCount) >= 0 && + !QtPrivate::FunctionPointer<std::decay_t<Func2>>::IsPointerToMemberFunction, QMetaObject::Connection>::type + connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 &&slot, Qt::ConnectionType type = Qt::AutoConnection) { typedef QtPrivate::FunctionPointer<Func1> SignalType; - typedef QtPrivate::FunctionPointer<Func2> SlotType; + typedef QtPrivate::FunctionPointer<std::decay_t<Func2>> SlotType; static_assert(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value, "No Q_OBJECT in the class with the signal"); @@ -257,9 +257,9 @@ public: types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types(); return connectImpl(sender, reinterpret_cast<void **>(&signal), context, nullptr, - new QtPrivate::QStaticSlotObject<Func2, + new QtPrivate::QFunctorSlotObject<Func2, typename QtPrivate::List_Left<typename SignalType::Arguments, SlotType::ArgumentCount>::Value, - typename SignalType::ReturnType>(slot), + typename SignalType::ReturnType>(std::forward<Func2>(slot)), type, types, &SignalType::Object::staticMetaObject); } @@ -269,9 +269,9 @@ public: QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1 && !std::is_convertible_v<Func2, const char*>, // don't match old-style connect QMetaObject::Connection>::type - connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot) + connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 &&slot) { - return connect(sender, signal, sender, std::move(slot), Qt::DirectConnection); + return connect(sender, signal, sender, std::forward<Func2>(slot), Qt::DirectConnection); } //connect to a functor, with a "context" object defining in which event loop is going to be executed diff --git a/src/corelib/kernel/qobject_impl.h b/src/corelib/kernel/qobject_impl.h index 4d6830a3cc..b57d7e50cc 100644 --- a/src/corelib/kernel/qobject_impl.h +++ b/src/corelib/kernel/qobject_impl.h @@ -37,30 +37,6 @@ namespace QtPrivate { { static const int *types() { return nullptr; } }; template <typename... Args> struct ConnectionTypes<List<Args...>, true> { static const int *types() { static const int t[sizeof...(Args) + 1] = { (QtPrivate::QMetaTypeIdHelper<Args>::qt_metatype_id())..., 0 }; return t; } }; - - // implementation of QSlotObjectBase for which the slot is a static function - // Args and R are the List of arguments and the return type of the signal to which the slot is connected. - template<typename Func, typename Args, typename R> class QStaticSlotObject : public QSlotObjectBase - { - typedef QtPrivate::FunctionPointer<Func> FuncType; - Func function; - static void impl(int which, QSlotObjectBase *this_, QObject *r, void **a, bool *ret) - { - switch (which) { - case Destroy: - delete static_cast<QStaticSlotObject*>(this_); - break; - case Call: - FuncType::template call<Args, R>(static_cast<QStaticSlotObject*>(this_)->function, r, a); - break; - case Compare: // not implemented - case NumOperations: - Q_UNUSED(ret); - } - } - public: - explicit QStaticSlotObject(Func f) : QSlotObjectBase(&impl), function(f) {} - }; } |