// Version: $Id: e7e953acf03afce48eb7703c9c7af7c3ff3976c9 $ // // // Commentary: // // // Change Log: // // // Code: #pragma once #include #include "dtkMetaTypeTraits.h" #include #include // ///////////////////////////////////////////////////////////////// // dtkMetaTypeHandler definition // ///////////////////////////////////////////////////////////////// template< typename T, bool = QtPrivate::IsPointerToTypeDerivedFromQObject::Value > struct dtkMetaTypeHandler { static bool canConvert(const QList& types); }; template struct dtkMetaTypeHandler { static bool canConvert(const QList& types); static QVariant variantFromValue(T *t); static T *clone(T *t); static void copy(T *source, T *target); }; template struct dtkMetaTypeHandler { static bool canConvert(const QList& types); static QVariant variantFromValue(T *t); static T *clone(T *t); static void copy(T *source, T *target); }; template< typename T, bool B> struct dtkMetaTypeHandlerHelper; template< typename T> struct dtkMetaTypeHandlerHelper { static bool canConvert(const QList& types); static T *clone(T *t); static void copy(T *source, T *target); }; template< typename T> struct dtkMetaTypeHandlerHelper { static bool canConvert(const QList& types); static T *clone(T *); static void copy(T *source, T *target); }; // ///////////////////////////////////////////////////////////////// // dtkMetaType definition // ///////////////////////////////////////////////////////////////// class dtkMetaType { public: template static bool canConvert(int type); template static bool canConvert(const QList& types); template static QVariant variantFromValue(const T& t); template static QVariant variantFromValue( T *t); template static T *clone(T *t); template static void copy(T *source, T *target); template static bool registerContainerPointerConverter(int id); public: static DTKMETA_EXPORT QString description(const QVariant& v); static DTKMETA_EXPORT QVariant cloneContent(const QVariant& v); static DTKMETA_EXPORT QVariant createEmptyContainer(const QVariant& v); static DTKMETA_EXPORT bool destroyPointer(QVariant& v); }; // ///////////////////////////////////////////////////////////////// // Stream operators redefinition // ///////////////////////////////////////////////////////////////// template QDataStream& operator << (QDataStream& s, T *t); template QDataStream& operator >> (QDataStream& s, T *&t); template QDataStream& operator << (QDataStream& s, const QList& l); template QDataStream& operator >> (QDataStream& s, QList& l); template QDataStream& operator << (QDataStream& s, const QVector& v); template QDataStream& operator >> (QDataStream& s, QVector& v); template QDataStream& operator << (QDataStream& s, const std::list& l); template QDataStream& operator >> (QDataStream& s, std::list& l); template QDataStream& operator << (QDataStream& s, const std::vector& v); template QDataStream& operator >> (QDataStream& s, std::vector& v); // ///////////////////////////////////////////////////////////////// // MACRO REGISTERING POINTERS OF CONTAINERS INTO METATYPE SYSTEM // ///////////////////////////////////////////////////////////////// #define DTK_DECLARE_SEQUENTIAL_CONTAINER_POINTER(CONTAINER_ARG) \ template struct QMetaTypeId< CONTAINER_ARG *> \ { \ enum { \ Defined = QMetaTypeId2::Defined \ }; \ static int qt_metatype_id() \ { \ static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \ if (const int id = metatype_id.load()) \ return id; \ const char *tName = QMetaType::typeName(qMetaTypeId()); \ Q_ASSERT(tName); \ const int tNameLen = int(qstrlen(tName)); \ QByteArray typeName; \ typeName.reserve(int(sizeof(#CONTAINER_ARG)) + 1 + tNameLen + 1 + 1 + 1); \ typeName.append(#CONTAINER_ARG, int(sizeof(#CONTAINER_ARG)) - 1) \ .append('<').append(tName, tNameLen).append('>'); \ typeName.append('*'); \ const int newId = qRegisterNormalizedMetaType< CONTAINER_ARG *>( \ typeName, \ reinterpret_cast< CONTAINER_ARG **>(quintptr(-1))); \ metatype_id.storeRelease(newId); \ if (newId > 0) { \ dtkMetaType::registerContainerPointerConverter< CONTAINER_ARG * >(newId); \ } \ return newId; \ } \ }; \ template struct dtkMetaTypeIsSequentialContainerPointer< CONTAINER_ARG *> : std::true_type {}; // ///////////////////////////////////////////////////////////////// #include "dtkMeta.tpp" // // dtkMeta.h ends here