src/corelib/io/qdebug.h
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtCore module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #ifndef QDEBUG_H
       
    43 #define QDEBUG_H
       
    44 
       
    45 #include <QtCore/qalgorithms.h>
       
    46 #include <QtCore/qhash.h>
       
    47 #include <QtCore/qlist.h>
       
    48 #include <QtCore/qmap.h>
       
    49 #include <QtCore/qpair.h>
       
    50 #include <QtCore/qtextstream.h>
       
    51 #include <QtCore/qstring.h>
       
    52 #include <QtCore/qvector.h>
       
    53 #include <QtCore/qset.h>
       
    54 #include <QtCore/qcontiguouscache.h>
       
    55 
       
    56 QT_BEGIN_HEADER
       
    57 
       
    58 QT_BEGIN_NAMESPACE
       
    59 
       
    60 QT_MODULE(Core)
       
    61 
       
    62 class Q_CORE_EXPORT QDebug
       
    63 {
       
    64     struct Stream {
       
    65         Stream(QIODevice *device) : ts(device), ref(1), type(QtDebugMsg), space(true), message_output(false) {}
       
    66         Stream(QString *string) : ts(string, QIODevice::WriteOnly), ref(1), type(QtDebugMsg), space(true), message_output(false) {}
       
    67         Stream(QtMsgType t) : ts(&buffer, QIODevice::WriteOnly), ref(1), type(t), space(true), message_output(true) {}
       
    68         QTextStream ts;
       
    69         QString buffer;
       
    70         int ref;
       
    71         QtMsgType type;
       
    72         bool space;
       
    73         bool message_output;
       
    74     } *stream;
       
    75 public:
       
    76     inline QDebug(QIODevice *device) : stream(new Stream(device)) {}
       
    77     inline QDebug(QString *string) : stream(new Stream(string)) {}
       
    78     inline QDebug(QtMsgType t) : stream(new Stream(t)) {}
       
    79     inline QDebug(const QDebug &o):stream(o.stream) { ++stream->ref; }
       
    80     inline QDebug &operator=(const QDebug &other);
       
    81     inline ~QDebug() {
       
    82         if (!--stream->ref) {
       
    83             if(stream->message_output) {
       
    84                 QT_TRY {
       
    85                     qt_message_output(stream->type, stream->buffer.toLocal8Bit().data());
       
    86                 } QT_CATCH(std::bad_alloc) { /* We're out of memory - give up. */ }
       
    87             }
       
    88             delete stream;
       
    89         }
       
    90     }
       
    91     inline QDebug &space() { stream->space = true; stream->ts << ' '; return *this; }
       
    92     inline QDebug &nospace() { stream->space = false; return *this; }
       
    93     inline QDebug &maybeSpace() { if (stream->space) stream->ts << ' '; return *this; }
       
    94 
       
    95     inline QDebug &operator<<(QChar t) { stream->ts << '\'' << t << '\''; return maybeSpace(); }
       
    96     inline QDebug &operator<<(QBool t) { stream->ts << (bool(t) ? "true" : "false"); return maybeSpace(); }
       
    97     inline QDebug &operator<<(bool t) { stream->ts << (t ? "true" : "false"); return maybeSpace(); }
       
    98     inline QDebug &operator<<(char t) { stream->ts << t; return maybeSpace(); }
       
    99     inline QDebug &operator<<(signed short t) { stream->ts << t; return maybeSpace(); }
       
   100     inline QDebug &operator<<(unsigned short t) { stream->ts << t; return maybeSpace(); }
       
   101     inline QDebug &operator<<(signed int t) { stream->ts << t; return maybeSpace(); }
       
   102     inline QDebug &operator<<(unsigned int t) { stream->ts << t; return maybeSpace(); }
       
   103     inline QDebug &operator<<(signed long t) { stream->ts << t; return maybeSpace(); }
       
   104     inline QDebug &operator<<(unsigned long t) { stream->ts << t; return maybeSpace(); }
       
   105     inline QDebug &operator<<(qint64 t)
       
   106         { stream->ts << QString::number(t); return maybeSpace(); }
       
   107     inline QDebug &operator<<(quint64 t)
       
   108         { stream->ts << QString::number(t); return maybeSpace(); }
       
   109     inline QDebug &operator<<(float t) { stream->ts << t; return maybeSpace(); }
       
   110     inline QDebug &operator<<(double t) { stream->ts << t; return maybeSpace(); }
       
   111     inline QDebug &operator<<(const char* t) { stream->ts << QString::fromAscii(t); return maybeSpace(); }
       
   112     inline QDebug &operator<<(const QString & t) { stream->ts << '\"' << t  << '\"'; return maybeSpace(); }
       
   113     inline QDebug &operator<<(const QStringRef & t) { return operator<<(t.toString()); }
       
   114     inline QDebug &operator<<(const QLatin1String &t) { stream->ts << '\"'  << t.latin1() << '\"'; return maybeSpace(); }
       
   115     inline QDebug &operator<<(const QByteArray & t) { stream->ts  << '\"' << t << '\"'; return maybeSpace(); }
       
   116     inline QDebug &operator<<(const void * t) { stream->ts << t; return maybeSpace(); }
       
   117     inline QDebug &operator<<(QTextStreamFunction f) {
       
   118         stream->ts << f;
       
   119         return *this;
       
   120     }
       
   121 
       
   122     inline QDebug &operator<<(QTextStreamManipulator m)
       
   123     { stream->ts << m; return *this; }
       
   124 };
       
   125 
       
   126 class QNoDebug
       
   127 {
       
   128 public:
       
   129     inline QNoDebug(){}
       
   130     inline QNoDebug(const QDebug &){}
       
   131     inline ~QNoDebug(){}
       
   132 #if !defined( QT_NO_TEXTSTREAM )
       
   133     inline QNoDebug &operator<<(QTextStreamFunction) { return *this; }
       
   134     inline QNoDebug &operator<<(QTextStreamManipulator) { return *this; }
       
   135 #endif
       
   136     inline QNoDebug &space() { return *this; }
       
   137     inline QNoDebug &nospace() { return *this; }
       
   138     inline QNoDebug &maybeSpace() { return *this; }
       
   139 
       
   140 #ifndef QT_NO_MEMBER_TEMPLATES
       
   141     template<typename T>
       
   142     inline QNoDebug &operator<<(const T &) { return *this; }
       
   143 #endif
       
   144 };
       
   145 
       
   146 Q_CORE_EXPORT_INLINE QDebug qCritical() { return QDebug(QtCriticalMsg); }
       
   147 
       
   148 inline QDebug &QDebug::operator=(const QDebug &other)
       
   149 {
       
   150     if (this != &other) {
       
   151         QDebug copy(other);
       
   152         qSwap(stream, copy.stream);
       
   153     }
       
   154     return *this;
       
   155 }
       
   156 
       
   157 #if defined(FORCE_UREF)
       
   158 template <class T>
       
   159 inline QDebug &operator<<(QDebug debug, const QList<T> &list)
       
   160 #else
       
   161 template <class T>
       
   162 inline QDebug operator<<(QDebug debug, const QList<T> &list)
       
   163 #endif
       
   164 {
       
   165     debug.nospace() << '(';
       
   166     for (Q_TYPENAME QList<T>::size_type i = 0; i < list.count(); ++i) {
       
   167         if (i)
       
   168             debug << ", ";
       
   169         debug << list.at(i);
       
   170     }
       
   171     debug << ')';
       
   172     return debug.space();
       
   173 }
       
   174 
       
   175 #if defined(FORCE_UREF)
       
   176 template <typename T>
       
   177 inline QDebug &operator<<(QDebug debug, const QVector<T> &vec)
       
   178 #else
       
   179 template <typename T>
       
   180 inline QDebug operator<<(QDebug debug, const QVector<T> &vec)
       
   181 #endif
       
   182 {
       
   183     debug.nospace() << "QVector";
       
   184     return operator<<(debug, vec.toList());
       
   185 }
       
   186 
       
   187 #if defined(FORCE_UREF)
       
   188 template <class aKey, class aT>
       
   189 inline QDebug &operator<<(QDebug debug, const QMap<aKey, aT> &map)
       
   190 #else
       
   191 template <class aKey, class aT>
       
   192 inline QDebug operator<<(QDebug debug, const QMap<aKey, aT> &map)
       
   193 #endif
       
   194 {
       
   195     debug.nospace() << "QMap(";
       
   196     for (typename QMap<aKey, aT>::const_iterator it = map.constBegin();
       
   197          it != map.constEnd(); ++it) {
       
   198         debug << '(' << it.key() << ", " << it.value() << ')';
       
   199     }
       
   200     debug << ')';
       
   201     return debug.space();
       
   202 }
       
   203 
       
   204 #if defined(FORCE_UREF)
       
   205 template <class aKey, class aT>
       
   206 inline QDebug &operator<<(QDebug debug, const QHash<aKey, aT> &hash)
       
   207 #else
       
   208 template <class aKey, class aT>
       
   209 inline QDebug operator<<(QDebug debug, const QHash<aKey, aT> &hash)
       
   210 #endif
       
   211 {
       
   212     debug.nospace() << "QHash(";
       
   213     for (typename QHash<aKey, aT>::const_iterator it = hash.constBegin();
       
   214             it != hash.constEnd(); ++it)
       
   215         debug << '(' << it.key() << ", " << it.value() << ')';
       
   216     debug << ')';
       
   217     return debug.space();
       
   218 }
       
   219 
       
   220 #if defined(FORCE_UREF)
       
   221 template <class T1, class T2>
       
   222 inline QDebug &operator<<(QDebug debug, const QPair<T1, T2> &pair)
       
   223 #else
       
   224 template <class T1, class T2>
       
   225 inline QDebug operator<<(QDebug debug, const QPair<T1, T2> &pair)
       
   226 #endif
       
   227 {
       
   228     debug.nospace() << "QPair(" << pair.first << ',' << pair.second << ')';
       
   229     return debug.space();
       
   230 }
       
   231 
       
   232 template <typename T>
       
   233 inline QDebug operator<<(QDebug debug, const QSet<T> &set)
       
   234 {
       
   235     debug.nospace() << "QSet";
       
   236     return operator<<(debug, set.toList());
       
   237 }
       
   238 
       
   239 #if defined(FORCE_UREF)
       
   240 template <class T>
       
   241 inline QDebug &operator<<(QDebug debug, const QContiguousCache<T> &cache)
       
   242 #else
       
   243 template <class T>
       
   244 inline QDebug operator<<(QDebug debug, const QContiguousCache<T> &cache)
       
   245 #endif
       
   246 {
       
   247     debug.nospace() << "QContiguousCache(";
       
   248     for (int i = cache.firstIndex(); i <= cache.lastIndex(); ++i) {
       
   249         debug << cache[i];
       
   250         if (i != cache.lastIndex())
       
   251             debug << ", ";
       
   252     }
       
   253     debug << ')';
       
   254     return debug.space();
       
   255 }
       
   256 
       
   257 #if !defined(QT_NO_DEBUG_STREAM)
       
   258 Q_CORE_EXPORT_INLINE QDebug qDebug() { return QDebug(QtDebugMsg); }
       
   259 
       
   260 #else // QT_NO_DEBUG_STREAM
       
   261 #undef qDebug
       
   262 inline QNoDebug qDebug() { return QNoDebug(); }
       
   263 #define qDebug QT_NO_QDEBUG_MACRO
       
   264 
       
   265 #ifdef QT_NO_MEMBER_TEMPLATES
       
   266 template<typename T>
       
   267 inline QNoDebug operator<<(QNoDebug debug, const T &) { return debug; }
       
   268 #endif
       
   269 
       
   270 #endif
       
   271 
       
   272 #if !defined(QT_NO_WARNING_OUTPUT)
       
   273 Q_CORE_EXPORT_INLINE QDebug qWarning() { return QDebug(QtWarningMsg); }
       
   274 #else
       
   275 #undef qWarning
       
   276 inline QNoDebug qWarning() { return QNoDebug(); }
       
   277 #define qWarning QT_NO_QWARNING_MACRO
       
   278 #endif
       
   279 
       
   280 QT_END_NAMESPACE
       
   281 
       
   282 QT_END_HEADER
       
   283 
       
   284 #endif // QDEBUG_H