diff options
Diffstat (limited to 'src/corelib/io/qdebug.h')
-rw-r--r-- | src/corelib/io/qdebug.h | 99 |
1 files changed, 36 insertions, 63 deletions
diff --git a/src/corelib/io/qdebug.h b/src/corelib/io/qdebug.h index bdaaa05768..6b81d9431f 100644 --- a/src/corelib/io/qdebug.h +++ b/src/corelib/io/qdebug.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -61,9 +61,9 @@ class Q_CORE_EXPORT QDebug friend class QMessageLogger; friend class QDebugStateSaverPrivate; struct Stream { - Stream(QIODevice *device) : ts(device), ref(1), type(QtDebugMsg), space(true), message_output(false) {} - Stream(QString *string) : ts(string, QIODevice::WriteOnly), ref(1), type(QtDebugMsg), space(true), message_output(false) {} - Stream(QtMsgType t) : ts(&buffer, QIODevice::WriteOnly), ref(1), type(t), space(true), message_output(true) {} + Stream(QIODevice *device) : ts(device), ref(1), type(QtDebugMsg), space(true), message_output(false), flags(0) {} + Stream(QString *string) : ts(string, QIODevice::WriteOnly), ref(1), type(QtDebugMsg), space(true), message_output(false), flags(0) {} + Stream(QtMsgType t) : ts(&buffer, QIODevice::WriteOnly), ref(1), type(t), space(true), message_output(true), flags(0) {} QTextStream ts; QString buffer; int ref; @@ -71,6 +71,18 @@ class Q_CORE_EXPORT QDebug bool space; bool message_output; QMessageLogContext context; + + enum FormatFlag { + NoQuotes = 0x1 + }; + + // ### Qt 6: unify with space, introduce own version member + bool testFlag(FormatFlag flag) const { return (context.version > 1) ? (flags & flag) : false; } + void setFlag(FormatFlag flag) { if (context.version > 1) { flags |= flag; } } + void unsetFlag(FormatFlag flag) { if (context.version > 1) { flags &= ~flag; } } + + // added in 5.4 + int flags; } *stream; public: inline QDebug(QIODevice *device) : stream(new Stream(device)) {} @@ -78,22 +90,11 @@ public: inline QDebug(QtMsgType t) : stream(new Stream(t)) {} inline QDebug(const QDebug &o):stream(o.stream) { ++stream->ref; } inline QDebug &operator=(const QDebug &other); - inline ~QDebug() { - if (!--stream->ref) { - if (stream->space && stream->buffer.endsWith(QLatin1Char(' '))) - stream->buffer.chop(1); - if (stream->message_output) { - QT_TRY { - qt_message_output(stream->type, - stream->context, - stream->buffer); - } QT_CATCH(std::bad_alloc&) { /* We're out of memory - give up. */ } - } - delete stream; - } - } + ~QDebug(); inline void swap(QDebug &other) { qSwap(stream, other.stream); } + QDebug &resetFormat(); + inline QDebug &space() { stream->space = true; stream->ts << ' '; return *this; } inline QDebug &nospace() { stream->space = false; return *this; } inline QDebug &maybeSpace() { if (stream->space) stream->ts << ' '; return *this; } @@ -101,7 +102,11 @@ public: bool autoInsertSpaces() const { return stream->space; } void setAutoInsertSpaces(bool b) { stream->space = b; } - inline QDebug &operator<<(QChar t) { stream->ts << '\'' << t << '\''; return maybeSpace(); } + inline QDebug "e() { stream->unsetFlag(Stream::NoQuotes); return *this; } + inline QDebug &noquote() { stream->setFlag(Stream::NoQuotes); return *this; } + inline QDebug &maybeQuote(char c = '"') { if (!(stream->testFlag(Stream::NoQuotes))) stream->ts << c; return *this; } + + inline QDebug &operator<<(QChar t) { maybeQuote('\''); stream->ts << t; maybeQuote('\''); return maybeSpace(); } inline QDebug &operator<<(bool t) { stream->ts << (t ? "true" : "false"); return maybeSpace(); } inline QDebug &operator<<(char t) { stream->ts << t; return maybeSpace(); } inline QDebug &operator<<(signed short t) { stream->ts << t; return maybeSpace(); } @@ -115,10 +120,10 @@ public: inline QDebug &operator<<(float t) { stream->ts << t; return maybeSpace(); } inline QDebug &operator<<(double t) { stream->ts << t; return maybeSpace(); } inline QDebug &operator<<(const char* t) { stream->ts << QString::fromUtf8(t); return maybeSpace(); } - inline QDebug &operator<<(const QString & t) { stream->ts << '\"' << t << '\"'; return maybeSpace(); } + inline QDebug &operator<<(const QString & t) { maybeQuote(); stream->ts << t; maybeQuote(); return maybeSpace(); } inline QDebug &operator<<(const QStringRef & t) { return operator<<(t.toString()); } - inline QDebug &operator<<(QLatin1String t) { stream->ts << '\"' << t << '\"'; return maybeSpace(); } - inline QDebug &operator<<(const QByteArray & t) { stream->ts << '\"' << t << '\"'; return maybeSpace(); } + inline QDebug &operator<<(QLatin1String t) { maybeQuote(); stream->ts << t; maybeQuote(); return maybeSpace(); } + inline QDebug &operator<<(const QByteArray & t) { maybeQuote(); stream->ts << t; maybeQuote(); return maybeSpace(); } inline QDebug &operator<<(const void * t) { stream->ts << t; return maybeSpace(); } inline QDebug &operator<<(QTextStreamFunction f) { stream->ts << f; @@ -150,6 +155,9 @@ public: inline QNoDebug &space() { return *this; } inline QNoDebug &nospace() { return *this; } inline QNoDebug &maybeSpace() { return *this; } + inline QNoDebug "e() { return *this; } + inline QNoDebug &noquote() { return *this; } + inline QNoDebug &maybeQuote(const char = '"') { return *this; } template<typename T> inline QNoDebug &operator<<(const T &) { return *this; } @@ -164,13 +172,8 @@ inline QDebug &QDebug::operator=(const QDebug &other) return *this; } -#if defined(FORCE_UREF) -template <class T> -inline QDebug &operator<<(QDebug debug, const QList<T> &list) -#else template <class T> inline QDebug operator<<(QDebug debug, const QList<T> &list) -#endif { const bool oldSetting = debug.autoInsertSpaces(); debug.nospace() << '('; @@ -184,13 +187,8 @@ inline QDebug operator<<(QDebug debug, const QList<T> &list) return debug.maybeSpace(); } -#if defined(FORCE_UREF) -template <typename T> -inline QDebug &operator<<(QDebug debug, const QVector<T> &vec) -#else template <typename T> inline QDebug operator<<(QDebug debug, const QVector<T> &vec) -#endif { const bool oldSetting = debug.autoInsertSpaces(); debug.nospace() << "QVector"; @@ -198,13 +196,8 @@ inline QDebug operator<<(QDebug debug, const QVector<T> &vec) return operator<<(debug, vec.toList()); } -#if defined(FORCE_UREF) -template <class aKey, class aT> -inline QDebug &operator<<(QDebug debug, const QMap<aKey, aT> &map) -#else template <class aKey, class aT> inline QDebug operator<<(QDebug debug, const QMap<aKey, aT> &map) -#endif { const bool oldSetting = debug.autoInsertSpaces(); debug.nospace() << "QMap("; @@ -217,13 +210,8 @@ inline QDebug operator<<(QDebug debug, const QMap<aKey, aT> &map) return debug.maybeSpace(); } -#if defined(FORCE_UREF) -template <class aKey, class aT> -inline QDebug &operator<<(QDebug debug, const QHash<aKey, aT> &hash) -#else template <class aKey, class aT> inline QDebug operator<<(QDebug debug, const QHash<aKey, aT> &hash) -#endif { const bool oldSetting = debug.autoInsertSpaces(); debug.nospace() << "QHash("; @@ -235,13 +223,8 @@ inline QDebug operator<<(QDebug debug, const QHash<aKey, aT> &hash) return debug.maybeSpace(); } -#if defined(FORCE_UREF) -template <class T1, class T2> -inline QDebug &operator<<(QDebug debug, const QPair<T1, T2> &pair) -#else template <class T1, class T2> inline QDebug operator<<(QDebug debug, const QPair<T1, T2> &pair) -#endif { const bool oldSetting = debug.autoInsertSpaces(); debug.nospace() << "QPair(" << pair.first << ',' << pair.second << ')'; @@ -258,13 +241,8 @@ inline QDebug operator<<(QDebug debug, const QSet<T> &set) return operator<<(debug, set.toList()); } -#if defined(FORCE_UREF) -template <class T> -inline QDebug &operator<<(QDebug debug, const QContiguousCache<T> &cache) -#else template <class T> inline QDebug operator<<(QDebug debug, const QContiguousCache<T> &cache) -#endif { const bool oldSetting = debug.autoInsertSpaces(); debug.nospace() << "QContiguousCache("; @@ -278,29 +256,24 @@ inline QDebug operator<<(QDebug debug, const QContiguousCache<T> &cache) return debug.maybeSpace(); } -#if defined(FORCE_UREF) -template <class T> -inline QDebug &operator<<(QDebug debug, const QFlags<T> &flags) -#else template <class T> inline QDebug operator<<(QDebug debug, const QFlags<T> &flags) -#endif { - const bool oldSetting = debug.autoInsertSpaces(); - debug.nospace() << "QFlags("; + QDebugStateSaver saver(debug); + debug.resetFormat(); + debug.nospace() << "QFlags(" << hex << showbase; bool needSeparator = false; for (uint i = 0; i < sizeof(T) * 8; ++i) { if (flags.testFlag(T(1 << i))) { if (needSeparator) - debug.nospace() << '|'; + debug << '|'; else needSeparator = true; - debug.nospace() << "0x" << QByteArray::number(typename QFlags<T>::Int(1) << i, 16).constData(); + debug << (typename QFlags<T>::Int(1) << i); } } debug << ')'; - debug.setAutoInsertSpaces(oldSetting); - return debug.maybeSpace(); + return debug; } QT_END_NAMESPACE |