/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2016 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QOBJECTDEFS_H #define QOBJECTDEFS_H #if defined(__OBJC__) && !defined(__cplusplus) # warning "File built in Objective-C mode (.m), but using Qt requires Objective-C++ (.mm)" #endif #include #include QT_BEGIN_NAMESPACE class QByteArray; struct QArrayData; typedef QArrayData QByteArrayData; class QString; #ifndef Q_MOC_OUTPUT_REVISION #define Q_MOC_OUTPUT_REVISION 67 #endif // The following macros can be defined by tools that understand Qt // to have the information from the macro. #ifndef QT_ANNOTATE_CLASS # ifndef Q_COMPILER_VARIADIC_MACROS # define QT_ANNOTATE_CLASS(type, x) # else # define QT_ANNOTATE_CLASS(type, ...) # endif #endif #ifndef QT_ANNOTATE_CLASS2 # define QT_ANNOTATE_CLASS2(type, a1, a2) #endif #ifndef QT_ANNOTATE_FUNCTION # define QT_ANNOTATE_FUNCTION(x) #endif #ifndef QT_ANNOTATE_ACCESS_SPECIFIER # define QT_ANNOTATE_ACCESS_SPECIFIER(x) #endif // The following macros are our "extensions" to C++ // They are used, strictly speaking, only by the moc. #ifndef Q_MOC_RUN #ifndef QT_NO_META_MACROS # if defined(QT_NO_KEYWORDS) # define QT_NO_EMIT # else # ifndef QT_NO_SIGNALS_SLOTS_KEYWORDS # define slots Q_SLOTS # define signals Q_SIGNALS # endif # endif # define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot) # define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal) # define Q_PRIVATE_SLOT(d, signature) QT_ANNOTATE_CLASS2(qt_private_slot, d, signature) # define Q_EMIT #ifndef QT_NO_EMIT # define emit #endif #ifndef Q_CLASSINFO # define Q_CLASSINFO(name, value) #endif #define Q_PLUGIN_METADATA(x) QT_ANNOTATE_CLASS(qt_plugin_metadata, x) #define Q_INTERFACES(x) QT_ANNOTATE_CLASS(qt_interfaces, x) #ifdef Q_COMPILER_VARIADIC_MACROS # define Q_PROPERTY(...) QT_ANNOTATE_CLASS(qt_property, __VA_ARGS__) #else # define Q_PROPERTY(text) QT_ANNOTATE_CLASS(qt_property, text) #endif #define Q_PRIVATE_PROPERTY(d, text) QT_ANNOTATE_CLASS2(qt_private_property, d, text) #ifndef Q_REVISION # define Q_REVISION(v) #endif #define Q_OVERRIDE(text) QT_ANNOTATE_CLASS(qt_override, text) #define QDOC_PROPERTY(text) QT_ANNOTATE_CLASS(qt_qdoc_property, text) #define Q_ENUMS(x) QT_ANNOTATE_CLASS(qt_enums, x) #define Q_FLAGS(x) QT_ANNOTATE_CLASS(qt_enums, x) #define Q_ENUM_IMPL(ENUM) \ friend Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) Q_DECL_NOEXCEPT { return &staticMetaObject; } \ friend Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) Q_DECL_NOEXCEPT { return #ENUM; } #define Q_ENUM(x) Q_ENUMS(x) Q_ENUM_IMPL(x) #define Q_FLAG(x) Q_FLAGS(x) Q_ENUM_IMPL(x) #define Q_ENUM_NS_IMPL(ENUM) \ inline Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) Q_DECL_NOEXCEPT { return &staticMetaObject; } \ inline Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) Q_DECL_NOEXCEPT { return #ENUM; } #define Q_ENUM_NS(x) Q_ENUMS(x) Q_ENUM_NS_IMPL(x) #define Q_FLAG_NS(x) Q_FLAGS(x) Q_ENUM_NS_IMPL(x) #define Q_SCRIPTABLE QT_ANNOTATE_FUNCTION(qt_scriptable) #define Q_INVOKABLE QT_ANNOTATE_FUNCTION(qt_invokable) #define Q_SIGNAL QT_ANNOTATE_FUNCTION(qt_signal) #define Q_SLOT QT_ANNOTATE_FUNCTION(qt_slot) #endif // QT_NO_META_MACROS #ifndef QT_NO_TRANSLATION // full set of tr functions # define QT_TR_FUNCTIONS \ static inline QString tr(const char *s, const char *c = nullptr, int n = -1) \ { return staticMetaObject.tr(s, c, n); } \ QT_DEPRECATED static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) \ { return staticMetaObject.tr(s, c, n); } #else // inherit the ones from QObject # define QT_TR_FUNCTIONS #endif // ### Qt6: remove #define Q_OBJECT_CHECK /* empty, unused since Qt 5.2 */ #if defined(Q_CC_INTEL) // Cannot redefine the visibility of a method in an exported class # define Q_DECL_HIDDEN_STATIC_METACALL #else # define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN #endif #if defined(Q_CC_CLANG) && Q_CC_CLANG >= 306 # define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override") #elif defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 501 # define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_GCC("-Wsuggest-override") #else # define Q_OBJECT_NO_OVERRIDE_WARNING #endif #if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 600 # define Q_OBJECT_NO_ATTRIBUTES_WARNING QT_WARNING_DISABLE_GCC("-Wattributes") #else # define Q_OBJECT_NO_ATTRIBUTES_WARNING #endif /* qmake ignore Q_OBJECT */ #define Q_OBJECT \ public: \ QT_WARNING_PUSH \ Q_OBJECT_NO_OVERRIDE_WARNING \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *metaObject() const; \ virtual void *qt_metacast(const char *); \ virtual int qt_metacall(QMetaObject::Call, int, void **); \ QT_TR_FUNCTIONS \ private: \ Q_OBJECT_NO_ATTRIBUTES_WARNING \ Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ QT_WARNING_POP \ struct QPrivateSignal {}; \ QT_ANNOTATE_CLASS(qt_qobject, "") /* qmake ignore Q_OBJECT */ #define Q_OBJECT_FAKE Q_OBJECT QT_ANNOTATE_CLASS(qt_fake, "") #ifndef QT_NO_META_MACROS /* qmake ignore Q_GADGET */ #define Q_GADGET \ public: \ static const QMetaObject staticMetaObject; \ void qt_check_for_QGADGET_macro(); \ typedef void QtGadgetHelper; \ private: \ QT_WARNING_PUSH \ Q_OBJECT_NO_ATTRIBUTES_WARNING \ Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ QT_WARNING_POP \ QT_ANNOTATE_CLASS(qt_qgadget, "") \ /*end*/ /* qmake ignore Q_NAMESPACE */ #define Q_NAMESPACE \ extern const QMetaObject staticMetaObject; \ QT_ANNOTATE_CLASS(qt_qnamespace, "") \ /*end*/ #endif // QT_NO_META_MACROS #else // Q_MOC_RUN #define slots slots #define signals signals #define Q_SLOTS Q_SLOTS #define Q_SIGNALS Q_SIGNALS #define Q_CLASSINFO(name, value) Q_CLASSINFO(name, value) #define Q_INTERFACES(x) Q_INTERFACES(x) #define Q_PROPERTY(text) Q_PROPERTY(text) #define Q_PRIVATE_PROPERTY(d, text) Q_PRIVATE_PROPERTY(d, text) #define Q_REVISION(v) Q_REVISION(v) #define Q_OVERRIDE(text) Q_OVERRIDE(text) #define Q_ENUMS(x) Q_ENUMS(x) #define Q_FLAGS(x) Q_FLAGS(x) #define Q_ENUM(x) Q_ENUM(x) #define Q_FLAGS(x) Q_FLAGS(x) /* qmake ignore Q_OBJECT */ #define Q_OBJECT Q_OBJECT /* qmake ignore Q_OBJECT */ #define Q_OBJECT_FAKE Q_OBJECT_FAKE /* qmake ignore Q_GADGET */ #define Q_GADGET Q_GADGET #define Q_SCRIPTABLE Q_SCRIPTABLE #define Q_INVOKABLE Q_INVOKABLE #define Q_SIGNAL Q_SIGNAL #define Q_SLOT Q_SLOT #endif //Q_MOC_RUN #ifdef Q_CLANG_QDOC #undef Q_GADGET #define Q_GADGET #endif #ifndef QT_NO_META_MACROS // macro for onaming members #ifdef METHOD #undef METHOD #endif #ifdef SLOT #undef SLOT #endif #ifdef SIGNAL #undef SIGNAL #endif #endif // QT_NO_META_MACROS Q_CORE_EXPORT const char *qFlagLocation(const char *method); #ifndef QT_NO_META_MACROS #ifndef QT_NO_DEBUG # define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__) # ifndef QT_NO_KEYWORDS # define METHOD(a) qFlagLocation("0"#a QLOCATION) # endif # define SLOT(a) qFlagLocation("1"#a QLOCATION) # define SIGNAL(a) qFlagLocation("2"#a QLOCATION) #else # ifndef QT_NO_KEYWORDS # define METHOD(a) "0"#a # endif # define SLOT(a) "1"#a # define SIGNAL(a) "2"#a #endif #define QMETHOD_CODE 0 // member type codes #define QSLOT_CODE 1 #define QSIGNAL_CODE 2 #endif // QT_NO_META_MACROS #define Q_ARG(type, data) QArgument(#type, data) #define Q_RETURN_ARG(type, data) QReturnArgument(#type, data) class QObject; class QMetaMethod; class QMetaEnum; class QMetaProperty; class QMetaClassInfo; class Q_CORE_EXPORT QGenericArgument { public: inline QGenericArgument(const char *aName = nullptr, const void *aData = nullptr) : _data(aData), _name(aName) {} inline void *data() const { return const_cast(_data); } inline const char *name() const { return _name; } private: const void *_data; const char *_name; }; class Q_CORE_EXPORT QGenericReturnArgument: public QGenericArgument { public: inline QGenericReturnArgument(const char *aName = nullptr, void *aData = nullptr) : QGenericArgument(aName, aData) {} }; template class QArgument: public QGenericArgument { public: inline QArgument(const char *aName, const T &aData) : QGenericArgument(aName, static_cast(&aData)) {} }; template class QArgument: public QGenericArgument { public: inline QArgument(const char *aName, T &aData) : QGenericArgument(aName, static_cast(&aData)) {} }; template class QReturnArgument: public QGenericReturnArgument { public: inline QReturnArgument(const char *aName, T &aData) : QGenericReturnArgument(aName, static_cast(&aData)) {} }; struct Q_CORE_EXPORT QMetaObject { class Connection; const char *className() const; const QMetaObject *superClass() const; bool inherits(const QMetaObject *metaObject) const Q_DECL_NOEXCEPT; QObject *cast(QObject *obj) const; const QObject *cast(const QObject *obj) const; #ifndef QT_NO_TRANSLATION QString tr(const char *s, const char *c, int n = -1) const; #endif // QT_NO_TRANSLATION int methodOffset() const; int enumeratorOffset() const; int propertyOffset() const; int classInfoOffset() const; int constructorCount() const; int methodCount() const; int enumeratorCount() const; int propertyCount() const; int classInfoCount() const; int indexOfConstructor(const char *constructor) const; int indexOfMethod(const char *method) const; int indexOfSignal(const char *signal) const; int indexOfSlot(const char *slot) const; int indexOfEnumerator(const char *name) const; int indexOfProperty(const char *name) const; int indexOfClassInfo(const char *name) const; QMetaMethod constructor(int index) const; QMetaMethod method(int index) const; QMetaEnum enumerator(int index) const; QMetaProperty property(int index) const; QMetaClassInfo classInfo(int index) const; QMetaProperty userProperty() const; static bool checkConnectArgs(const char *signal, const char *method); static bool checkConnectArgs(const QMetaMethod &signal, const QMetaMethod &method); static QByteArray normalizedSignature(const char *method); static QByteArray normalizedType(const char *type); // internal index-based connect static Connection connect(const QObject *sender, int signal_index, const QObject *receiver, int method_index, int type = 0, int *types = nullptr); // internal index-based disconnect static bool disconnect(const QObject *sender, int signal_index, const QObject *receiver, int method_index); static bool disconnectOne(const QObject *sender, int signal_index, const QObject *receiver, int method_index); // internal slot-name based connect static void connectSlotsByName(QObject *o); // internal index-based signal activation static void activate(QObject *sender, int signal_index, void **argv); static void activate(QObject *sender, const QMetaObject *, int local_signal_index, void **argv); static void activate(QObject *sender, int signal_offset, int local_signal_index, void **argv); static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()); static inline bool invokeMethod(QObject *obj, const char *member, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) { return invokeMethod(obj, member, Qt::AutoConnection, ret, val0, val1, val2, val3, val4, val5, val6, val7, val8, val9); } static inline bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) { return invokeMethod(obj, member, type, QGenericReturnArgument(), val0, val1, val2, val3, val4, val5, val6, val7, val8, val9); } static inline bool invokeMethod(QObject *obj, const char *member, QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) { return invokeMethod(obj, member, Qt::AutoConnection, QGenericReturnArgument(), val0, val1, val2, val3, val4, val5, val6, val7, val8, val9); } #ifdef Q_CLANG_QDOC template static bool invokeMethod(QObject *context, Functor function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr); template static bool invokeMethod(QObject *context, Functor function, FunctorReturnType *ret); #else // invokeMethod() for member function pointer template static typename std::enable_if::IsPointerToMemberFunction && !std::is_convertible::value && QtPrivate::FunctionPointer::ArgumentCount == 0, bool>::type invokeMethod(typename QtPrivate::FunctionPointer::Object *object, Func function, Qt::ConnectionType type = Qt::AutoConnection, typename QtPrivate::FunctionPointer::ReturnType *ret = nullptr) { return invokeMethodImpl(object, new QtPrivate::QSlotObjectWithNoArgs(function), type, ret); } template static typename std::enable_if::IsPointerToMemberFunction && !std::is_convertible::value && QtPrivate::FunctionPointer::ArgumentCount == 0, bool>::type invokeMethod(typename QtPrivate::FunctionPointer::Object *object, Func function, typename QtPrivate::FunctionPointer::ReturnType *ret) { return invokeMethodImpl(object, new QtPrivate::QSlotObjectWithNoArgs(function), Qt::AutoConnection, ret); } // invokeMethod() for function pointer (not member) template static typename std::enable_if::IsPointerToMemberFunction && !std::is_convertible::value && QtPrivate::FunctionPointer::ArgumentCount == 0, bool>::type invokeMethod(QObject *context, Func function, Qt::ConnectionType type = Qt::AutoConnection, typename QtPrivate::FunctionPointer::ReturnType *ret = nullptr) { return invokeMethodImpl(context, new QtPrivate::QFunctorSlotObjectWithNoArgsImplicitReturn(function), type, ret); } template static typename std::enable_if::IsPointerToMemberFunction && !std::is_convertible::value && QtPrivate::FunctionPointer::ArgumentCount == 0, bool>::type invokeMethod(QObject *context, Func function, typename QtPrivate::FunctionPointer::ReturnType *ret) { return invokeMethodImpl(context, new QtPrivate::QFunctorSlotObjectWithNoArgsImplicitReturn(function), Qt::AutoConnection, ret); } // invokeMethod() for Functor template static typename std::enable_if::IsPointerToMemberFunction && QtPrivate::FunctionPointer::ArgumentCount == -1 && !std::is_convertible::value, bool>::type invokeMethod(QObject *context, Func function, Qt::ConnectionType type = Qt::AutoConnection, decltype(function()) *ret = nullptr) { return invokeMethodImpl(context, new QtPrivate::QFunctorSlotObjectWithNoArgs(function), type, ret); } template static typename std::enable_if::IsPointerToMemberFunction && QtPrivate::FunctionPointer::ArgumentCount == -1 && !std::is_convertible::value, bool>::type invokeMethod(QObject *context, Func function, typename std::result_of::type *ret) { return invokeMethodImpl(context, new QtPrivate::QFunctorSlotObjectWithNoArgs(function), Qt::AutoConnection, ret); } #endif QObject *newInstance(QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()) const; enum Call { InvokeMetaMethod, ReadProperty, WriteProperty, ResetProperty, QueryPropertyDesignable, QueryPropertyScriptable, QueryPropertyStored, QueryPropertyEditable, QueryPropertyUser, CreateInstance, IndexOfMethod, RegisterPropertyMetaType, RegisterMethodArgumentMetaType }; int static_metacall(Call, int, void **) const; static int metacall(QObject *, Call, int, void **); struct { // private data const QMetaObject *superdata; const QByteArrayData *stringdata; const uint *data; typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **); StaticMetacallFunction static_metacall; const QMetaObject * const *relatedMetaObjects; void *extradata; //reserved for future use } d; private: static bool invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *slot, Qt::ConnectionType type, void *ret); }; class Q_CORE_EXPORT QMetaObject::Connection { void *d_ptr; //QObjectPrivate::Connection* explicit Connection(void *data) : d_ptr(data) { } friend class QObject; friend class QObjectPrivate; friend struct QMetaObject; bool isConnected_helper() const; public: ~Connection(); Connection(); Connection(const Connection &other); Connection &operator=(const Connection &other); #ifdef Q_QDOC operator bool() const; #else typedef void *Connection::*RestrictedBool; operator RestrictedBool() const { return d_ptr && isConnected_helper() ? &Connection::d_ptr : nullptr; } #endif Connection(Connection &&o) Q_DECL_NOTHROW : d_ptr(o.d_ptr) { o.d_ptr = nullptr; } Connection &operator=(Connection &&other) Q_DECL_NOTHROW { qSwap(d_ptr, other.d_ptr); return *this; } }; inline const QMetaObject *QMetaObject::superClass() const { return d.superdata; } namespace QtPrivate { /* Trait that tells is a the Object has a Q_OBJECT macro */ template struct HasQ_OBJECT_Macro { template static char test(int (T::*)(QMetaObject::Call, int, void **)); static int test(int (Object::*)(QMetaObject::Call, int, void **)); enum { Value = sizeof(test(&Object::qt_metacall)) == sizeof(int) }; }; } QT_END_NAMESPACE #endif // QOBJECTDEFS_H