diff options
author | Jędrzej Nowacki <jedrzej.nowacki@nokia.com> | 2011-12-05 12:43:10 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-01-10 09:13:11 +0100 |
commit | f85b9f824269073664770c11f58e674993d33e47 (patch) | |
tree | 289574ece05e87d283bd7b1c96cddfd80869443b /src/corelib/kernel/qvariant_p.h | |
parent | 7024ddba4b91d66341e1e076aca90b55aaf6641d (diff) |
Reimplement QVariant to QDebug streaming.
New implementation fixes some commented code marked as FIXME.
Change-Id: If8f5bebedd65bcf8f839d804c2022ca79ef82ddf
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
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 |