summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetaobject.h
blob: fa0357918b5d3da21219eba22476f05fd07ade97 (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
// Copyright (C) 2016 The Qt Company Ltd.// Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#ifndef QMETAOBJECT_H#define QMETAOBJECT_H#include <QtCore/qobjectdefs.h>#include <QtCore/qcompare.h>#include <QtCore/qvariant.h> QT_BEGIN_NAMESPACE class QUntypedBindable;#define Q_METAMETHOD_INVOKE_MAX_ARGS 10class Q_CORE_EXPORT QMetaMethod {public:constexpr inlineQMetaMethod() :mobj(nullptr),data({nullptr}) {} QByteArray methodSignature()const; QByteArray name()const; QByteArrayView nameView()const;const char*typeName()const;intreturnType()const; QMetaType returnMetaType()const;intparameterCount()const;intparameterType(int index)const; QMetaType parameterMetaType(int index)const;voidgetParameterTypes(int*types)const; QList<QByteArray>parameterTypes()const; QByteArray parameterTypeName(int index)const; QList<QByteArray>parameterNames()const;const char*tag()const;enum Access { Private, Protected, Public }; Access access()const;enum MethodType { Method, Signal, Slot, Constructor }; MethodType methodType()const;enum Attributes { Compatibility =0x1, Cloned =0x2, Scriptable =0x4};intattributes()const;intmethodIndex()const;intrelativeMethodIndex()const;intrevision()const;boolisConst()const;inlineconst QMetaObject *enclosingMetaObject()const{return mobj; }#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0)boolinvoke(QObject *object,Qt::ConnectionType connectionType, QGenericReturnArgument returnValue, 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;inlineboolinvoke(QObject *object, QGenericReturnArgument returnValue, 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{returninvoke(object,Qt::AutoConnection, returnValue, val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);}inlineboolinvoke(QObject *object,Qt::ConnectionType connectionType, QGenericArgument val0, 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{returninvoke(object, connectionType,QGenericReturnArgument(), val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);}inlineboolinvoke(QObject *object, QGenericArgument val0, 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{returninvoke(object,Qt::AutoConnection,QGenericReturnArgument(), val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);}boolinvokeOnGadget(void*gadget, QGenericReturnArgument returnValue, 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;inlineboolinvokeOnGadget(void*gadget, QGenericArgument val0, 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{returninvokeOnGadget(gadget,QGenericReturnArgument(), val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);}#endiftemplate<typename ReturnArg, typename... Args>#ifdef Q_QDOCbool#elseQtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>#endifinvoke(QObject *obj,Qt::ConnectionType c, QTemplatedMetaMethodReturnArgument<ReturnArg> r, Args &&... arguments)const{auto h =QtPrivate::invokeMethodHelper(r,std::forward<Args>(arguments)...);returninvokeImpl(*this, obj, c, h.parameterCount(), h.parameters.data(), h.typeNames.data(), h.metaTypes.data());}template<typename... Args>#ifdef Q_QDOCbool#elseQtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>#endifinvoke(QObject *obj,Qt::ConnectionType c, Args &&... arguments)const{returninvoke(obj, c, QTemplatedMetaMethodReturnArgument<void>{},std::forward<Args>(arguments)...);}template<typename ReturnArg, typename... Args>#ifdef Q_QDOCbool#elseQtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>#endifinvoke(QObject *obj, QTemplatedMetaMethodReturnArgument<ReturnArg> r, Args &&... arguments)const{returninvoke(obj,Qt::AutoConnection, r,std::forward<Args>(arguments)...);}template<typename... Args>#ifdef Q_QDOCbool#elseQtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>#endifinvoke(QObject *obj, Args &&... arguments)const{returninvoke(obj,Qt::AutoConnection,std::forward<Args>(arguments)...);}template<typename ReturnArg, typename... Args>#ifdef Q_QDOCbool#elseQtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>#endifinvokeOnGadget(void*gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> r, Args &&... arguments)const{auto h =QtPrivate::invokeMethodHelper(r,std::forward<Args>(arguments)...);returninvokeImpl(*this, gadget,Qt::ConnectionType(-1), h.parameterCount(), h.parameters.data(), h.typeNames.data(), h.metaTypes.data());}template<typename... Args>#ifdef Q_QDOCbool#elseQtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>#endifinvokeOnGadget(void*gadget, Args &&... arguments)const{returninvokeOnGadget(gadget, QTemplatedMetaMethodReturnArgument<void>{},std::forward<Args>(arguments)...);}inlineboolisValid()const{return mobj !=nullptr; }template<typename PointerToMemberFunction>staticinline QMetaMethod fromSignal(PointerToMemberFunction signal){typedef QtPrivate::FunctionPointer<PointerToMemberFunction> SignalType;static_assert(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,"No Q_OBJECT in the class with the signal");returnfromSignalImpl(&SignalType::Object::staticMetaObject,reinterpret_cast<void**>(&signal));}private:static boolinvokeImpl(QMetaMethod self,void*target,Qt::ConnectionType, qsizetype paramCount,const void*const*parameters,const char*const*typeNames,constQtPrivate::QMetaTypeInterface *const*metaTypes);static QMetaMethod fromSignalImpl(const QMetaObject *,void**);static QMetaMethod fromRelativeMethodIndex(const QMetaObject *mobj,int index);static QMetaMethod fromRelativeConstructorIndex(const QMetaObject *mobj,int index);protected:struct Data {enum{ Size =6}; uint name()const{return d[0]; } uint argc()const{return d[1]; } uint parameters()const{return d[2]; } uint tag()const{return d[3]; } uint flags()const{return d[4]; } uint metaTypeOffset()const{return d[5]; }booloperator==(const Data &other)const{return d == other.d; }const uint *d;};private:constexprQMetaMethod(const QMetaObject *metaObject,const Data &data_):mobj(metaObject),data(data_){}protected:const QMetaObject *mobj; Data data;friendstruct QMetaObject;friendstruct QMetaObjectPrivate;friend class QObject;private:friendboolcomparesEqual(const QMetaMethod &lhs,const QMetaMethod &rhs) noexcept {return lhs.data == rhs.data; }Q_DECLARE_EQUALITY_COMPARABLE(QMetaMethod)};Q_DECLARE_TYPEINFO(QMetaMethod, Q_RELOCATABLE_TYPE);class Q_CORE_EXPORT QMetaEnum {public:constexpr inlineQMetaEnum() :mobj(nullptr),data({nullptr}) {}const char*name()const;const char*enumName()const; QMetaType metaType()const;boolisFlag()const;boolisScoped()const;boolis64Bit()const;intkeyCount()const;const char*key(int index)const;intvalue(int index)const;std::optional<quint64>value64(int index)const;const char*scope()const;intkeyToValue(const char*key,bool*ok =nullptr)const;intkeysToValue(const char*keys,bool*ok =nullptr)const;std::optional<quint64>keyToValue64(const char*key)const;std::optional<quint64>keysToValue64(const char*keys)const;#if QT_CORE_REMOVED_SINCE(6, 9)const char*valueToKey(int value)const; QByteArray valueToKeys(int value)const;#endifconst char*valueToKey(quint64 value)const; QByteArray valueToKeys(quint64 value)const;inlineconst QMetaObject *enclosingMetaObject()const{return mobj; }inlineboolisValid()const{returnname() !=nullptr; }template<typename T>static QMetaEnum fromType(){static_assert(QtPrivate::IsQEnumHelper<T>::Value,"QMetaEnum::fromType only works with enums declared as ""Q_ENUM, Q_ENUM_NS, Q_FLAG or Q_FLAG_NS");const QMetaObject *metaObject =qt_getEnumMetaObject(T());const char*name =qt_getEnumName(T());return metaObject->enumerator(metaObject->indexOfEnumerator(name));}private:struct Data {enum{ Size =5}; quint32 name()const{return d[0]; } quint32 alias()const{return d[1]; } quint32 flags()const{return d[2]; } qint32 keyCount()const{return static_cast<qint32>(d[3]); } quint32 data()const{return d[4]; }intindex(const QMetaObject *mobj)const;const uint *d;};QMetaEnum(const QMetaObject *mobj,int index);template<typename... Args> quint64 value_helper(uint index, Args...)const noexcept;const QMetaObject *mobj; Data data;friendstruct QMetaObject;friendstruct QMetaObjectPrivate;};Q_DECLARE_TYPEINFO(QMetaEnum, Q_RELOCATABLE_TYPE);class Q_CORE_EXPORT QMetaProperty {public:constexprQMetaProperty() :mobj(nullptr),data({nullptr}) {}const char*name()const;const char*typeName()const;#if QT_DEPRECATED_SINCE(6, 0) QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED QT_DEPRECATED_VERSION_6_0 QVariant::Type type()const{int t =userType();return t >=QMetaType::User ?QVariant::UserType :QVariant::Type(t); } QT_WARNING_POP #endifintuserType()const{returntypeId(); }inttypeId()const{returnmetaType().id(); } QMetaType metaType()const;intpropertyIndex()const;intrelativePropertyIndex()const;boolisReadable()const;boolisWritable()const;boolisResettable()const;boolisDesignable()const;boolisScriptable()const;boolisStored()const;boolisUser()const;boolisConstant()const;boolisFinal()const;boolisRequired()const;boolisBindable()const;boolisFlagType()const;boolisEnumType()const; QMetaEnum enumerator()const;boolhasNotifySignal()const; QMetaMethod notifySignal()const;intnotifySignalIndex()const;intrevision()const; QVariant read(const QObject *obj)const;boolwrite(QObject *obj,const QVariant &value)const;boolwrite(QObject *obj, QVariant &&value)const;boolreset(QObject *obj)const; QUntypedBindable bindable(QObject *object)const; QVariant readOnGadget(const void*gadget)const;boolwriteOnGadget(void*gadget,const QVariant &value)const;boolwriteOnGadget(void*gadget, QVariant &&value)const;boolresetOnGadget(void*gadget)const;boolhasStdCppSet()const;boolisAlias()const;inlineboolisValid()const{returnisReadable(); }inlineconst QMetaObject *enclosingMetaObject()const{return mobj; }private:#if QT_DEPRECATED_SINCE(6, 4)QT_DEPRECATED_VERSION_X_6_4("obsolete, simply returns typeId()")intregisterPropertyType()const;#endifstruct Data {enum{ Size =5}; uint name()const{return d[0]; } uint type()const{return d[1]; } uint flags()const{return d[2]; } uint notifyIndex()const{return d[3]; } uint revision()const{return d[4]; }intindex(const QMetaObject *mobj)const;const uint *d;};QMetaProperty(const QMetaObject *mobj,int index);static Data getMetaPropertyData(const QMetaObject *mobj,int index);const QMetaObject *mobj; Data data; QMetaEnum menum;friendstruct QMetaObject;friendstruct QMetaObjectPrivate;};class Q_CORE_EXPORT QMetaClassInfo {public:constexpr inlineQMetaClassInfo() :mobj(nullptr),data({nullptr}) {}const char*name()const;const char*value()const;inlineconst QMetaObject *enclosingMetaObject()const{return mobj; }private:struct Data {enum{ Size =2}; uint name()const{return d[0]; } uint value()const{return d[1]; }const uint *d;};const QMetaObject *mobj; Data data;friendstruct QMetaObject;};Q_DECLARE_TYPEINFO(QMetaClassInfo, Q_RELOCATABLE_TYPE); QT_END_NAMESPACE #endif// QMETAOBJECT_H
close