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>
This commit is contained in:
parent
ee308018f3
commit
76e25bdfdf
@ -226,20 +226,20 @@ public:
|
|||||||
//connect to a function pointer (not a member)
|
//connect to a function pointer (not a member)
|
||||||
template <typename Func1, typename Func2>
|
template <typename Func1, typename Func2>
|
||||||
static inline typename std::enable_if<int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0, QMetaObject::Connection>::type
|
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)
|
//connect to a function pointer (not a member)
|
||||||
template <typename Func1, typename Func2>
|
template <typename Func1, typename Func2>
|
||||||
static inline typename std::enable_if<int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0 &&
|
static inline typename std::enable_if<int(QtPrivate::FunctionPointer<std::decay_t<Func2>>::ArgumentCount) >= 0 &&
|
||||||
!QtPrivate::FunctionPointer<Func2>::IsPointerToMemberFunction, QMetaObject::Connection>::type
|
!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,
|
connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 &&slot,
|
||||||
Qt::ConnectionType type = Qt::AutoConnection)
|
Qt::ConnectionType type = Qt::AutoConnection)
|
||||||
{
|
{
|
||||||
typedef QtPrivate::FunctionPointer<Func1> SignalType;
|
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,
|
static_assert(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
|
||||||
"No Q_OBJECT in the class with the signal");
|
"No Q_OBJECT in the class with the signal");
|
||||||
@ -257,9 +257,9 @@ public:
|
|||||||
types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types();
|
types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types();
|
||||||
|
|
||||||
return connectImpl(sender, reinterpret_cast<void **>(&signal), context, nullptr,
|
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 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);
|
type, types, &SignalType::Object::staticMetaObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,9 +269,9 @@ public:
|
|||||||
QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1 &&
|
QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1 &&
|
||||||
!std::is_convertible_v<Func2, const char*>, // don't match old-style connect
|
!std::is_convertible_v<Func2, const char*>, // don't match old-style connect
|
||||||
QMetaObject::Connection>::type
|
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
|
//connect to a functor, with a "context" object defining in which event loop is going to be executed
|
||||||
|
@ -37,30 +37,6 @@ namespace QtPrivate {
|
|||||||
{ static const int *types() { return nullptr; } };
|
{ static const int *types() { return nullptr; } };
|
||||||
template <typename... Args> struct ConnectionTypes<List<Args...>, true>
|
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; } };
|
{ 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) {}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user