diff options
Diffstat (limited to 'src/corelib/kernel/qvariant_p.h')
-rw-r--r-- | src/corelib/kernel/qvariant_p.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h index b79d4623c1..015ca5b464 100644 --- a/src/corelib/kernel/qvariant_p.h +++ b/src/corelib/kernel/qvariant_p.h @@ -58,6 +58,9 @@ #include <QtCore/qglobal.h> #include <QtCore/qvariant.h> +#include <QtCore/private/qmetatype_p.h> +#include <QtCore/qdebug.h> + #include "qmetatypeswitcher_p.h" QT_BEGIN_NAMESPACE @@ -418,6 +421,54 @@ Q_CORE_EXPORT void registerHandler(const int /* Modules::Names */ name, const QV Q_CORE_EXPORT void unregisterHandler(const int /* Modules::Names */ name); } +#if !defined(QT_NO_DEBUG_STREAM) && !defined(Q_BROKEN_DEBUG_STREAM) +template<class Filter> +class QVariantDebugStream +{ + template<typename T, bool IsAcceptedType = Filter::template Acceptor<T>::IsAccepted> + struct Filtered { + Filtered(QDebug dbg, QVariant::Private *d) + { + dbg.nospace() << *v_cast<T>(d); + } + }; + template<typename T> + struct Filtered<T, /* IsAcceptedType = */ false> { + Filtered(QDebug dbg, QVariant::Private *d) + { + dbg.nospace() << "QVariant::Type(" << d->type << ")"; + } + }; + +public: + QVariantDebugStream(QDebug dbg, QVariant::Private *d) + : m_debugStream(dbg) + , m_d(d) + {} + + template<typename T> + void delegate(const T*) + { + Filtered<T> streamIt(m_debugStream, m_d); + } + + void delegate(const QMetaTypeSwitcher::UnknownType*) + { + if (m_d->type == QVariant::UserType) + m_debugStream.nospace() << "QVariant::UserType"; + else + qWarning("Trying to stream an instance of an invalid type, type id: %i", m_d->type); + } + void delegate(const void*) + { + m_debugStream.nospace() << "QVariant::Invalid"; + } +private: + QDebug m_debugStream; + QVariant::Private *m_d; +}; +#endif + QT_END_NAMESPACE #endif // QVARIANT_P_H |