src/corelib/kernel/qvariant.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
child 7 f7bc934e204c
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 #include "qvariant.h"
       
    43 #include "qbitarray.h"
       
    44 #include "qbytearray.h"
       
    45 #include "qdatastream.h"
       
    46 #include "qdebug.h"
       
    47 #include "qmap.h"
       
    48 #include "qdatetime.h"
       
    49 #include "qlist.h"
       
    50 #include "qstring.h"
       
    51 #include "qstringlist.h"
       
    52 #include "qurl.h"
       
    53 #include "qlocale.h"
       
    54 #include "private/qvariant_p.h"
       
    55 
       
    56 #ifndef QT_NO_GEOM_VARIANT
       
    57 #include "qsize.h"
       
    58 #include "qpoint.h"
       
    59 #include "qrect.h"
       
    60 #include "qline.h"
       
    61 #endif
       
    62 
       
    63 #include <float.h>
       
    64 
       
    65 QT_BEGIN_NAMESPACE
       
    66 
       
    67 #ifndef DBL_DIG
       
    68 #  define DBL_DIG 10
       
    69 #endif
       
    70 #ifndef FLT_DIG
       
    71 #  define FLT_DIG 6
       
    72 #endif
       
    73 
       
    74 static void construct(QVariant::Private *x, const void *copy)
       
    75 {
       
    76     x->is_shared = false;
       
    77 
       
    78     switch (x->type) {
       
    79     case QVariant::String:
       
    80         v_construct<QString>(x, copy);
       
    81         break;
       
    82     case QVariant::Char:
       
    83         v_construct<QChar>(x, copy);
       
    84         break;
       
    85     case QVariant::StringList:
       
    86         v_construct<QStringList>(x, copy);
       
    87         break;
       
    88     case QVariant::Map:
       
    89         v_construct<QVariantMap>(x, copy);
       
    90         break;
       
    91     case QVariant::Hash:
       
    92         v_construct<QVariantHash>(x, copy);
       
    93         break;
       
    94     case QVariant::List:
       
    95         v_construct<QVariantList>(x, copy);
       
    96         break;
       
    97     case QVariant::Date:
       
    98         v_construct<QDate>(x, copy);
       
    99         break;
       
   100     case QVariant::Time:
       
   101         v_construct<QTime>(x, copy);
       
   102         break;
       
   103     case QVariant::DateTime:
       
   104         v_construct<QDateTime>(x, copy);
       
   105         break;
       
   106     case QVariant::ByteArray:
       
   107         v_construct<QByteArray>(x, copy);
       
   108         break;
       
   109     case QVariant::BitArray:
       
   110         v_construct<QBitArray>(x, copy);
       
   111         break;
       
   112 #ifndef QT_NO_GEOM_VARIANT
       
   113     case QVariant::Size:
       
   114         v_construct<QSize>(x, copy);
       
   115         break;
       
   116     case QVariant::SizeF:
       
   117         v_construct<QSizeF>(x, copy);
       
   118         break;
       
   119     case QVariant::Rect:
       
   120         v_construct<QRect>(x, copy);
       
   121         break;
       
   122     case QVariant::LineF:
       
   123         v_construct<QLineF>(x, copy);
       
   124         break;
       
   125     case QVariant::Line:
       
   126         v_construct<QLine>(x, copy);
       
   127         break;
       
   128     case QVariant::RectF:
       
   129         v_construct<QRectF>(x, copy);
       
   130         break;
       
   131     case QVariant::Point:
       
   132         v_construct<QPoint>(x, copy);
       
   133         break;
       
   134     case QVariant::PointF:
       
   135         v_construct<QPointF>(x, copy);
       
   136         break;
       
   137 #endif
       
   138     case QVariant::Url:
       
   139         v_construct<QUrl>(x, copy);
       
   140         break;
       
   141     case QVariant::Locale:
       
   142         v_construct<QLocale>(x, copy);
       
   143         break;
       
   144 #ifndef QT_NO_REGEXP
       
   145     case QVariant::RegExp:
       
   146         v_construct<QRegExp>(x, copy);
       
   147         break;
       
   148 #endif
       
   149     case QVariant::Int:
       
   150         x->data.i = copy ? *static_cast<const int *>(copy) : 0;
       
   151         break;
       
   152     case QVariant::UInt:
       
   153         x->data.u = copy ? *static_cast<const uint *>(copy) : 0u;
       
   154         break;
       
   155     case QVariant::Bool:
       
   156         x->data.b = copy ? *static_cast<const bool *>(copy) : false;
       
   157         break;
       
   158     case QVariant::Double:
       
   159         x->data.d = copy ? *static_cast<const double*>(copy) : 0.0;
       
   160         break;
       
   161     case QMetaType::Float:
       
   162         x->data.f = copy ? *static_cast<const float*>(copy) : 0.0f;
       
   163         break;
       
   164     case QMetaType::QObjectStar:
       
   165         x->data.o = copy ? *static_cast<QObject *const*>(copy) : 0;
       
   166         break;
       
   167     case QVariant::LongLong:
       
   168         x->data.ll = copy ? *static_cast<const qlonglong *>(copy) : Q_INT64_C(0);
       
   169         break;
       
   170     case QVariant::ULongLong:
       
   171         x->data.ull = copy ? *static_cast<const qulonglong *>(copy) : Q_UINT64_C(0);
       
   172         break;
       
   173     case QVariant::Invalid:
       
   174     case QVariant::UserType:
       
   175         break;
       
   176     default:
       
   177         void *ptr = QMetaType::construct(x->type, copy);
       
   178         if (!ptr) {
       
   179             x->type = QVariant::Invalid;
       
   180         } else {
       
   181             x->is_shared = true;
       
   182             x->data.shared = new QVariant::PrivateShared(ptr);
       
   183         }
       
   184         break;
       
   185     }
       
   186     x->is_null = !copy;
       
   187 }
       
   188 
       
   189 static void clear(QVariant::Private *d)
       
   190 {
       
   191     switch (d->type) {
       
   192     case QVariant::String:
       
   193         v_clear<QString>(d);
       
   194         break;
       
   195     case QVariant::Char:
       
   196         v_clear<QChar>(d);
       
   197         break;
       
   198     case QVariant::StringList:
       
   199         v_clear<QStringList>(d);
       
   200         break;
       
   201     case QVariant::Map:
       
   202         v_clear<QVariantMap>(d);
       
   203         break;
       
   204     case QVariant::Hash:
       
   205         v_clear<QVariantHash>(d);
       
   206         break;
       
   207     case QVariant::List:
       
   208         v_clear<QVariantList>(d);
       
   209         break;
       
   210     case QVariant::Date:
       
   211         v_clear<QDate>(d);
       
   212         break;
       
   213     case QVariant::Time:
       
   214         v_clear<QTime>(d);
       
   215         break;
       
   216     case QVariant::DateTime:
       
   217         v_clear<QDateTime>(d);
       
   218         break;
       
   219     case QVariant::ByteArray:
       
   220         v_clear<QByteArray>(d);
       
   221         break;
       
   222     case QVariant::BitArray:
       
   223         v_clear<QBitArray>(d);
       
   224         break;
       
   225 #ifndef QT_NO_GEOM_VARIANT
       
   226     case QVariant::Point:
       
   227         v_clear<QPoint>(d);
       
   228         break;
       
   229     case QVariant::PointF:
       
   230         v_clear<QPointF>(d);
       
   231         break;
       
   232     case QVariant::Size:
       
   233         v_clear<QSize>(d);
       
   234         break;
       
   235     case QVariant::SizeF:
       
   236         v_clear<QSizeF>(d);
       
   237         break;
       
   238     case QVariant::Rect:
       
   239         v_clear<QRect>(d);
       
   240         break;
       
   241     case QVariant::LineF:
       
   242         v_clear<QLineF>(d);
       
   243         break;
       
   244     case QVariant::Line:
       
   245         v_clear<QLine>(d);
       
   246         break;
       
   247     case QVariant::RectF:
       
   248         v_clear<QRectF>(d);
       
   249         break;
       
   250 #endif
       
   251     case QVariant::Url:
       
   252         v_clear<QUrl>(d);
       
   253         break;
       
   254     case QVariant::Locale:
       
   255         v_clear<QLocale>(d);
       
   256         break;
       
   257 #ifndef QT_NO_REGEXP
       
   258     case QVariant::RegExp:
       
   259         v_clear<QRegExp>(d);
       
   260         break;
       
   261 #endif
       
   262     case QVariant::LongLong:
       
   263     case QVariant::ULongLong:
       
   264     case QVariant::Double:
       
   265     case QMetaType::Float:
       
   266     case QMetaType::QObjectStar:
       
   267         break;
       
   268     case QVariant::Invalid:
       
   269     case QVariant::UserType:
       
   270     case QVariant::Int:
       
   271     case QVariant::UInt:
       
   272     case QVariant::Bool:
       
   273         break;
       
   274     default:
       
   275         QMetaType::destroy(d->type, d->data.shared->ptr);
       
   276         delete d->data.shared;
       
   277         break;
       
   278     }
       
   279 
       
   280     d->type = QVariant::Invalid;
       
   281     d->is_null = true;
       
   282     d->is_shared = false;
       
   283 }
       
   284 
       
   285 static bool isNull(const QVariant::Private *d)
       
   286 {
       
   287     switch(d->type) {
       
   288     case QVariant::String:
       
   289         return v_cast<QString>(d)->isNull();
       
   290     case QVariant::Char:
       
   291         return v_cast<QChar>(d)->isNull();
       
   292     case QVariant::Date:
       
   293         return v_cast<QDate>(d)->isNull();
       
   294     case QVariant::Time:
       
   295         return v_cast<QTime>(d)->isNull();
       
   296     case QVariant::DateTime:
       
   297         return v_cast<QDateTime>(d)->isNull();
       
   298     case QVariant::ByteArray:
       
   299         return v_cast<QByteArray>(d)->isNull();
       
   300     case QVariant::BitArray:
       
   301         return v_cast<QBitArray>(d)->isNull();
       
   302 #ifndef QT_NO_GEOM_VARIANT
       
   303     case QVariant::Size:
       
   304         return v_cast<QSize>(d)->isNull();
       
   305     case QVariant::SizeF:
       
   306         return v_cast<QSizeF>(d)->isNull();
       
   307     case QVariant::Rect:
       
   308         return v_cast<QRect>(d)->isNull();
       
   309     case QVariant::Line:
       
   310         return v_cast<QLine>(d)->isNull();
       
   311     case QVariant::LineF:
       
   312         return v_cast<QLineF>(d)->isNull();
       
   313     case QVariant::RectF:
       
   314         return v_cast<QRectF>(d)->isNull();
       
   315     case QVariant::Point:
       
   316         return v_cast<QPoint>(d)->isNull();
       
   317     case QVariant::PointF:
       
   318         return v_cast<QPointF>(d)->isNull();
       
   319 #endif
       
   320     case QVariant::Url:
       
   321     case QVariant::Locale:
       
   322     case QVariant::RegExp:
       
   323     case QVariant::StringList:
       
   324     case QVariant::Map:
       
   325     case QVariant::Hash:
       
   326     case QVariant::List:
       
   327     case QVariant::Invalid:
       
   328     case QVariant::UserType:
       
   329     case QVariant::Int:
       
   330     case QVariant::UInt:
       
   331     case QVariant::LongLong:
       
   332     case QVariant::ULongLong:
       
   333     case QVariant::Bool:
       
   334     case QVariant::Double:
       
   335     case QMetaType::Float:
       
   336     case QMetaType::QObjectStar:
       
   337         break;
       
   338     }
       
   339     return d->is_null;
       
   340 }
       
   341 
       
   342 /*
       
   343   \internal
       
   344   \since 4.4
       
   345 
       
   346   We cannot use v_cast() for QMetaType's numeric types because they're smaller than QVariant::Private::Data,
       
   347   which in turns makes v_cast() believe the value is stored in d->data.c. But
       
   348   it's not, since we're a QMetaType type.
       
   349  */
       
   350 template<typename T>
       
   351 inline bool compareNumericMetaType(const QVariant::Private *const a, const QVariant::Private *const b)
       
   352 {
       
   353     return *static_cast<const T *>(a->data.shared->ptr) == *static_cast<const T *>(b->data.shared->ptr);
       
   354 }
       
   355 
       
   356 /*!
       
   357   \internal
       
   358 
       
   359   Compares \a a to \a b. The caller guarantees that \a a and \a b
       
   360   are of the same type.
       
   361  */
       
   362 static bool compare(const QVariant::Private *a, const QVariant::Private *b)
       
   363 {
       
   364     switch(a->type) {
       
   365     case QVariant::List:
       
   366         return *v_cast<QVariantList>(a) == *v_cast<QVariantList>(b);
       
   367     case QVariant::Map: {
       
   368         const QVariantMap *m1 = v_cast<QVariantMap>(a);
       
   369         const QVariantMap *m2 = v_cast<QVariantMap>(b);
       
   370         if (m1->count() != m2->count())
       
   371             return false;
       
   372         QVariantMap::ConstIterator it = m1->constBegin();
       
   373         QVariantMap::ConstIterator it2 = m2->constBegin();
       
   374         while (it != m1->constEnd()) {
       
   375             if (*it != *it2 || it.key() != it2.key())
       
   376                 return false;
       
   377             ++it;
       
   378             ++it2;
       
   379         }
       
   380         return true;
       
   381     }
       
   382     case QVariant::Hash:
       
   383         return *v_cast<QVariantHash>(a) == *v_cast<QVariantHash>(b);
       
   384     case QVariant::String:
       
   385         return *v_cast<QString>(a) == *v_cast<QString>(b);
       
   386     case QVariant::Char:
       
   387         return *v_cast<QChar>(a) == *v_cast<QChar>(b);
       
   388     case QVariant::StringList:
       
   389         return *v_cast<QStringList>(a) == *v_cast<QStringList>(b);
       
   390 #ifndef QT_NO_GEOM_VARIANT
       
   391     case QVariant::Size:
       
   392         return *v_cast<QSize>(a) == *v_cast<QSize>(b);
       
   393     case QVariant::SizeF:
       
   394         return *v_cast<QSizeF>(a) == *v_cast<QSizeF>(b);
       
   395     case QVariant::Rect:
       
   396         return *v_cast<QRect>(a) == *v_cast<QRect>(b);
       
   397     case QVariant::Line:
       
   398         return *v_cast<QLine>(a) == *v_cast<QLine>(b);
       
   399     case QVariant::LineF:
       
   400         return *v_cast<QLineF>(a) == *v_cast<QLineF>(b);
       
   401     case QVariant::RectF:
       
   402         return *v_cast<QRectF>(a) == *v_cast<QRectF>(b);
       
   403     case QVariant::Point:
       
   404         return *v_cast<QPoint>(a) == *v_cast<QPoint>(b);
       
   405     case QVariant::PointF:
       
   406         return *v_cast<QPointF>(a) == *v_cast<QPointF>(b);
       
   407 #endif
       
   408     case QVariant::Url:
       
   409         return *v_cast<QUrl>(a) == *v_cast<QUrl>(b);
       
   410     case QVariant::Locale:
       
   411         return *v_cast<QLocale>(a) == *v_cast<QLocale>(b);
       
   412 #ifndef QT_NO_REGEXP
       
   413     case QVariant::RegExp:
       
   414         return *v_cast<QRegExp>(a) == *v_cast<QRegExp>(b);
       
   415 #endif
       
   416     case QVariant::Int:
       
   417         return a->data.i == b->data.i;
       
   418     case QVariant::UInt:
       
   419         return a->data.u == b->data.u;
       
   420     case QVariant::LongLong:
       
   421         return a->data.ll == b->data.ll;
       
   422     case QVariant::ULongLong:
       
   423         return a->data.ull == b->data.ull;
       
   424     case QVariant::Bool:
       
   425         return a->data.b == b->data.b;
       
   426     case QVariant::Double:
       
   427         return a->data.d == b->data.d;
       
   428     case QMetaType::Float:
       
   429         return a->data.f == b->data.f;
       
   430     case QMetaType::QObjectStar:
       
   431         return a->data.o == b->data.o;
       
   432     case QVariant::Date:
       
   433         return *v_cast<QDate>(a) == *v_cast<QDate>(b);
       
   434     case QVariant::Time:
       
   435         return *v_cast<QTime>(a) == *v_cast<QTime>(b);
       
   436     case QVariant::DateTime:
       
   437         return *v_cast<QDateTime>(a) == *v_cast<QDateTime>(b);
       
   438     case QVariant::ByteArray:
       
   439         return *v_cast<QByteArray>(a) == *v_cast<QByteArray>(b);
       
   440     case QVariant::BitArray:
       
   441         return *v_cast<QBitArray>(a) == *v_cast<QBitArray>(b);
       
   442     case QVariant::Invalid:
       
   443         return true;
       
   444     case QMetaType::Long:
       
   445         return compareNumericMetaType<long>(a, b);
       
   446     case QMetaType::ULong:
       
   447         return compareNumericMetaType<ulong>(a, b);
       
   448     case QMetaType::Short:
       
   449         return compareNumericMetaType<short>(a, b);
       
   450     case QMetaType::UShort:
       
   451         return compareNumericMetaType<ushort>(a, b);
       
   452     case QMetaType::UChar:
       
   453         return compareNumericMetaType<uchar>(a, b);
       
   454     case QMetaType::Char:
       
   455         return compareNumericMetaType<char>(a, b);
       
   456     default:
       
   457         break;
       
   458     }
       
   459     if (!QMetaType::isRegistered(a->type))
       
   460         qFatal("QVariant::compare: type %d unknown to QVariant.", a->type);
       
   461 
       
   462     const void *a_ptr = a->is_shared ? a->data.shared->ptr : &(a->data.ptr);
       
   463     const void *b_ptr = b->is_shared ? b->data.shared->ptr : &(b->data.ptr);
       
   464 
       
   465     /* The reason we cannot place this test in a case branch above for the types
       
   466      * QMetaType::VoidStar, QMetaType::QObjectStar and so forth, is that it wouldn't include
       
   467      * user defined pointer types. */
       
   468     const char *const typeName = QMetaType::typeName(a->type);
       
   469     if (typeName[qstrlen(typeName) - 1] == '*')
       
   470         return *static_cast<void *const *>(a_ptr) == *static_cast<void *const *>(b_ptr);
       
   471 
       
   472     return a_ptr == b_ptr;
       
   473 }
       
   474 
       
   475 /*!
       
   476   \internal
       
   477  */
       
   478 static qlonglong qMetaTypeNumber(const QVariant::Private *d)
       
   479 {
       
   480     switch (d->type) {
       
   481     case QMetaType::Int:
       
   482         return d->data.i;
       
   483     case QMetaType::LongLong:
       
   484         return d->data.ll;
       
   485     case QMetaType::Char:
       
   486         return qlonglong(*static_cast<signed char *>(d->data.shared->ptr));
       
   487     case QMetaType::Short:
       
   488         return qlonglong(*static_cast<short *>(d->data.shared->ptr));
       
   489     case QMetaType::Long:
       
   490         return qlonglong(*static_cast<long *>(d->data.shared->ptr));
       
   491     case QMetaType::Float:
       
   492         return qRound64(d->data.f);
       
   493     case QVariant::Double:
       
   494         return qRound64(d->data.d);
       
   495     }
       
   496     Q_ASSERT(false);
       
   497     return 0;
       
   498 }
       
   499 
       
   500 static qulonglong qMetaTypeUNumber(const QVariant::Private *d)
       
   501 {
       
   502     switch (d->type) {
       
   503     case QVariant::UInt:
       
   504         return d->data.u;
       
   505     case QVariant::ULongLong:
       
   506         return d->data.ull;
       
   507     case QMetaType::UChar:
       
   508         return qulonglong(*static_cast<unsigned char *>(d->data.shared->ptr));
       
   509     case QMetaType::UShort:
       
   510         return qulonglong(*static_cast<ushort *>(d->data.shared->ptr));
       
   511     case QMetaType::ULong:
       
   512         return qulonglong(*static_cast<ulong *>(d->data.shared->ptr));
       
   513     }
       
   514     Q_ASSERT(false);
       
   515     return 0;
       
   516 }
       
   517 
       
   518 static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok)
       
   519 {
       
   520     *ok = true;
       
   521 
       
   522     switch (uint(d->type)) {
       
   523     case QVariant::String:
       
   524         return v_cast<QString>(d)->toLongLong(ok);
       
   525     case QVariant::Char:
       
   526         return v_cast<QChar>(d)->unicode();
       
   527     case QVariant::ByteArray:
       
   528         return v_cast<QByteArray>(d)->toLongLong(ok);
       
   529     case QVariant::Bool:
       
   530         return qlonglong(d->data.b);
       
   531     case QVariant::Double:
       
   532     case QVariant::Int:
       
   533     case QMetaType::Char:
       
   534     case QMetaType::Short:
       
   535     case QMetaType::Long:
       
   536     case QMetaType::Float:
       
   537     case QMetaType::LongLong:
       
   538         return qMetaTypeNumber(d);
       
   539     case QVariant::ULongLong:
       
   540     case QVariant::UInt:
       
   541     case QMetaType::UChar:
       
   542     case QMetaType::UShort:
       
   543     case QMetaType::ULong:
       
   544         return qlonglong(qMetaTypeUNumber(d));
       
   545     }
       
   546 
       
   547     *ok = false;
       
   548     return Q_INT64_C(0);
       
   549 }
       
   550 
       
   551 static qulonglong qConvertToUnsignedNumber(const QVariant::Private *d, bool *ok)
       
   552 {
       
   553     *ok = true;
       
   554 
       
   555     switch (uint(d->type)) {
       
   556     case QVariant::String:
       
   557         return v_cast<QString>(d)->toULongLong(ok);
       
   558     case QVariant::Char:
       
   559         return v_cast<QChar>(d)->unicode();
       
   560     case QVariant::ByteArray:
       
   561         return v_cast<QByteArray>(d)->toULongLong(ok);
       
   562     case QVariant::Bool:
       
   563         return qulonglong(d->data.b);
       
   564     case QVariant::Double:
       
   565     case QVariant::Int:
       
   566     case QMetaType::Char:
       
   567     case QMetaType::Short:
       
   568     case QMetaType::Long:
       
   569     case QMetaType::Float:
       
   570     case QMetaType::LongLong:
       
   571         return qulonglong(qMetaTypeNumber(d));
       
   572     case QVariant::ULongLong:
       
   573     case QVariant::UInt:
       
   574     case QMetaType::UChar:
       
   575     case QMetaType::UShort:
       
   576     case QMetaType::ULong:
       
   577         return qMetaTypeUNumber(d);
       
   578     }
       
   579 
       
   580     *ok = false;
       
   581     return Q_UINT64_C(0);
       
   582 }
       
   583 
       
   584 template<typename TInput, typename LiteralWrapper>
       
   585 inline bool qt_convertToBool(const QVariant::Private *const d)
       
   586 {
       
   587     TInput str = v_cast<TInput>(d)->toLower();
       
   588     return !(str == LiteralWrapper("0") || str == LiteralWrapper("false") || str.isEmpty());
       
   589 }
       
   590 
       
   591 /*!
       
   592  \internal
       
   593 
       
   594  Converts \a d to type \a t, which is placed in \a result.
       
   595  */
       
   596 static bool convert(const QVariant::Private *d, QVariant::Type t, void *result, bool *ok)
       
   597 {
       
   598     Q_ASSERT(d->type != uint(t));
       
   599     Q_ASSERT(result);
       
   600 
       
   601     bool dummy;
       
   602     if (!ok)
       
   603         ok = &dummy;
       
   604 
       
   605     switch (uint(t)) {
       
   606     case QVariant::Url:
       
   607         switch (d->type) {
       
   608         case QVariant::String:
       
   609             *static_cast<QUrl *>(result) = QUrl(*v_cast<QString>(d));
       
   610             break;
       
   611         default:
       
   612             return false;
       
   613         }
       
   614         break;
       
   615     case QVariant::String: {
       
   616         QString *str = static_cast<QString *>(result);
       
   617         switch (d->type) {
       
   618         case QVariant::Char:
       
   619             *str = QString(*v_cast<QChar>(d));
       
   620             break;
       
   621         case QMetaType::Char:
       
   622         case QMetaType::UChar:
       
   623             *str = QChar::fromAscii(*static_cast<char *>(d->data.shared->ptr));
       
   624             break;
       
   625         case QMetaType::Short:
       
   626         case QMetaType::Long:
       
   627         case QVariant::Int:
       
   628         case QVariant::LongLong:
       
   629             *str = QString::number(qMetaTypeNumber(d));
       
   630             break;
       
   631         case QVariant::UInt:
       
   632         case QVariant::ULongLong:
       
   633         case QMetaType::UShort:
       
   634         case QMetaType::ULong:
       
   635             *str = QString::number(qMetaTypeUNumber(d));
       
   636             break;
       
   637         case QMetaType::Float:
       
   638             *str = QString::number(d->data.f, 'g', FLT_DIG);
       
   639             break;
       
   640         case QVariant::Double:
       
   641             *str = QString::number(d->data.d, 'g', DBL_DIG);
       
   642             break;
       
   643 #if !defined(QT_NO_DATESTRING)
       
   644         case QVariant::Date:
       
   645             *str = v_cast<QDate>(d)->toString(Qt::ISODate);
       
   646             break;
       
   647         case QVariant::Time:
       
   648             *str = v_cast<QTime>(d)->toString(Qt::ISODate);
       
   649             break;
       
   650         case QVariant::DateTime:
       
   651             *str = v_cast<QDateTime>(d)->toString(Qt::ISODate);
       
   652             break;
       
   653 #endif
       
   654         case QVariant::Bool:
       
   655             *str = QLatin1String(d->data.b ? "true" : "false");
       
   656             break;
       
   657         case QVariant::ByteArray:
       
   658             *str = QString::fromAscii(v_cast<QByteArray>(d)->constData());
       
   659             break;
       
   660         case QVariant::StringList:
       
   661             if (v_cast<QStringList>(d)->count() == 1)
       
   662                 *str = v_cast<QStringList>(d)->at(0);
       
   663             break;
       
   664         case QVariant::Url:
       
   665             *str = v_cast<QUrl>(d)->toString();
       
   666             break;
       
   667         default:
       
   668             return false;
       
   669         }
       
   670         break;
       
   671     }
       
   672     case QVariant::Char: {
       
   673         QChar *c = static_cast<QChar *>(result);
       
   674         switch (d->type) {
       
   675         case QVariant::Int:
       
   676         case QVariant::LongLong:
       
   677         case QMetaType::Char:
       
   678         case QMetaType::Short:
       
   679         case QMetaType::Long:
       
   680         case QMetaType::Float:
       
   681             *c = QChar(ushort(qMetaTypeNumber(d)));
       
   682             break;
       
   683         case QVariant::UInt:
       
   684         case QVariant::ULongLong:
       
   685         case QMetaType::UChar:
       
   686         case QMetaType::UShort:
       
   687         case QMetaType::ULong:
       
   688             *c = QChar(ushort(qMetaTypeUNumber(d)));
       
   689             break;
       
   690         default:
       
   691             return false;
       
   692         }
       
   693         break;
       
   694     }
       
   695 #ifndef QT_NO_GEOM_VARIANT
       
   696     case QVariant::Size: {
       
   697         QSize *s = static_cast<QSize *>(result);
       
   698         switch (d->type) {
       
   699         case QVariant::SizeF:
       
   700             *s = v_cast<QSizeF>(d)->toSize();
       
   701             break;
       
   702         default:
       
   703             return false;
       
   704         }
       
   705         break;
       
   706     }
       
   707 
       
   708     case QVariant::SizeF: {
       
   709         QSizeF *s = static_cast<QSizeF *>(result);
       
   710         switch (d->type) {
       
   711         case QVariant::Size:
       
   712             *s = QSizeF(*(v_cast<QSize>(d)));
       
   713             break;
       
   714         default:
       
   715             return false;
       
   716         }
       
   717         break;
       
   718     }
       
   719 
       
   720     case QVariant::Line: {
       
   721         QLine *s = static_cast<QLine *>(result);
       
   722         switch (d->type) {
       
   723         case QVariant::LineF:
       
   724             *s = v_cast<QLineF>(d)->toLine();
       
   725             break;
       
   726         default:
       
   727             return false;
       
   728         }
       
   729         break;
       
   730     }
       
   731 
       
   732     case QVariant::LineF: {
       
   733         QLineF *s = static_cast<QLineF *>(result);
       
   734         switch (d->type) {
       
   735         case QVariant::Line:
       
   736             *s = QLineF(*(v_cast<QLine>(d)));
       
   737             break;
       
   738         default:
       
   739             return false;
       
   740         }
       
   741         break;
       
   742     }
       
   743 #endif
       
   744     case QVariant::StringList:
       
   745         if (d->type == QVariant::List) {
       
   746             QStringList *slst = static_cast<QStringList *>(result);
       
   747             const QVariantList *list = v_cast<QVariantList >(d);
       
   748             for (int i = 0; i < list->size(); ++i)
       
   749                 slst->append(list->at(i).toString());
       
   750         } else if (d->type == QVariant::String) {
       
   751             QStringList *slst = static_cast<QStringList *>(result);
       
   752             *slst = QStringList(*v_cast<QString>(d));
       
   753         } else {
       
   754             return false;
       
   755         }
       
   756         break;
       
   757     case QVariant::Date: {
       
   758         QDate *dt = static_cast<QDate *>(result);
       
   759         if (d->type == QVariant::DateTime)
       
   760             *dt = v_cast<QDateTime>(d)->date();
       
   761 #ifndef QT_NO_DATESTRING
       
   762         else if (d->type == QVariant::String)
       
   763             *dt = QDate::fromString(*v_cast<QString>(d), Qt::ISODate);
       
   764 #endif
       
   765         else
       
   766             return false;
       
   767 
       
   768         return dt->isValid();
       
   769     }
       
   770     case QVariant::Time: {
       
   771         QTime *t = static_cast<QTime *>(result);
       
   772         switch (d->type) {
       
   773         case QVariant::DateTime:
       
   774             *t = v_cast<QDateTime>(d)->time();
       
   775             break;
       
   776 #ifndef QT_NO_DATESTRING
       
   777         case QVariant::String:
       
   778             *t = QTime::fromString(*v_cast<QString>(d), Qt::ISODate);
       
   779             break;
       
   780 #endif
       
   781         default:
       
   782             return false;
       
   783         }
       
   784         return t->isValid();
       
   785     }
       
   786     case QVariant::DateTime: {
       
   787         QDateTime *dt = static_cast<QDateTime *>(result);
       
   788         switch (d->type) {
       
   789 #ifndef QT_NO_DATESTRING
       
   790         case QVariant::String:
       
   791             *dt = QDateTime::fromString(*v_cast<QString>(d), Qt::ISODate);
       
   792             break;
       
   793 #endif
       
   794         case QVariant::Date:
       
   795             *dt = QDateTime(*v_cast<QDate>(d));
       
   796             break;
       
   797         default:
       
   798             return false;
       
   799         }
       
   800         return dt->isValid();
       
   801     }
       
   802     case QVariant::ByteArray: {
       
   803         QByteArray *ba = static_cast<QByteArray *>(result);
       
   804         switch (d->type) {
       
   805         case QVariant::String:
       
   806             *ba = v_cast<QString>(d)->toAscii();
       
   807             break;
       
   808         case QVariant::Double:
       
   809             *ba = QByteArray::number(d->data.d, 'g', DBL_DIG);
       
   810             break;
       
   811         case QMetaType::Float:
       
   812             *ba = QByteArray::number(d->data.f, 'g', FLT_DIG);
       
   813             break;
       
   814         case QMetaType::Char:
       
   815         case QMetaType::UChar:
       
   816             *ba = QByteArray(1, *static_cast<char *>(d->data.shared->ptr));
       
   817             break;
       
   818         case QVariant::Int:
       
   819         case QVariant::LongLong:
       
   820         case QMetaType::Short:
       
   821         case QMetaType::Long:
       
   822             *ba = QByteArray::number(qMetaTypeNumber(d));
       
   823             break;
       
   824         case QVariant::UInt:
       
   825         case QVariant::ULongLong:
       
   826         case QMetaType::UShort:
       
   827         case QMetaType::ULong:
       
   828             *ba = QByteArray::number(qMetaTypeUNumber(d));
       
   829             break;
       
   830         case QVariant::Bool:
       
   831             *ba = QByteArray(d->data.b ? "true" : "false");
       
   832             break;
       
   833         default:
       
   834             return false;
       
   835         }
       
   836     }
       
   837     break;
       
   838     case QMetaType::Short:
       
   839         *static_cast<short *>(result) = short(qConvertToNumber(d, ok));
       
   840         return *ok;
       
   841     case QMetaType::Long:
       
   842         *static_cast<long *>(result) = long(qConvertToNumber(d, ok));
       
   843         return *ok;
       
   844     case QMetaType::UShort:
       
   845         *static_cast<ushort *>(result) = ushort(qConvertToUnsignedNumber(d, ok));
       
   846         return *ok;
       
   847     case QMetaType::ULong:
       
   848         *static_cast<ulong *>(result) = ulong(qConvertToUnsignedNumber(d, ok));
       
   849         return *ok;
       
   850     case QVariant::Int:
       
   851         *static_cast<int *>(result) = int(qConvertToNumber(d, ok));
       
   852         return *ok;
       
   853     case QVariant::UInt:
       
   854         *static_cast<uint *>(result) = uint(qConvertToUnsignedNumber(d, ok));
       
   855         return *ok;
       
   856     case QVariant::LongLong:
       
   857         *static_cast<qlonglong *>(result) = qConvertToNumber(d, ok);
       
   858         return *ok;
       
   859     case QVariant::ULongLong: {
       
   860         *static_cast<qulonglong *>(result) = qConvertToUnsignedNumber(d, ok);
       
   861         return *ok;
       
   862     }
       
   863     case QMetaType::UChar: {
       
   864         *static_cast<uchar *>(result) = qConvertToUnsignedNumber(d, ok);
       
   865         return *ok;
       
   866     }
       
   867     case QVariant::Bool: {
       
   868         bool *b = static_cast<bool *>(result);
       
   869         switch(d->type) {
       
   870         case QVariant::ByteArray:
       
   871             *b = qt_convertToBool<QByteArray, QByteArray>(d);
       
   872             break;
       
   873         case QVariant::String:
       
   874             *b = qt_convertToBool<QString, QLatin1String>(d);
       
   875             break;
       
   876         case QVariant::Char:
       
   877             *b = !v_cast<QChar>(d)->isNull();
       
   878             break;
       
   879         case QVariant::Double:
       
   880         case QVariant::Int:
       
   881         case QVariant::LongLong:
       
   882         case QMetaType::Char:
       
   883         case QMetaType::Short:
       
   884         case QMetaType::Long:
       
   885         case QMetaType::Float:
       
   886             *b = qMetaTypeNumber(d) != Q_INT64_C(0);
       
   887             break;
       
   888         case QVariant::UInt:
       
   889         case QVariant::ULongLong:
       
   890         case QMetaType::UChar:
       
   891         case QMetaType::UShort:
       
   892         case QMetaType::ULong:
       
   893             *b = qMetaTypeUNumber(d) != Q_UINT64_C(0);
       
   894             break;
       
   895         default:
       
   896             *b = false;
       
   897             return false;
       
   898         }
       
   899         break;
       
   900     }
       
   901     case QVariant::Double: {
       
   902         double *f = static_cast<double *>(result);
       
   903         switch (d->type) {
       
   904         case QVariant::String:
       
   905             *f = v_cast<QString>(d)->toDouble(ok);
       
   906             break;
       
   907         case QVariant::ByteArray:
       
   908             *f = v_cast<QByteArray>(d)->toDouble(ok);
       
   909             break;
       
   910         case QVariant::Bool:
       
   911             *f = double(d->data.b);
       
   912             break;
       
   913         case QMetaType::Float:
       
   914             *f = double(d->data.f);
       
   915             break;
       
   916         case QVariant::LongLong:
       
   917         case QVariant::Int:
       
   918         case QMetaType::Char:
       
   919         case QMetaType::Short:
       
   920         case QMetaType::Long:
       
   921             *f = double(qMetaTypeNumber(d));
       
   922             break;
       
   923         case QVariant::UInt:
       
   924         case QVariant::ULongLong:
       
   925         case QMetaType::UChar:
       
   926         case QMetaType::UShort:
       
   927         case QMetaType::ULong:
       
   928 #if defined(Q_CC_MSVC) && !defined(Q_CC_MSVC_NET)
       
   929             *f = (double)(qlonglong)qMetaTypeUNumber(d);
       
   930 #else
       
   931             *f = double(qMetaTypeUNumber(d));
       
   932 #endif
       
   933             break;
       
   934         default:
       
   935             *f = 0.0;
       
   936             return false;
       
   937         }
       
   938         break;
       
   939     }
       
   940     case QMetaType::Float: {
       
   941         float *f = static_cast<float *>(result);
       
   942         switch (d->type) {
       
   943         case QVariant::String:
       
   944             *f = v_cast<QString>(d)->toFloat(ok);
       
   945             break;
       
   946         case QVariant::ByteArray:
       
   947             *f = v_cast<QByteArray>(d)->toFloat(ok);
       
   948             break;
       
   949         case QVariant::Bool:
       
   950             *f = float(d->data.b);
       
   951             break;
       
   952         case QVariant::Double:
       
   953             *f = float(d->data.d);
       
   954             break;
       
   955         case QVariant::LongLong:
       
   956         case QVariant::Int:
       
   957         case QMetaType::Char:
       
   958         case QMetaType::Short:
       
   959         case QMetaType::Long:
       
   960             *f = float(qMetaTypeNumber(d));
       
   961             break;
       
   962         case QVariant::UInt:
       
   963         case QVariant::ULongLong:
       
   964         case QMetaType::UChar:
       
   965         case QMetaType::UShort:
       
   966         case QMetaType::ULong:
       
   967 #if defined(Q_CC_MSVC) && !defined(Q_CC_MSVC_NET)
       
   968             *f = (float)(qlonglong)qMetaTypeUNumber(d);
       
   969 #else
       
   970             *f = float(qMetaTypeUNumber(d));
       
   971 #endif
       
   972             break;
       
   973         default:
       
   974             *f = 0.0f;
       
   975             return false;
       
   976         }
       
   977         break;
       
   978     }
       
   979     case QVariant::List:
       
   980         if (d->type == QVariant::StringList) {
       
   981             QVariantList *lst = static_cast<QVariantList *>(result);
       
   982             const QStringList *slist = v_cast<QStringList>(d);
       
   983             for (int i = 0; i < slist->size(); ++i)
       
   984                 lst->append(QVariant(slist->at(i)));
       
   985         } else if (qstrcmp(QMetaType::typeName(d->type), "QList<QVariant>") == 0) {
       
   986             *static_cast<QVariantList *>(result) =
       
   987                 *static_cast<QList<QVariant> *>(d->data.shared->ptr);
       
   988         } else {
       
   989             return false;
       
   990         }
       
   991         break;
       
   992     case QVariant::Map:
       
   993         if (qstrcmp(QMetaType::typeName(d->type), "QMap<QString, QVariant>") == 0) {
       
   994             *static_cast<QVariantMap *>(result) =
       
   995                 *static_cast<QMap<QString, QVariant> *>(d->data.shared->ptr);
       
   996         } else {
       
   997             return false;
       
   998         }
       
   999         break;
       
  1000     case QVariant::Hash:
       
  1001         if (qstrcmp(QMetaType::typeName(d->type), "QHash<QString, QVariant>") == 0) {
       
  1002             *static_cast<QVariantHash *>(result) =
       
  1003                 *static_cast<QHash<QString, QVariant> *>(d->data.shared->ptr);
       
  1004         } else {
       
  1005             return false;
       
  1006         }
       
  1007         break;
       
  1008 #ifndef QT_NO_GEOM_VARIANT
       
  1009     case QVariant::Rect:
       
  1010         if (d->type == QVariant::RectF)
       
  1011             *static_cast<QRect *>(result) = (v_cast<QRectF>(d))->toRect();
       
  1012         else
       
  1013             return false;
       
  1014         break;
       
  1015     case QVariant::RectF:
       
  1016         if (d->type == QVariant::Rect)
       
  1017             *static_cast<QRectF *>(result) = *v_cast<QRect>(d);
       
  1018         else
       
  1019             return false;
       
  1020         break;
       
  1021     case QVariant::PointF:
       
  1022         if (d->type == QVariant::Point)
       
  1023             *static_cast<QPointF *>(result) = *v_cast<QPoint>(d);
       
  1024         else
       
  1025             return false;
       
  1026         break;
       
  1027     case QVariant::Point:
       
  1028         if (d->type == QVariant::PointF)
       
  1029             *static_cast<QPoint *>(result) = (v_cast<QPointF>(d))->toPoint();
       
  1030         else
       
  1031             return false;
       
  1032         break;
       
  1033     case QMetaType::Char:
       
  1034     {
       
  1035         *static_cast<qint8 *>(result) = qint8(qConvertToNumber(d, ok));
       
  1036         return *ok;
       
  1037     }
       
  1038 #endif
       
  1039     default:
       
  1040         return false;
       
  1041     }
       
  1042     return true;
       
  1043 }
       
  1044 
       
  1045 #if !defined(QT_NO_DEBUG_STREAM) && !defined(Q_BROKEN_DEBUG_STREAM)
       
  1046 static void streamDebug(QDebug dbg, const QVariant &v)
       
  1047 {
       
  1048     switch (v.userType()) {
       
  1049     case QVariant::Int:
       
  1050         dbg.nospace() << v.toInt();
       
  1051         break;
       
  1052     case QVariant::UInt:
       
  1053         dbg.nospace() << v.toUInt();
       
  1054         break;
       
  1055     case QVariant::LongLong:
       
  1056         dbg.nospace() << v.toLongLong();
       
  1057         break;
       
  1058     case QVariant::ULongLong:
       
  1059         dbg.nospace() << v.toULongLong();
       
  1060         break;
       
  1061     case QMetaType::Float:
       
  1062         dbg.nospace() << v.toFloat();
       
  1063         break;
       
  1064     case QMetaType::QObjectStar:
       
  1065         dbg.nospace() << qVariantValue<QObject *>(v);
       
  1066         break;
       
  1067     case QVariant::Double:
       
  1068         dbg.nospace() << v.toDouble();
       
  1069         break;
       
  1070     case QVariant::Bool:
       
  1071         dbg.nospace() << v.toBool();
       
  1072         break;
       
  1073     case QVariant::String:
       
  1074         dbg.nospace() << v.toString();
       
  1075         break;
       
  1076     case QVariant::Char:
       
  1077         dbg.nospace() << v.toChar();
       
  1078         break;
       
  1079     case QVariant::StringList:
       
  1080         dbg.nospace() << v.toStringList();
       
  1081         break;
       
  1082     case QVariant::Map:
       
  1083         dbg.nospace() << v.toMap();
       
  1084         break;
       
  1085     case QVariant::Hash:
       
  1086         dbg.nospace() << v.toHash();
       
  1087         break;
       
  1088     case QVariant::List:
       
  1089         dbg.nospace() << v.toList();
       
  1090         break;
       
  1091     case QVariant::Date:
       
  1092         dbg.nospace() << v.toDate();
       
  1093         break;
       
  1094     case QVariant::Time:
       
  1095         dbg.nospace() << v.toTime();
       
  1096         break;
       
  1097     case QVariant::DateTime:
       
  1098         dbg.nospace() << v.toDateTime();
       
  1099         break;
       
  1100     case QVariant::ByteArray:
       
  1101         dbg.nospace() << v.toByteArray();
       
  1102         break;
       
  1103     case QVariant::Url:
       
  1104         dbg.nospace() << v.toUrl();
       
  1105         break;
       
  1106 #ifndef QT_NO_GEOM_VARIANT
       
  1107     case QVariant::Point:
       
  1108         dbg.nospace() << v.toPoint();
       
  1109         break;
       
  1110     case QVariant::PointF:
       
  1111         dbg.nospace() << v.toPointF();
       
  1112         break;
       
  1113     case QVariant::Rect:
       
  1114         dbg.nospace() << v.toRect();
       
  1115         break;
       
  1116     case QVariant::Size:
       
  1117         dbg.nospace() << v.toSize();
       
  1118         break;
       
  1119     case QVariant::SizeF:
       
  1120         dbg.nospace() << v.toSizeF();
       
  1121         break;
       
  1122     case QVariant::Line:
       
  1123         dbg.nospace() << v.toLine();
       
  1124         break;
       
  1125     case QVariant::LineF:
       
  1126         dbg.nospace() << v.toLineF();
       
  1127         break;
       
  1128     case QVariant::RectF:
       
  1129         dbg.nospace() << v.toRectF();
       
  1130         break;
       
  1131 #endif
       
  1132     case QVariant::BitArray:
       
  1133         //dbg.nospace() << v.toBitArray();
       
  1134         break;
       
  1135     default:
       
  1136         break;
       
  1137     }
       
  1138 }
       
  1139 #endif
       
  1140 
       
  1141 const QVariant::Handler qt_kernel_variant_handler = {
       
  1142     construct,
       
  1143     clear,
       
  1144     isNull,
       
  1145 #ifndef QT_NO_DATASTREAM
       
  1146     0,
       
  1147     0,
       
  1148 #endif
       
  1149     compare,
       
  1150     convert,
       
  1151     0,
       
  1152 #if !defined(QT_NO_DEBUG_STREAM) && !defined(Q_BROKEN_DEBUG_STREAM)
       
  1153     streamDebug
       
  1154 #else
       
  1155     0
       
  1156 #endif
       
  1157 };
       
  1158 
       
  1159 Q_CORE_EXPORT const QVariant::Handler *qcoreVariantHandler()
       
  1160 {
       
  1161     return &qt_kernel_variant_handler;
       
  1162 }
       
  1163 
       
  1164 
       
  1165 const QVariant::Handler *QVariant::handler = &qt_kernel_variant_handler;
       
  1166 
       
  1167 /*!
       
  1168     \class QVariant
       
  1169     \brief The QVariant class acts like a union for the most common Qt data types.
       
  1170 
       
  1171     \ingroup objectmodel
       
  1172     \ingroup shared
       
  1173 
       
  1174 
       
  1175     Because C++ forbids unions from including types that have
       
  1176     non-default constructors or destructors, most interesting Qt
       
  1177     classes cannot be used in unions. Without QVariant, this would be
       
  1178     a problem for QObject::property() and for database work, etc.
       
  1179 
       
  1180     A QVariant object holds a single value of a single type() at a
       
  1181     time. (Some type()s are multi-valued, for example a string list.)
       
  1182     You can find out what type, T, the variant holds, convert it to a
       
  1183     different type using convert(), get its value using one of the
       
  1184     toT() functions (e.g., toSize()) and check whether the type can
       
  1185     be converted to a particular type using canConvert().
       
  1186 
       
  1187     The methods named toT() (e.g., toInt(), toString()) are const. If
       
  1188     you ask for the stored type, they return a copy of the stored
       
  1189     object. If you ask for a type that can be generated from the
       
  1190     stored type, toT() copies and converts and leaves the object
       
  1191     itself unchanged. If you ask for a type that cannot be generated
       
  1192     from the stored type, the result depends on the type; see the
       
  1193     function documentation for details.
       
  1194 
       
  1195     Here is some example code to demonstrate the use of QVariant:
       
  1196 
       
  1197     \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 0
       
  1198 
       
  1199     You can even store QList<QVariant> and QMap<QString, QVariant>
       
  1200     values in a variant, so you can easily construct arbitrarily
       
  1201     complex data structures of arbitrary types. This is very powerful
       
  1202     and versatile, but may prove less memory and speed efficient than
       
  1203     storing specific types in standard data structures.
       
  1204 
       
  1205     QVariant also supports the notion of null values, where you can
       
  1206     have a defined type with no value set. However, note that QVariant
       
  1207     types can only be cast when they have had a value set.
       
  1208 
       
  1209     \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 1
       
  1210 
       
  1211     QVariant can be extended to support other types than those
       
  1212     mentioned in the \l Type enum. See the \l QMetaType documentation
       
  1213     for details.
       
  1214 
       
  1215     \section1 A Note on GUI Types
       
  1216 
       
  1217     Because QVariant is part of the QtCore library, it cannot provide
       
  1218     conversion functions to data types defined in QtGui, such as
       
  1219     QColor, QImage, and QPixmap. In other words, there is no \c
       
  1220     toColor() function. Instead, you can use the QVariant::value() or
       
  1221     the qVariantValue() template function. For example:
       
  1222 
       
  1223     \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 2
       
  1224 
       
  1225     The inverse conversion (e.g., from QColor to QVariant) is
       
  1226     automatic for all data types supported by QVariant, including
       
  1227     GUI-related types:
       
  1228 
       
  1229     \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 3
       
  1230 
       
  1231     \section1 Using canConvert() and convert() Consecutively
       
  1232 
       
  1233     When using canConvert() and convert() consecutively, it is possible for
       
  1234     canConvert() to return true, but convert() to return false. This
       
  1235     is typically because canConvert() only reports the general ability of
       
  1236     QVariant to convert between types given suitable data; it is still
       
  1237     possible to supply data which cannot actually be converted.
       
  1238 
       
  1239     For example, canConvert() would return true when called on a variant
       
  1240     containing a string because, in principle, QVariant is able to convert
       
  1241     strings of numbers to integers.
       
  1242     However, if the string contains non-numeric characters, it cannot be
       
  1243     converted to an integer, and any attempt to convert it will fail.
       
  1244     Hence, it is important to have both functions return true for a
       
  1245     successful conversion.
       
  1246 
       
  1247     \sa QMetaType
       
  1248 */
       
  1249 
       
  1250 /*!
       
  1251     \enum QVariant::Type
       
  1252 
       
  1253     This enum type defines the types of variable that a QVariant can
       
  1254     contain.
       
  1255 
       
  1256     \value Invalid  no type
       
  1257     \value BitArray  a QBitArray
       
  1258     \value Bitmap  a QBitmap
       
  1259     \value Bool  a bool
       
  1260     \value Brush  a QBrush
       
  1261     \value ByteArray  a QByteArray
       
  1262     \value Char  a QChar
       
  1263     \value Color  a QColor
       
  1264     \value Cursor  a QCursor
       
  1265     \value Date  a QDate
       
  1266     \value DateTime  a QDateTime
       
  1267     \value Double  a double
       
  1268     \value Font  a QFont
       
  1269     \value Hash a QVariantHash
       
  1270     \value Icon  a QIcon
       
  1271     \value Image  a QImage
       
  1272     \value Int  an int
       
  1273     \value KeySequence  a QKeySequence
       
  1274     \value Line  a QLine
       
  1275     \value LineF  a QLineF
       
  1276     \value List  a QVariantList
       
  1277     \value Locale  a QLocale
       
  1278     \value LongLong a \l qlonglong
       
  1279     \value Map  a QVariantMap
       
  1280     \value Matrix  a QMatrix
       
  1281     \value Transform  a QTransform
       
  1282     \value Matrix4x4  a QMatrix4x4
       
  1283     \value Palette  a QPalette
       
  1284     \value Pen  a QPen
       
  1285     \value Pixmap  a QPixmap
       
  1286     \value Point  a QPoint
       
  1287     \value PointArray  a QPointArray
       
  1288     \value PointF  a QPointF
       
  1289     \value Polygon a QPolygon
       
  1290     \value Quaternion  a QQuaternion
       
  1291     \value Rect  a QRect
       
  1292     \value RectF  a QRectF
       
  1293     \value RegExp  a QRegExp
       
  1294     \value Region  a QRegion
       
  1295     \value Size  a QSize
       
  1296     \value SizeF  a QSizeF
       
  1297     \value SizePolicy  a QSizePolicy
       
  1298     \value String  a QString
       
  1299     \value StringList  a QStringList
       
  1300     \value TextFormat  a QTextFormat
       
  1301     \value TextLength  a QTextLength
       
  1302     \value Time  a QTime
       
  1303     \value UInt  a \l uint
       
  1304     \value ULongLong a \l qulonglong
       
  1305     \value Url  a QUrl
       
  1306     \value Vector2D  a QVector2D
       
  1307     \value Vector3D  a QVector3D
       
  1308     \value Vector4D  a QVector4D
       
  1309 
       
  1310     \value UserType Base value for user-defined types.
       
  1311 
       
  1312     \omitvalue CString
       
  1313     \omitvalue ColorGroup
       
  1314     \omitvalue IconSet
       
  1315     \omitvalue LastGuiType
       
  1316     \omitvalue LastCoreType
       
  1317     \omitvalue LastType
       
  1318 */
       
  1319 
       
  1320 /*!
       
  1321     \fn QVariant::QVariant()
       
  1322 
       
  1323     Constructs an invalid variant.
       
  1324 */
       
  1325 
       
  1326 
       
  1327 /*!
       
  1328     \fn QVariant::QVariant(int typeOrUserType, const void *copy)
       
  1329 
       
  1330     Constructs variant of type \a typeOrUserType, and initializes with
       
  1331     \a copy if \a copy is not 0.
       
  1332 
       
  1333     Note that you have to pass the address of the variable you want stored.
       
  1334 
       
  1335     Usually, you never have to use this constructor, use qVariantFromValue()
       
  1336     instead to construct variants from the pointer types represented by
       
  1337     \c QMetaType::VoidStar, \c QMetaType::QObjectStar and
       
  1338     \c QMetaType::QWidgetStar.
       
  1339 
       
  1340     \sa qVariantFromValue(), Type
       
  1341 */
       
  1342 
       
  1343 /*!
       
  1344     \fn QVariant::QVariant(Type type)
       
  1345 
       
  1346     Constructs a null variant of type \a type.
       
  1347 */
       
  1348 
       
  1349 
       
  1350 
       
  1351 /*!
       
  1352     \fn QVariant::create(int type, const void *copy)
       
  1353 
       
  1354     \internal
       
  1355 
       
  1356     Constructs a variant private of type \a type, and initializes with \a copy if
       
  1357     \a copy is not 0.
       
  1358 */
       
  1359 
       
  1360 void QVariant::create(int type, const void *copy)
       
  1361 {
       
  1362     d.type = type;
       
  1363     handler->construct(&d, copy);
       
  1364 }
       
  1365 
       
  1366 /*!
       
  1367     \fn QVariant::~QVariant()
       
  1368 
       
  1369     Destroys the QVariant and the contained object.
       
  1370 
       
  1371     Note that subclasses that reimplement clear() should reimplement
       
  1372     the destructor to call clear(). This destructor calls clear(), but
       
  1373     because it is the destructor, QVariant::clear() is called rather
       
  1374     than a subclass's clear().
       
  1375 */
       
  1376 
       
  1377 QVariant::~QVariant()
       
  1378 {
       
  1379     if ((d.is_shared && !d.data.shared->ref.deref()) || (!d.is_shared && d.type > Char && d.type < UserType))
       
  1380         handler->clear(&d);
       
  1381 }
       
  1382 
       
  1383 /*!
       
  1384   \fn QVariant::QVariant(const QVariant &p)
       
  1385 
       
  1386     Constructs a copy of the variant, \a p, passed as the argument to
       
  1387     this constructor.
       
  1388 */
       
  1389 
       
  1390 QVariant::QVariant(const QVariant &p)
       
  1391     : d(p.d)
       
  1392 {
       
  1393     if (d.is_shared) {
       
  1394         d.data.shared->ref.ref();
       
  1395     } else if (p.d.type > Char && p.d.type < QVariant::UserType) {
       
  1396         handler->construct(&d, p.constData());
       
  1397         d.is_null = p.d.is_null;
       
  1398     }
       
  1399 }
       
  1400 
       
  1401 #ifndef QT_NO_DATASTREAM
       
  1402 /*!
       
  1403     Reads the variant from the data stream, \a s.
       
  1404 */
       
  1405 QVariant::QVariant(QDataStream &s)
       
  1406 {
       
  1407     d.is_null = true;
       
  1408     s >> *this;
       
  1409 }
       
  1410 #endif //QT_NO_DATASTREAM
       
  1411 
       
  1412 /*!
       
  1413   \fn QVariant::QVariant(const QString &val)
       
  1414 
       
  1415     Constructs a new variant with a string value, \a val.
       
  1416 */
       
  1417 
       
  1418 /*!
       
  1419   \fn QVariant::QVariant(const QLatin1String &val)
       
  1420 
       
  1421     Constructs a new variant with a string value, \a val.
       
  1422 */
       
  1423 
       
  1424 /*!
       
  1425   \fn QVariant::QVariant(const char *val)
       
  1426 
       
  1427     Constructs a new variant with a string value of \a val.
       
  1428     The variant creates a deep copy of \a val, using the encoding
       
  1429     set by QTextCodec::setCodecForCStrings().
       
  1430 
       
  1431     Note that \a val is converted to a QString for storing in the
       
  1432     variant and QVariant::type() will return QMetaType::QString for
       
  1433     the variant.
       
  1434 
       
  1435     You can disable this operator by defining \c
       
  1436     QT_NO_CAST_FROM_ASCII when you compile your applications.
       
  1437 
       
  1438     \sa QTextCodec::setCodecForCStrings()
       
  1439 */
       
  1440 
       
  1441 #ifndef QT_NO_CAST_FROM_ASCII
       
  1442 QVariant::QVariant(const char *val)
       
  1443 {
       
  1444     QString s = QString::fromAscii(val);
       
  1445     create(String, &s);
       
  1446 }
       
  1447 #endif
       
  1448 
       
  1449 /*!
       
  1450   \fn QVariant::QVariant(const QStringList &val)
       
  1451 
       
  1452     Constructs a new variant with a string list value, \a val.
       
  1453 */
       
  1454 
       
  1455 /*!
       
  1456   \fn QVariant::QVariant(const QMap<QString, QVariant> &val)
       
  1457 
       
  1458     Constructs a new variant with a map of QVariants, \a val.
       
  1459 */
       
  1460 
       
  1461 /*!
       
  1462   \fn QVariant::QVariant(const QHash<QString, QVariant> &val)
       
  1463 
       
  1464     Constructs a new variant with a hash of QVariants, \a val.
       
  1465 */
       
  1466 
       
  1467 /*!
       
  1468   \fn QVariant::QVariant(const QDate &val)
       
  1469 
       
  1470     Constructs a new variant with a date value, \a val.
       
  1471 */
       
  1472 
       
  1473 /*!
       
  1474   \fn QVariant::QVariant(const QTime &val)
       
  1475 
       
  1476     Constructs a new variant with a time value, \a val.
       
  1477 */
       
  1478 
       
  1479 /*!
       
  1480   \fn QVariant::QVariant(const QDateTime &val)
       
  1481 
       
  1482     Constructs a new variant with a date/time value, \a val.
       
  1483 */
       
  1484 
       
  1485 /*!
       
  1486   \fn QVariant::QVariant(const QByteArray &val)
       
  1487 
       
  1488     Constructs a new variant with a bytearray value, \a val.
       
  1489 */
       
  1490 
       
  1491 /*!
       
  1492   \fn QVariant::QVariant(const QBitArray &val)
       
  1493 
       
  1494     Constructs a new variant with a bitarray value, \a val.
       
  1495 */
       
  1496 
       
  1497 /*!
       
  1498   \fn QVariant::QVariant(const QPoint &val)
       
  1499 
       
  1500   Constructs a new variant with a point value of \a val.
       
  1501  */
       
  1502 
       
  1503 /*!
       
  1504   \fn QVariant::QVariant(const QPointF &val)
       
  1505 
       
  1506   Constructs a new variant with a point value of \a val.
       
  1507  */
       
  1508 
       
  1509 /*!
       
  1510   \fn QVariant::QVariant(const QRectF &val)
       
  1511 
       
  1512   Constructs a new variant with a rect value of \a val.
       
  1513  */
       
  1514 
       
  1515 /*!
       
  1516   \fn QVariant::QVariant(const QLineF &val)
       
  1517 
       
  1518   Constructs a new variant with a line value of \a val.
       
  1519  */
       
  1520 
       
  1521 /*!
       
  1522   \fn QVariant::QVariant(const QLine &val)
       
  1523 
       
  1524   Constructs a new variant with a line value of \a val.
       
  1525  */
       
  1526 
       
  1527 /*!
       
  1528   \fn QVariant::QVariant(const QRect &val)
       
  1529 
       
  1530   Constructs a new variant with a rect value of \a val.
       
  1531  */
       
  1532 
       
  1533 /*!
       
  1534   \fn QVariant::QVariant(const QSize &val)
       
  1535 
       
  1536   Constructs a new variant with a size value of \a val.
       
  1537  */
       
  1538 
       
  1539 /*!
       
  1540   \fn QVariant::QVariant(const QSizeF &val)
       
  1541 
       
  1542   Constructs a new variant with a size value of \a val.
       
  1543  */
       
  1544 
       
  1545 /*!
       
  1546   \fn QVariant::QVariant(const QUrl &val)
       
  1547 
       
  1548   Constructs a new variant with a url value of \a val.
       
  1549  */
       
  1550 
       
  1551 /*!
       
  1552   \fn QVariant::QVariant(int val)
       
  1553 
       
  1554     Constructs a new variant with an integer value, \a val.
       
  1555 */
       
  1556 
       
  1557 /*!
       
  1558   \fn QVariant::QVariant(uint val)
       
  1559 
       
  1560     Constructs a new variant with an unsigned integer value, \a val.
       
  1561 */
       
  1562 
       
  1563 /*!
       
  1564   \fn QVariant::QVariant(qlonglong val)
       
  1565 
       
  1566     Constructs a new variant with a long long integer value, \a val.
       
  1567 */
       
  1568 
       
  1569 /*!
       
  1570   \fn QVariant::QVariant(qulonglong val)
       
  1571 
       
  1572     Constructs a new variant with an unsigned long long integer value, \a val.
       
  1573 */
       
  1574 
       
  1575 
       
  1576 /*!
       
  1577   \fn QVariant::QVariant(bool val)
       
  1578 
       
  1579     Constructs a new variant with a boolean value, \a val.
       
  1580 */
       
  1581 
       
  1582 /*!
       
  1583   \fn QVariant::QVariant(double val)
       
  1584 
       
  1585     Constructs a new variant with a floating point value, \a val.
       
  1586 */
       
  1587 
       
  1588 /*!
       
  1589   \fn QVariant::QVariant(float val)
       
  1590 
       
  1591     Constructs a new variant with a floating point value, \a val.
       
  1592     \since 4.6
       
  1593 */
       
  1594 
       
  1595 /*!
       
  1596     \fn QVariant::QVariant(const QList<QVariant> &val)
       
  1597 
       
  1598     Constructs a new variant with a list value, \a val.
       
  1599 */
       
  1600 
       
  1601 /*!
       
  1602   \fn QVariant::QVariant(const QChar &c)
       
  1603 
       
  1604   Constructs a new variant with a char value, \a c.
       
  1605 */
       
  1606 
       
  1607 /*!
       
  1608   \fn QVariant::QVariant(const QLocale &l)
       
  1609 
       
  1610   Constructs a new variant with a locale value, \a l.
       
  1611 */
       
  1612 
       
  1613 /*!
       
  1614   \fn QVariant::QVariant(const QRegExp &regExp)
       
  1615 
       
  1616   Constructs a new variant with the regexp value \a regExp.
       
  1617 */
       
  1618 
       
  1619 /*! \since 4.2
       
  1620   \fn QVariant::QVariant(Qt::GlobalColor color)
       
  1621 
       
  1622   Constructs a new variant of type QVariant::Color and initializes
       
  1623   it with \a color.
       
  1624 
       
  1625   This is a convenience constructor that allows \c{QVariant(Qt::blue);}
       
  1626   to create a valid QVariant storing a QColor.
       
  1627 
       
  1628   Note: This constructor will assert if the application does not link
       
  1629   to the Qt GUI library.
       
  1630  */
       
  1631 
       
  1632 QVariant::QVariant(Type type)
       
  1633 { create(type, 0); }
       
  1634 QVariant::QVariant(int typeOrUserType, const void *copy)
       
  1635 { create(typeOrUserType, copy); d.is_null = false; }
       
  1636 
       
  1637 /*! \internal
       
  1638     flags is true if it is a pointer type
       
  1639  */
       
  1640 QVariant::QVariant(int typeOrUserType, const void *copy, uint flags)
       
  1641 {
       
  1642     if (flags) { //type is a pointer type
       
  1643         d.type = typeOrUserType;
       
  1644         d.data.ptr = *reinterpret_cast<void *const*>(copy);
       
  1645         d.is_null = false;
       
  1646     } else {
       
  1647         create(typeOrUserType, copy);
       
  1648         d.is_null = false;
       
  1649     }
       
  1650 }
       
  1651 
       
  1652 QVariant::QVariant(int val)
       
  1653 { d.is_null = false; d.type = Int; d.data.i = val; }
       
  1654 QVariant::QVariant(uint val)
       
  1655 { d.is_null = false; d.type = UInt; d.data.u = val; }
       
  1656 QVariant::QVariant(qlonglong val)
       
  1657 { d.is_null = false; d.type = LongLong; d.data.ll = val; }
       
  1658 QVariant::QVariant(qulonglong val)
       
  1659 { d.is_null = false; d.type = ULongLong; d.data.ull = val; }
       
  1660 QVariant::QVariant(bool val)
       
  1661 { d.is_null = false; d.type = Bool; d.data.b = val; }
       
  1662 QVariant::QVariant(double val)
       
  1663 { d.is_null = false; d.type = Double; d.data.d = val; }
       
  1664 
       
  1665 QVariant::QVariant(const QByteArray &val)
       
  1666 { d.is_null = false; d.type = ByteArray; v_construct<QByteArray>(&d, val); }
       
  1667 QVariant::QVariant(const QBitArray &val)
       
  1668 { d.is_null = false; d.type = BitArray; v_construct<QBitArray>(&d, val);  }
       
  1669 QVariant::QVariant(const QString &val)
       
  1670 { d.is_null = false; d.type = String; v_construct<QString>(&d, val);  }
       
  1671 QVariant::QVariant(const QChar &val)
       
  1672 { d.is_null = false; d.type = Char; v_construct<QChar>(&d, val);  }
       
  1673 QVariant::QVariant(const QLatin1String &val)
       
  1674 { QString str(val); d.is_null = false; d.type = String; v_construct<QString>(&d, str); }
       
  1675 QVariant::QVariant(const QStringList &val)
       
  1676 { d.is_null = false; d.type = StringList; v_construct<QStringList>(&d, val); }
       
  1677 
       
  1678 QVariant::QVariant(const QDate &val)
       
  1679 { d.is_null = false; d.type = Date; v_construct<QDate>(&d, val); }
       
  1680 QVariant::QVariant(const QTime &val)
       
  1681 { d.is_null = false; d.type = Time; v_construct<QTime>(&d, val); }
       
  1682 QVariant::QVariant(const QDateTime &val)
       
  1683 { d.is_null = false; d.type = DateTime; v_construct<QDateTime>(&d, val); }
       
  1684 QVariant::QVariant(const QList<QVariant> &list)
       
  1685 { d.is_null = false; d.type = List; v_construct<QVariantList>(&d, list); }
       
  1686 QVariant::QVariant(const QMap<QString, QVariant> &map)
       
  1687 { d.is_null = false; d.type = Map; v_construct<QVariantMap>(&d, map); }
       
  1688 QVariant::QVariant(const QHash<QString, QVariant> &hash)
       
  1689 { d.is_null = false; d.type = Hash; v_construct<QVariantHash>(&d, hash); }
       
  1690 #ifndef QT_NO_GEOM_VARIANT
       
  1691 QVariant::QVariant(const QPoint &pt) { d.is_null = false; d.type = Point; v_construct<QPoint>(&d, pt); }
       
  1692 QVariant::QVariant(const QPointF &pt) { d.is_null = false; d.type = PointF; v_construct<QPointF>(&d, pt); }
       
  1693 QVariant::QVariant(const QRectF &r) { d.is_null = false; d.type = RectF; v_construct<QRectF>(&d, r); }
       
  1694 QVariant::QVariant(const QLineF &l) { d.is_null = false; d.type = LineF; v_construct<QLineF>(&d, l); }
       
  1695 QVariant::QVariant(const QLine &l) { d.is_null = false; d.type = Line; v_construct<QLine>(&d, l); }
       
  1696 QVariant::QVariant(const QRect &r) { d.is_null = false; d.type = Rect; v_construct<QRect>(&d, r); }
       
  1697 QVariant::QVariant(const QSize &s) { d.is_null = false; d.type = Size; v_construct<QSize>(&d, s); }
       
  1698 QVariant::QVariant(const QSizeF &s) { d.is_null = false; d.type = SizeF; v_construct<QSizeF>(&d, s); }
       
  1699 #endif
       
  1700 QVariant::QVariant(const QUrl &u) { d.is_null = false; d.type = Url; v_construct<QUrl>(&d, u); }
       
  1701 QVariant::QVariant(const QLocale &l) { d.is_null = false; d.type = Locale; v_construct<QLocale>(&d, l); }
       
  1702 #ifndef QT_NO_REGEXP
       
  1703 QVariant::QVariant(const QRegExp &regExp) { d.is_null = false; d.type = RegExp; v_construct<QRegExp>(&d, regExp); }
       
  1704 #endif
       
  1705 QVariant::QVariant(Qt::GlobalColor color) { create(62, &color); }
       
  1706 
       
  1707 /*!
       
  1708     Returns the storage type of the value stored in the variant.
       
  1709     Although this function is declared as returning QVariant::Type,
       
  1710     the return value should be interpreted as QMetaType::Type. In
       
  1711     particular, QVariant::UserType is returned here only if the value
       
  1712     is equal or greater than QMetaType::User.
       
  1713 
       
  1714     Note that return values in the ranges QVariant::Char through
       
  1715     QVariant::RegExp and QVariant::Font through QVariant::Transform
       
  1716     correspond to the values in the ranges QMetaType::QChar through
       
  1717     QMetaType::QRegExp and QMetaType::QFont through QMetaType::QQuaternion.
       
  1718 
       
  1719     Pay particular attention when working with char and QChar
       
  1720     variants.  Note that there is no QVariant constructor specifically
       
  1721     for type char, but there is one for QChar. For a variant of type
       
  1722     QChar, this function returns QVariant::Char, which is the same as
       
  1723     QMetaType::QChar, but for a variant of type \c char, this function
       
  1724     returns QMetaType::Char, which is \e not the same as
       
  1725     QVariant::Char.
       
  1726 
       
  1727     Also note that the types \c void*, \c long, \c short, \c unsigned
       
  1728     \c long, \c unsigned \c short, \c unsigned \c char, \c float, \c
       
  1729     QObject*, and \c QWidget* are represented in QMetaType::Type but
       
  1730     not in QVariant::Type, and they can be returned by this function.
       
  1731     However, they are considered to be user defined types when tested
       
  1732     against QVariant::Type.
       
  1733 
       
  1734     To test whether an instance of QVariant contains a data type that
       
  1735     is compatible with the data type you are interested in, use
       
  1736     canConvert().
       
  1737 */
       
  1738 
       
  1739 QVariant::Type QVariant::type() const
       
  1740 {
       
  1741     return d.type >= QMetaType::User ? UserType : static_cast<Type>(d.type);
       
  1742 }
       
  1743 
       
  1744 /*!
       
  1745     Returns the storage type of the value stored in the variant. For
       
  1746     non-user types, this is the same as type().
       
  1747 
       
  1748     \sa type()
       
  1749 */
       
  1750 
       
  1751 int QVariant::userType() const
       
  1752 {
       
  1753     return d.type;
       
  1754 }
       
  1755 
       
  1756 /*!
       
  1757     Assigns the value of the variant \a variant to this variant.
       
  1758 */
       
  1759 QVariant& QVariant::operator=(const QVariant &variant)
       
  1760 {
       
  1761     if (this == &variant)
       
  1762         return *this;
       
  1763 
       
  1764     clear();
       
  1765     if (variant.d.is_shared) {
       
  1766         variant.d.data.shared->ref.ref();
       
  1767         d = variant.d;
       
  1768     } else if (variant.d.type > Char && variant.d.type < UserType) {
       
  1769         d.type = variant.d.type;
       
  1770         handler->construct(&d, variant.constData());
       
  1771         d.is_null = variant.d.is_null;
       
  1772     } else {
       
  1773         d = variant.d;
       
  1774     }
       
  1775 
       
  1776     return *this;
       
  1777 }
       
  1778 
       
  1779 /*!
       
  1780     \fn void QVariant::detach()
       
  1781 
       
  1782     \internal
       
  1783 */
       
  1784 
       
  1785 void QVariant::detach()
       
  1786 {
       
  1787     if (!d.is_shared || d.data.shared->ref == 1)
       
  1788         return;
       
  1789 
       
  1790     Private dd;
       
  1791     dd.type = d.type;
       
  1792     handler->construct(&dd, constData());
       
  1793     if (!d.data.shared->ref.deref())
       
  1794         handler->clear(&d);
       
  1795     d.data.shared = dd.data.shared;
       
  1796 }
       
  1797 
       
  1798 /*!
       
  1799     \fn bool QVariant::isDetached() const
       
  1800 
       
  1801     \internal
       
  1802 */
       
  1803 
       
  1804 // ### Qt 5: change typeName()(and froends= to return a QString. Suggestion from Harald.
       
  1805 /*!
       
  1806     Returns the name of the type stored in the variant. The returned
       
  1807     strings describe the C++ datatype used to store the data: for
       
  1808     example, "QFont", "QString", or "QVariantList". An Invalid
       
  1809     variant returns 0.
       
  1810 */
       
  1811 const char *QVariant::typeName() const
       
  1812 {
       
  1813     return typeToName(Type(d.type));
       
  1814 }
       
  1815 
       
  1816 /*!
       
  1817     Convert this variant to type Invalid and free up any resources
       
  1818     used.
       
  1819 */
       
  1820 void QVariant::clear()
       
  1821 {
       
  1822     if ((d.is_shared && !d.data.shared->ref.deref()) || (!d.is_shared && d.type < UserType && d.type > Char))
       
  1823         handler->clear(&d);
       
  1824     d.type = Invalid;
       
  1825     d.is_null = true;
       
  1826     d.is_shared = false;
       
  1827 }
       
  1828 
       
  1829 /*!
       
  1830     Converts the enum representation of the storage type, \a typ, to
       
  1831     its string representation.
       
  1832 
       
  1833     Returns a null pointer if the type is QVariant::Invalid or doesn't exist.
       
  1834 */
       
  1835 const char *QVariant::typeToName(Type typ)
       
  1836 {
       
  1837     if (typ == Invalid)
       
  1838         return 0;
       
  1839     if (typ == UserType)
       
  1840         return "UserType";
       
  1841 
       
  1842     return QMetaType::typeName(typ);
       
  1843 }
       
  1844 
       
  1845 
       
  1846 /*!
       
  1847     Converts the string representation of the storage type given in \a
       
  1848     name, to its enum representation.
       
  1849 
       
  1850     If the string representation cannot be converted to any enum
       
  1851     representation, the variant is set to \c Invalid.
       
  1852 */
       
  1853 QVariant::Type QVariant::nameToType(const char *name)
       
  1854 {
       
  1855     if (!name || !*name)
       
  1856         return Invalid;
       
  1857     if (strcmp(name, "Q3CString") == 0)
       
  1858         return ByteArray;
       
  1859     if (strcmp(name, "Q_LLONG") == 0)
       
  1860         return LongLong;
       
  1861     if (strcmp(name, "Q_ULLONG") == 0)
       
  1862         return ULongLong;
       
  1863     if (strcmp(name, "QIconSet") == 0)
       
  1864         return Icon;
       
  1865     if (strcmp(name, "UserType") == 0)
       
  1866         return UserType;
       
  1867 
       
  1868     int metaType = QMetaType::type(name);
       
  1869     return metaType <= int(LastGuiType) ? QVariant::Type(metaType) : UserType;
       
  1870 }
       
  1871 
       
  1872 #ifndef QT_NO_DATASTREAM
       
  1873 enum { MapFromThreeCount = 35 };
       
  1874 static const ushort map_from_three[MapFromThreeCount] =
       
  1875 {
       
  1876     QVariant::Invalid,
       
  1877     QVariant::Map,
       
  1878     QVariant::List,
       
  1879     QVariant::String,
       
  1880     QVariant::StringList,
       
  1881     QVariant::Font,
       
  1882     QVariant::Pixmap,
       
  1883     QVariant::Brush,
       
  1884     QVariant::Rect,
       
  1885     QVariant::Size,
       
  1886     QVariant::Color,
       
  1887     QVariant::Palette,
       
  1888     63, // ColorGroup
       
  1889     QVariant::Icon,
       
  1890     QVariant::Point,
       
  1891     QVariant::Image,
       
  1892     QVariant::Int,
       
  1893     QVariant::UInt,
       
  1894     QVariant::Bool,
       
  1895     QVariant::Double,
       
  1896     QVariant::ByteArray,
       
  1897     QVariant::Polygon,
       
  1898     QVariant::Region,
       
  1899     QVariant::Bitmap,
       
  1900     QVariant::Cursor,
       
  1901     QVariant::SizePolicy,
       
  1902     QVariant::Date,
       
  1903     QVariant::Time,
       
  1904     QVariant::DateTime,
       
  1905     QVariant::ByteArray,
       
  1906     QVariant::BitArray,
       
  1907     QVariant::KeySequence,
       
  1908     QVariant::Pen,
       
  1909     QVariant::LongLong,
       
  1910     QVariant::ULongLong
       
  1911 };
       
  1912 
       
  1913 /*!
       
  1914     Internal function for loading a variant from stream \a s. Use the
       
  1915     stream operators instead.
       
  1916 
       
  1917     \internal
       
  1918 */
       
  1919 void QVariant::load(QDataStream &s)
       
  1920 {
       
  1921     clear();
       
  1922 
       
  1923     quint32 u;
       
  1924     s >> u;
       
  1925     if (s.version() < QDataStream::Qt_4_0) {
       
  1926         if (u >= MapFromThreeCount)
       
  1927             return;
       
  1928         u = map_from_three[u];
       
  1929     }
       
  1930     qint8 is_null = false;
       
  1931     if (s.version() >= QDataStream::Qt_4_2)
       
  1932         s >> is_null;
       
  1933     if (u == QVariant::UserType) {
       
  1934         QByteArray name;
       
  1935         s >> name;
       
  1936         u = QMetaType::type(name);
       
  1937         if (!u) {
       
  1938             s.setStatus(QDataStream::ReadCorruptData);
       
  1939             return;
       
  1940         }
       
  1941     }
       
  1942     create(static_cast<int>(u), 0);
       
  1943     d.is_null = is_null;
       
  1944 
       
  1945     if (!isValid()) {
       
  1946         // Since we wrote something, we should read something
       
  1947         QString x;
       
  1948         s >> x;
       
  1949         d.is_null = true;
       
  1950         return;
       
  1951     }
       
  1952 
       
  1953     // const cast is safe since we operate on a newly constructed variant
       
  1954     if (!QMetaType::load(s, d.type, const_cast<void *>(constData()))) {
       
  1955         s.setStatus(QDataStream::ReadCorruptData);
       
  1956         qWarning("QVariant::load: unable to load type %d.", d.type);
       
  1957     }
       
  1958 }
       
  1959 
       
  1960 /*!
       
  1961     Internal function for saving a variant to the stream \a s. Use the
       
  1962     stream operators instead.
       
  1963 
       
  1964     \internal
       
  1965 */
       
  1966 void QVariant::save(QDataStream &s) const
       
  1967 {
       
  1968     quint32 tp = type();
       
  1969     if (s.version() < QDataStream::Qt_4_0) {
       
  1970         int i;
       
  1971         for (i = MapFromThreeCount - 1; i >= 0; i--) {
       
  1972             if (map_from_three[i] == tp) {
       
  1973                 tp = i;
       
  1974                 break;
       
  1975             }
       
  1976         }
       
  1977         if (i == -1) {
       
  1978             s << QVariant();
       
  1979             return;
       
  1980         }
       
  1981     }
       
  1982     s << tp;
       
  1983     if (s.version() >= QDataStream::Qt_4_2)
       
  1984         s << qint8(d.is_null);
       
  1985     if (tp == QVariant::UserType) {
       
  1986         s << QMetaType::typeName(userType());
       
  1987     }
       
  1988 
       
  1989     if (!isValid()) {
       
  1990         s << QString();
       
  1991         return;
       
  1992     }
       
  1993 
       
  1994     if (!QMetaType::save(s, d.type, constData())) {
       
  1995         Q_ASSERT_X(false, "QVariant::save", "Invalid type to save");
       
  1996         qWarning("QVariant::save: unable to save type %d.", d.type);
       
  1997     }
       
  1998 }
       
  1999 
       
  2000 /*!
       
  2001     \since 4.4
       
  2002 
       
  2003     Reads a variant \a p from the stream \a s.
       
  2004 
       
  2005     \sa \link datastreamformat.html Format of the QDataStream
       
  2006     operators \endlink
       
  2007 */
       
  2008 QDataStream& operator>>(QDataStream &s, QVariant &p)
       
  2009 {
       
  2010     p.load(s);
       
  2011     return s;
       
  2012 }
       
  2013 
       
  2014 /*!
       
  2015     Writes a variant \a p to the stream \a s.
       
  2016 
       
  2017     \sa \link datastreamformat.html Format of the QDataStream
       
  2018     operators \endlink
       
  2019 */
       
  2020 QDataStream& operator<<(QDataStream &s, const QVariant &p)
       
  2021 {
       
  2022     p.save(s);
       
  2023     return s;
       
  2024 }
       
  2025 
       
  2026 /*!
       
  2027     Reads a variant type \a p in enum representation from the stream \a s.
       
  2028 */
       
  2029 QDataStream& operator>>(QDataStream &s, QVariant::Type &p)
       
  2030 {
       
  2031     quint32 u;
       
  2032     s >> u;
       
  2033     p = (QVariant::Type)u;
       
  2034 
       
  2035     return s;
       
  2036 }
       
  2037 
       
  2038 /*!
       
  2039     Writes a variant type \a p to the stream \a s.
       
  2040 */
       
  2041 QDataStream& operator<<(QDataStream &s, const QVariant::Type p)
       
  2042 {
       
  2043     s << static_cast<quint32>(p);
       
  2044 
       
  2045     return s;
       
  2046 }
       
  2047 
       
  2048 #endif //QT_NO_DATASTREAM
       
  2049 
       
  2050 /*!
       
  2051     \fn bool QVariant::isValid() const
       
  2052 
       
  2053     Returns true if the storage type of this variant is not
       
  2054     QVariant::Invalid; otherwise returns false.
       
  2055 */
       
  2056 
       
  2057 template <typename T>
       
  2058 inline T qVariantToHelper(const QVariant::Private &d, QVariant::Type t,
       
  2059                           const QVariant::Handler *handler, T * = 0)
       
  2060 {
       
  2061     if (d.type == t)
       
  2062         return *v_cast<T>(&d);
       
  2063 
       
  2064     T ret;
       
  2065     handler->convert(&d, t, &ret, 0);
       
  2066     return ret;
       
  2067 }
       
  2068 
       
  2069 /*!
       
  2070     \fn QStringList QVariant::toStringList() const
       
  2071 
       
  2072     Returns the variant as a QStringList if the variant has type()
       
  2073     StringList, \l String, or \l List of a type that can be converted
       
  2074     to QString; otherwise returns an empty list.
       
  2075 
       
  2076     \sa canConvert(), convert()
       
  2077 */
       
  2078 QStringList QVariant::toStringList() const
       
  2079 {
       
  2080     return qVariantToHelper<QStringList>(d, StringList, handler);
       
  2081 }
       
  2082 
       
  2083 /*!
       
  2084     Returns the variant as a QString if the variant has type() \l
       
  2085     String, \l Bool, \l ByteArray, \l Char, \l Date, \l DateTime, \l
       
  2086     Double, \l Int, \l LongLong, \l StringList, \l Time, \l UInt, or
       
  2087     \l ULongLong; otherwise returns an empty string.
       
  2088 
       
  2089     \sa canConvert(), convert()
       
  2090 */
       
  2091 QString QVariant::toString() const
       
  2092 {
       
  2093     return qVariantToHelper<QString>(d, String, handler);
       
  2094 }
       
  2095 
       
  2096 /*!
       
  2097     Returns the variant as a QMap<QString, QVariant> if the variant
       
  2098     has type() \l Map; otherwise returns an empty map.
       
  2099 
       
  2100     \sa canConvert(), convert()
       
  2101 */
       
  2102 QVariantMap QVariant::toMap() const
       
  2103 {
       
  2104     return qVariantToHelper<QVariantMap>(d, Map, handler);
       
  2105 }
       
  2106 
       
  2107 /*!
       
  2108     Returns the variant as a QHash<QString, QVariant> if the variant
       
  2109     has type() \l Hash; otherwise returns an empty map.
       
  2110 
       
  2111     \sa canConvert(), convert()
       
  2112 */
       
  2113 QVariantHash QVariant::toHash() const
       
  2114 {
       
  2115     return qVariantToHelper<QVariantHash>(d, Hash, handler);
       
  2116 }
       
  2117 
       
  2118 /*!
       
  2119     \fn QDate QVariant::toDate() const
       
  2120 
       
  2121     Returns the variant as a QDate if the variant has type() \l Date,
       
  2122     \l DateTime, or \l String; otherwise returns an invalid date.
       
  2123 
       
  2124     If the type() is \l String, an invalid date will be returned if the
       
  2125     string cannot be parsed as a Qt::ISODate format date.
       
  2126 
       
  2127     \sa canConvert(), convert()
       
  2128 */
       
  2129 QDate QVariant::toDate() const
       
  2130 {
       
  2131     return qVariantToHelper<QDate>(d, Date, handler);
       
  2132 }
       
  2133 
       
  2134 /*!
       
  2135     \fn QTime QVariant::toTime() const
       
  2136 
       
  2137     Returns the variant as a QTime if the variant has type() \l Time,
       
  2138     \l DateTime, or \l String; otherwise returns an invalid time.
       
  2139 
       
  2140     If the type() is \l String, an invalid time will be returned if
       
  2141     the string cannot be parsed as a Qt::ISODate format time.
       
  2142 
       
  2143     \sa canConvert(), convert()
       
  2144 */
       
  2145 QTime QVariant::toTime() const
       
  2146 {
       
  2147     return qVariantToHelper<QTime>(d, Time, handler);
       
  2148 }
       
  2149 
       
  2150 /*!
       
  2151     \fn QDateTime QVariant::toDateTime() const
       
  2152 
       
  2153     Returns the variant as a QDateTime if the variant has type() \l
       
  2154     DateTime, \l Date, or \l String; otherwise returns an invalid
       
  2155     date/time.
       
  2156 
       
  2157     If the type() is \l String, an invalid date/time will be returned
       
  2158     if the string cannot be parsed as a Qt::ISODate format date/time.
       
  2159 
       
  2160     \sa canConvert(), convert()
       
  2161 */
       
  2162 QDateTime QVariant::toDateTime() const
       
  2163 {
       
  2164     return qVariantToHelper<QDateTime>(d, DateTime, handler);
       
  2165 }
       
  2166 
       
  2167 /*!
       
  2168     \fn QByteArray QVariant::toByteArray() const
       
  2169 
       
  2170     Returns the variant as a QByteArray if the variant has type() \l
       
  2171     ByteArray or \l String (converted using QString::fromAscii());
       
  2172     otherwise returns an empty byte array.
       
  2173 
       
  2174     \sa canConvert(), convert()
       
  2175 */
       
  2176 QByteArray QVariant::toByteArray() const
       
  2177 {
       
  2178     return qVariantToHelper<QByteArray>(d, ByteArray, handler);
       
  2179 }
       
  2180 
       
  2181 #ifndef QT_NO_GEOM_VARIANT
       
  2182 /*!
       
  2183     \fn QPoint QVariant::toPoint() const
       
  2184 
       
  2185     Returns the variant as a QPoint if the variant has type()
       
  2186     \l Point or \l PointF; otherwise returns a null QPoint.
       
  2187 
       
  2188     \sa canConvert(), convert()
       
  2189 */
       
  2190 QPoint QVariant::toPoint() const
       
  2191 {
       
  2192     return qVariantToHelper<QPoint>(d, Point, handler);
       
  2193 }
       
  2194 
       
  2195 /*!
       
  2196     \fn QRect QVariant::toRect() const
       
  2197 
       
  2198     Returns the variant as a QRect if the variant has type() \l Rect;
       
  2199     otherwise returns an invalid QRect.
       
  2200 
       
  2201     \sa canConvert(), convert()
       
  2202 */
       
  2203 QRect QVariant::toRect() const
       
  2204 {
       
  2205     return qVariantToHelper<QRect>(d, Rect, handler);
       
  2206 }
       
  2207 
       
  2208 /*!
       
  2209     \fn QSize QVariant::toSize() const
       
  2210 
       
  2211     Returns the variant as a QSize if the variant has type() \l Size;
       
  2212     otherwise returns an invalid QSize.
       
  2213 
       
  2214     \sa canConvert(), convert()
       
  2215 */
       
  2216 QSize QVariant::toSize() const
       
  2217 {
       
  2218     return qVariantToHelper<QSize>(d, Size, handler);
       
  2219 }
       
  2220 
       
  2221 /*!
       
  2222     \fn QSizeF QVariant::toSizeF() const
       
  2223 
       
  2224     Returns the variant as a QSizeF if the variant has type() \l
       
  2225     SizeF; otherwise returns an invalid QSizeF.
       
  2226 
       
  2227     \sa canConvert(), convert()
       
  2228 */
       
  2229 QSizeF QVariant::toSizeF() const
       
  2230 {
       
  2231     return qVariantToHelper<QSizeF>(d, SizeF, handler);
       
  2232 }
       
  2233 
       
  2234 /*!
       
  2235     \fn QRectF QVariant::toRectF() const
       
  2236 
       
  2237     Returns the variant as a QRectF if the variant has type() \l Rect
       
  2238     or \l RectF; otherwise returns an invalid QRectF.
       
  2239 
       
  2240     \sa canConvert(), convert()
       
  2241 */
       
  2242 QRectF QVariant::toRectF() const
       
  2243 {
       
  2244     return qVariantToHelper<QRectF>(d, RectF, handler);
       
  2245 }
       
  2246 
       
  2247 /*!
       
  2248     \fn QLineF QVariant::toLineF() const
       
  2249 
       
  2250     Returns the variant as a QLineF if the variant has type() \l
       
  2251     LineF; otherwise returns an invalid QLineF.
       
  2252 
       
  2253     \sa canConvert(), convert()
       
  2254 */
       
  2255 QLineF QVariant::toLineF() const
       
  2256 {
       
  2257     return qVariantToHelper<QLineF>(d, LineF, handler);
       
  2258 }
       
  2259 
       
  2260 /*!
       
  2261     \fn QLine QVariant::toLine() const
       
  2262 
       
  2263     Returns the variant as a QLine if the variant has type() \l Line;
       
  2264     otherwise returns an invalid QLine.
       
  2265 
       
  2266     \sa canConvert(), convert()
       
  2267 */
       
  2268 QLine QVariant::toLine() const
       
  2269 {
       
  2270     return qVariantToHelper<QLine>(d, Line, handler);
       
  2271 }
       
  2272 
       
  2273 /*!
       
  2274     \fn QPointF QVariant::toPointF() const
       
  2275 
       
  2276     Returns the variant as a QPointF if the variant has type() \l
       
  2277     Point or \l PointF; otherwise returns a null QPointF.
       
  2278 
       
  2279     \sa canConvert(), convert()
       
  2280 */
       
  2281 QPointF QVariant::toPointF() const
       
  2282 {
       
  2283     return qVariantToHelper<QPointF>(d, PointF, handler);
       
  2284 }
       
  2285 
       
  2286 #endif // QT_NO_GEOM_VARIANT
       
  2287 
       
  2288 /*!
       
  2289     \fn QUrl QVariant::toUrl() const
       
  2290 
       
  2291     Returns the variant as a QUrl if the variant has type()
       
  2292     \l Url; otherwise returns an invalid QUrl.
       
  2293 
       
  2294     \sa canConvert(), convert()
       
  2295 */
       
  2296 QUrl QVariant::toUrl() const
       
  2297 {
       
  2298     return qVariantToHelper<QUrl>(d, Url, handler);
       
  2299 }
       
  2300 
       
  2301 /*!
       
  2302     \fn QLocale QVariant::toLocale() const
       
  2303 
       
  2304     Returns the variant as a QLocale if the variant has type()
       
  2305     \l Locale; otherwise returns an invalid QLocale.
       
  2306 
       
  2307     \sa canConvert(), convert()
       
  2308 */
       
  2309 QLocale QVariant::toLocale() const
       
  2310 {
       
  2311     return qVariantToHelper<QLocale>(d, Locale, handler);
       
  2312 }
       
  2313 
       
  2314 /*!
       
  2315     \fn QRegExp QVariant::toRegExp() const
       
  2316     \since 4.1
       
  2317 
       
  2318     Returns the variant as a QRegExp if the variant has type() \l
       
  2319     RegExp; otherwise returns an empty QRegExp.
       
  2320 
       
  2321     \sa canConvert(), convert()
       
  2322 */
       
  2323 #ifndef QT_NO_REGEXP
       
  2324 QRegExp QVariant::toRegExp() const
       
  2325 {
       
  2326     return qVariantToHelper<QRegExp>(d, RegExp, handler);
       
  2327 }
       
  2328 #endif
       
  2329 
       
  2330 /*!
       
  2331     \fn QChar QVariant::toChar() const
       
  2332 
       
  2333     Returns the variant as a QChar if the variant has type() \l Char,
       
  2334     \l Int, or \l UInt; otherwise returns an invalid QChar.
       
  2335 
       
  2336     \sa canConvert(), convert()
       
  2337 */
       
  2338 QChar QVariant::toChar() const
       
  2339 {
       
  2340     return qVariantToHelper<QChar>(d, Char, handler);
       
  2341 }
       
  2342 
       
  2343 /*!
       
  2344     Returns the variant as a QBitArray if the variant has type()
       
  2345     \l BitArray; otherwise returns an empty bit array.
       
  2346 
       
  2347     \sa canConvert(), convert()
       
  2348 */
       
  2349 QBitArray QVariant::toBitArray() const
       
  2350 {
       
  2351     return qVariantToHelper<QBitArray>(d, BitArray, handler);
       
  2352 }
       
  2353 
       
  2354 template <typename T>
       
  2355 inline T qNumVariantToHelper(const QVariant::Private &d,
       
  2356                              const QVariant::Handler *handler, bool *ok, const T& val)
       
  2357 {
       
  2358     uint t = qMetaTypeId<T>();
       
  2359     if (ok)
       
  2360         *ok = true;
       
  2361     if (d.type == t)
       
  2362         return val;
       
  2363 
       
  2364     T ret;
       
  2365     if (!handler->convert(&d, QVariant::Type(t), &ret, ok) && ok)
       
  2366         *ok = false;
       
  2367     return ret;
       
  2368 }
       
  2369 
       
  2370 /*!
       
  2371     Returns the variant as an int if the variant has type() \l Int,
       
  2372     \l Bool, \l ByteArray, \l Char, \l Double, \l LongLong, \l
       
  2373     String, \l UInt, or \l ULongLong; otherwise returns 0.
       
  2374 
       
  2375     If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
       
  2376     converted to an int; otherwise \c{*}\a{ok} is set to false.
       
  2377 
       
  2378     \bold{Warning:} If the value is convertible to a \l LongLong but is too
       
  2379     large to be represented in an int, the resulting arithmetic overflow will
       
  2380     not be reflected in \a ok. A simple workaround is to use QString::toInt().
       
  2381     Fixing this bug has been postponed to Qt 5 in order to avoid breaking existing code.
       
  2382 
       
  2383     \sa canConvert(), convert()
       
  2384 */
       
  2385 int QVariant::toInt(bool *ok) const
       
  2386 {
       
  2387     return qNumVariantToHelper<int>(d, handler, ok, d.data.i);
       
  2388 }
       
  2389 
       
  2390 /*!
       
  2391     Returns the variant as an unsigned int if the variant has type()
       
  2392     \l UInt,  \l Bool, \l ByteArray, \l Char, \l Double, \l Int, \l
       
  2393     LongLong, \l String, or \l ULongLong; otherwise returns 0.
       
  2394 
       
  2395     If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
       
  2396     converted to an unsigned int; otherwise \c{*}\a{ok} is set to false.
       
  2397 
       
  2398     \bold{Warning:} If the value is convertible to a \l ULongLong but is too
       
  2399     large to be represented in an unsigned int, the resulting arithmetic overflow will
       
  2400     not be reflected in \a ok. A simple workaround is to use QString::toUInt().
       
  2401     Fixing this bug has been postponed to Qt 5 in order to avoid breaking existing code.
       
  2402 
       
  2403     \sa canConvert(), convert()
       
  2404 */
       
  2405 uint QVariant::toUInt(bool *ok) const
       
  2406 {
       
  2407     return qNumVariantToHelper<uint>(d, handler, ok, d.data.u);
       
  2408 }
       
  2409 
       
  2410 /*!
       
  2411     Returns the variant as a long long int if the variant has type()
       
  2412     \l LongLong, \l Bool, \l ByteArray, \l Char, \l Double, \l Int,
       
  2413     \l String, \l UInt, or \l ULongLong; otherwise returns 0.
       
  2414 
       
  2415     If \a ok is non-null: \c{*}\c{ok} is set to true if the value could be
       
  2416     converted to an int; otherwise \c{*}\c{ok} is set to false.
       
  2417 
       
  2418     \sa canConvert(), convert()
       
  2419 */
       
  2420 qlonglong QVariant::toLongLong(bool *ok) const
       
  2421 {
       
  2422     return qNumVariantToHelper<qlonglong>(d, handler, ok, d.data.ll);
       
  2423 }
       
  2424 
       
  2425 /*!
       
  2426     Returns the variant as as an unsigned long long int if the
       
  2427     variant has type() \l ULongLong, \l Bool, \l ByteArray, \l Char,
       
  2428     \l Double, \l Int, \l LongLong, \l String, or \l UInt; otherwise
       
  2429     returns 0.
       
  2430 
       
  2431     If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
       
  2432     converted to an int; otherwise \c{*}\a{ok} is set to false.
       
  2433 
       
  2434     \sa canConvert(), convert()
       
  2435 */
       
  2436 qulonglong QVariant::toULongLong(bool *ok) const
       
  2437 {
       
  2438     return qNumVariantToHelper<qulonglong>(d, handler, ok, d.data.ull);
       
  2439 }
       
  2440 
       
  2441 /*!
       
  2442     Returns the variant as a bool if the variant has type() Bool.
       
  2443 
       
  2444     Returns true if the variant has type() \l Bool, \l Char, \l Double,
       
  2445     \l Int, \l LongLong, \l UInt, or \l ULongLong and the value is
       
  2446     non-zero, or if the variant has type \l String or \l ByteArray and
       
  2447     its lower-case content is not empty, "0" or "false"; otherwise
       
  2448     returns false.
       
  2449 
       
  2450     \sa canConvert(), convert()
       
  2451 */
       
  2452 bool QVariant::toBool() const
       
  2453 {
       
  2454     if (d.type == Bool)
       
  2455         return d.data.b;
       
  2456 
       
  2457     bool res = false;
       
  2458     handler->convert(&d, Bool, &res, 0);
       
  2459 
       
  2460     return res;
       
  2461 }
       
  2462 
       
  2463 /*!
       
  2464     Returns the variant as a double if the variant has type() \l
       
  2465     Double, \l QMetaType::Float, \l Bool, \l ByteArray, \l Int, \l LongLong, \l String, \l
       
  2466     UInt, or \l ULongLong; otherwise returns 0.0.
       
  2467 
       
  2468     If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
       
  2469     converted to a double; otherwise \c{*}\a{ok} is set to false.
       
  2470 
       
  2471     \sa canConvert(), convert()
       
  2472 */
       
  2473 double QVariant::toDouble(bool *ok) const
       
  2474 {
       
  2475     return qNumVariantToHelper<double>(d, handler, ok, d.data.d);
       
  2476 }
       
  2477 
       
  2478 /*!
       
  2479     Returns the variant as a float if the variant has type() \l
       
  2480     Double, \l QMetaType::Float, \l Bool, \l ByteArray, \l Int, \l LongLong, \l String, \l
       
  2481     UInt, or \l ULongLong; otherwise returns 0.0.
       
  2482 
       
  2483     \since 4.6
       
  2484 
       
  2485     If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
       
  2486     converted to a double; otherwise \c{*}\a{ok} is set to false.
       
  2487 
       
  2488     \sa canConvert(), convert()
       
  2489 */
       
  2490 float QVariant::toFloat(bool *ok) const
       
  2491 {
       
  2492     return qNumVariantToHelper<float>(d, handler, ok, d.data.f);
       
  2493 }
       
  2494 
       
  2495 /*!
       
  2496     Returns the variant as a qreal if the variant has type() \l
       
  2497     Double, \l QMetaType::Float, \l Bool, \l ByteArray, \l Int, \l LongLong, \l String, \l
       
  2498     UInt, or \l ULongLong; otherwise returns 0.0.
       
  2499 
       
  2500     \since 4.6
       
  2501 
       
  2502     If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be
       
  2503     converted to a double; otherwise \c{*}\a{ok} is set to false.
       
  2504 
       
  2505     \sa canConvert(), convert()
       
  2506 */
       
  2507 qreal QVariant::toReal(bool *ok) const
       
  2508 {
       
  2509     return qNumVariantToHelper<qreal>(d, handler, ok, d.data.real);
       
  2510 }
       
  2511 
       
  2512 /*!
       
  2513     Returns the variant as a QVariantList if the variant has type()
       
  2514     \l List or \l StringList; otherwise returns an empty list.
       
  2515 
       
  2516     \sa canConvert(), convert()
       
  2517 */
       
  2518 QVariantList QVariant::toList() const
       
  2519 {
       
  2520     return qVariantToHelper<QVariantList>(d, List, handler);
       
  2521 }
       
  2522 
       
  2523 /*! \fn QVariant::canCast(Type t) const
       
  2524     Use canConvert() instead.
       
  2525 */
       
  2526 
       
  2527 /*! \fn QVariant::cast(Type t)
       
  2528     Use convert() instead.
       
  2529 */
       
  2530 
       
  2531 
       
  2532 static const quint32 qCanConvertMatrix[QVariant::LastCoreType + 1] =
       
  2533 {
       
  2534 /*Invalid*/     0,
       
  2535 
       
  2536 /*Bool*/          1 << QVariant::Double     | 1 << QVariant::Int        | 1 << QVariant::UInt
       
  2537                 | 1 << QVariant::LongLong   | 1 << QVariant::ULongLong  | 1 << QVariant::ByteArray
       
  2538                 | 1 << QVariant::String     | 1 << QVariant::Char,
       
  2539 
       
  2540 /*Int*/           1 << QVariant::UInt       | 1 << QVariant::String     | 1 << QVariant::Double
       
  2541                 | 1 << QVariant::Bool       | 1 << QVariant::LongLong   | 1 << QVariant::ULongLong
       
  2542                 | 1 << QVariant::Char       | 1 << QVariant::ByteArray,
       
  2543 
       
  2544 /*UInt*/          1 << QVariant::Int        | 1 << QVariant::String     | 1 << QVariant::Double
       
  2545                 | 1 << QVariant::Bool       | 1 << QVariant::LongLong   | 1 << QVariant::ULongLong
       
  2546                 | 1 << QVariant::Char       | 1 << QVariant::ByteArray,
       
  2547 
       
  2548 /*LLong*/         1 << QVariant::Int        | 1 << QVariant::String     | 1 << QVariant::Double
       
  2549                 | 1 << QVariant::Bool       | 1 << QVariant::UInt       | 1 << QVariant::ULongLong
       
  2550                 | 1 << QVariant::Char       | 1 << QVariant::ByteArray,
       
  2551 
       
  2552 /*ULlong*/        1 << QVariant::Int        | 1 << QVariant::String     | 1 << QVariant::Double
       
  2553                 | 1 << QVariant::Bool       | 1 << QVariant::UInt       | 1 << QVariant::LongLong
       
  2554                 | 1 << QVariant::Char       | 1 << QVariant::ByteArray,
       
  2555 
       
  2556 /*double*/        1 << QVariant::Int        | 1 << QVariant::String     | 1 << QVariant::ULongLong
       
  2557                 | 1 << QVariant::Bool       | 1 << QVariant::UInt       | 1 << QVariant::LongLong
       
  2558                 | 1 << QVariant::ByteArray,
       
  2559 
       
  2560 /*QChar*/         1 << QVariant::Int        | 1 << QVariant::UInt       | 1 << QVariant::LongLong
       
  2561                 | 1 << QVariant::ULongLong,
       
  2562 
       
  2563 /*QMap*/          0,
       
  2564 
       
  2565 /*QList*/         1 << QVariant::StringList,
       
  2566 
       
  2567 /*QString*/       1 << QVariant::StringList | 1 << QVariant::ByteArray  | 1 << QVariant::Int
       
  2568                 | 1 << QVariant::UInt       | 1 << QVariant::Bool       | 1 << QVariant::Double
       
  2569                 | 1 << QVariant::Date       | 1 << QVariant::Time       | 1 << QVariant::DateTime
       
  2570                 | 1 << QVariant::LongLong   | 1 << QVariant::ULongLong  | 1 << QVariant::Char
       
  2571                 | 1 << QVariant::Url,
       
  2572 
       
  2573 /*QStringList*/   1 << QVariant::List       | 1 << QVariant::String,
       
  2574 
       
  2575 /*QByteArray*/    1 << QVariant::String     | 1 << QVariant::Int        | 1 << QVariant::UInt | 1 << QVariant::Bool
       
  2576                 | 1 << QVariant::Double     | 1 << QVariant::LongLong   | 1 << QVariant::ULongLong,
       
  2577 
       
  2578 /*QBitArray*/     0,
       
  2579 
       
  2580 /*QDate*/         1 << QVariant::String     | 1 << QVariant::DateTime,
       
  2581 
       
  2582 /*QTime*/         1 << QVariant::String     | 1 << QVariant::DateTime,
       
  2583 
       
  2584 /*QDateTime*/     1 << QVariant::String     | 1 << QVariant::Date,
       
  2585 
       
  2586 /*QUrl*/          1 << QVariant::String,
       
  2587 
       
  2588 /*QLocale*/       0,
       
  2589 
       
  2590 /*QRect*/         1 << QVariant::RectF,
       
  2591 
       
  2592 /*QRectF*/        1 << QVariant::Rect,
       
  2593 
       
  2594 /*QSize*/         1 << QVariant::SizeF,
       
  2595 
       
  2596 /*QSizeF*/        1 << QVariant::Size,
       
  2597 
       
  2598 /*QLine*/         1 << QVariant::LineF,
       
  2599 
       
  2600 /*QLineF*/        1 << QVariant::Line,
       
  2601 
       
  2602 /*QPoint*/        1 << QVariant::PointF,
       
  2603 
       
  2604 /*QPointF*/       1 << QVariant::Point,
       
  2605 
       
  2606 /*QRegExp*/       0,
       
  2607 
       
  2608 /*QHash*/         0
       
  2609 
       
  2610 };
       
  2611 
       
  2612 /*!
       
  2613     Returns true if the variant's type can be cast to the requested
       
  2614     type, \a t. Such casting is done automatically when calling the
       
  2615     toInt(), toBool(), ... methods.
       
  2616 
       
  2617     The following casts are done automatically:
       
  2618 
       
  2619     \table
       
  2620     \header \o Type \o Automatically Cast To
       
  2621     \row \o \l Bool \o \l Char, \l Double, \l Int, \l LongLong, \l String, \l UInt, \l ULongLong
       
  2622     \row \o \l ByteArray \o \l Double, \l Int, \l LongLong, \l String, \l UInt, \l ULongLong
       
  2623     \row \o \l Char \o \l Bool, \l Int, \l UInt, \l LongLong, \l ULongLong
       
  2624     \row \o \l Color \o \l String
       
  2625     \row \o \l Date \o \l DateTime, \l String
       
  2626     \row \o \l DateTime \o \l Date, \l String, \l Time
       
  2627     \row \o \l Double \o \l Bool, \l Int, \l LongLong, \l String, \l UInt, \l ULongLong
       
  2628     \row \o \l Font \o \l String
       
  2629     \row \o \l Int \o \l Bool, \l Char, \l Double, \l LongLong, \l String, \l UInt, \l ULongLong
       
  2630     \row \o \l KeySequence \o \l Int, \l String
       
  2631     \row \o \l List \o \l StringList (if the list's items can be converted to strings)
       
  2632     \row \o \l LongLong \o \l Bool, \l ByteArray, \l Char, \l Double, \l Int, \l String, \l UInt, \l ULongLong
       
  2633     \row \o \l Point \o PointF
       
  2634     \row \o \l Rect \o RectF
       
  2635     \row \o \l String \o \l Bool, \l ByteArray, \l Char, \l Color, \l Date, \l DateTime, \l Double,
       
  2636                          \l Font, \l Int, \l KeySequence, \l LongLong, \l StringList, \l Time, \l UInt,
       
  2637                          \l ULongLong
       
  2638     \row \o \l StringList \o \l List, \l String (if the list contains exactly one item)
       
  2639     \row \o \l Time \o \l String
       
  2640     \row \o \l UInt \o \l Bool, \l Char, \l Double, \l Int, \l LongLong, \l String, \l ULongLong
       
  2641     \row \o \l ULongLong \o \l Bool, \l Char, \l Double, \l Int, \l LongLong, \l String, \l UInt
       
  2642     \endtable
       
  2643 
       
  2644     \sa convert()
       
  2645 */
       
  2646 bool QVariant::canConvert(Type t) const
       
  2647 {
       
  2648     //we can treat floats as double
       
  2649     //the reason for not doing it the "proper" way is that QMetaType::Float's value is 135,
       
  2650     //which can't be handled by qCanConvertMatrix
       
  2651     //In addition QVariant::Type doesn't have a Float value, so we're using QMetaType::Float
       
  2652     const uint currentType = ((d.type == QMetaType::Float) ? QVariant::Double : d.type);
       
  2653     if (uint(t) == uint(QMetaType::Float)) t = QVariant::Double;
       
  2654 
       
  2655     if (currentType == uint(t))
       
  2656         return true;
       
  2657 
       
  2658     if (currentType > QVariant::LastCoreType || t > QVariant::LastCoreType) {
       
  2659         switch (uint(t)) {
       
  2660         case QVariant::Int:
       
  2661             return currentType == QVariant::KeySequence
       
  2662                    || currentType == QMetaType::ULong
       
  2663                    || currentType == QMetaType::Long
       
  2664                    || currentType == QMetaType::UShort
       
  2665                    || currentType == QMetaType::UChar
       
  2666                    || currentType == QMetaType::Char
       
  2667                    || currentType == QMetaType::Short;
       
  2668         case QVariant::Image:
       
  2669             return currentType == QVariant::Pixmap || currentType == QVariant::Bitmap;
       
  2670         case QVariant::Pixmap:
       
  2671             return currentType == QVariant::Image || currentType == QVariant::Bitmap
       
  2672                               || currentType == QVariant::Brush;
       
  2673         case QVariant::Bitmap:
       
  2674             return currentType == QVariant::Pixmap || currentType == QVariant::Image;
       
  2675         case QVariant::ByteArray:
       
  2676             return currentType == QVariant::Color;
       
  2677         case QVariant::String:
       
  2678             return currentType == QVariant::KeySequence || currentType == QVariant::Font
       
  2679                               || currentType == QVariant::Color;
       
  2680         case QVariant::KeySequence:
       
  2681             return currentType == QVariant::String || currentType == QVariant::Int;
       
  2682         case QVariant::Font:
       
  2683             return currentType == QVariant::String;
       
  2684         case QVariant::Color:
       
  2685             return currentType == QVariant::String || currentType == QVariant::ByteArray
       
  2686                               || currentType == QVariant::Brush;
       
  2687         case QVariant::Brush:
       
  2688             return currentType == QVariant::Color || currentType == QVariant::Pixmap;
       
  2689         case QMetaType::Long:
       
  2690         case QMetaType::Char:
       
  2691         case QMetaType::UChar:
       
  2692         case QMetaType::ULong:
       
  2693         case QMetaType::Short:
       
  2694         case QMetaType::UShort:
       
  2695             return qCanConvertMatrix[QVariant::Int] & (1 << currentType) || currentType == QVariant::Int;
       
  2696         default:
       
  2697             return false;
       
  2698         }
       
  2699     }
       
  2700 
       
  2701     if(t == String && currentType == StringList)
       
  2702         return v_cast<QStringList>(&d)->count() == 1;
       
  2703     else
       
  2704         return qCanConvertMatrix[t] & (1 << currentType);
       
  2705 }
       
  2706 
       
  2707 /*!
       
  2708     Casts the variant to the requested type, \a t. If the cast cannot be
       
  2709     done, the variant is cleared. Returns true if the current type of
       
  2710     the variant was successfully cast; otherwise returns false.
       
  2711 
       
  2712     \warning For historical reasons, converting a null QVariant results
       
  2713     in a null value of the desired type (e.g., an empty string for
       
  2714     QString) and a result of false.
       
  2715 
       
  2716     \sa canConvert(), clear()
       
  2717 */
       
  2718 
       
  2719 bool QVariant::convert(Type t)
       
  2720 {
       
  2721     if (d.type == uint(t))
       
  2722         return true;
       
  2723 
       
  2724     QVariant oldValue = *this;
       
  2725 
       
  2726     clear();
       
  2727     if (!oldValue.canConvert(t))
       
  2728         return false;
       
  2729 
       
  2730     create(t, 0);
       
  2731     if (oldValue.isNull())
       
  2732         return false;
       
  2733 
       
  2734     bool isOk = true;
       
  2735     if (!handler->convert(&oldValue.d, t, data(), &isOk))
       
  2736         isOk = false;
       
  2737     d.is_null = !isOk;
       
  2738     return isOk;
       
  2739 }
       
  2740 
       
  2741 /*!
       
  2742     \fn bool operator==(const QVariant &v1, const QVariant &v2)
       
  2743 
       
  2744     \relates QVariant
       
  2745 
       
  2746     Returns true if \a v1 and \a v2 are equal; otherwise returns false.
       
  2747 
       
  2748     \warning This function doesn't support custom types registered
       
  2749     with qRegisterMetaType().
       
  2750 */
       
  2751 /*!
       
  2752     \fn bool operator!=(const QVariant &v1, const QVariant &v2)
       
  2753 
       
  2754     \relates QVariant
       
  2755 
       
  2756     Returns false if \a v1 and \a v2 are equal; otherwise returns true.
       
  2757 
       
  2758     \warning This function doesn't support custom types registered
       
  2759     with qRegisterMetaType().
       
  2760 */
       
  2761 
       
  2762 /*! \fn bool QVariant::operator==(const QVariant &v) const
       
  2763 
       
  2764     Compares this QVariant with \a v and returns true if they are
       
  2765     equal; otherwise returns false.
       
  2766 
       
  2767     In the case of custom types, their equalness operators are not called.
       
  2768     Instead the values' addresses are compared.
       
  2769 */
       
  2770 
       
  2771 /*!
       
  2772     \fn bool QVariant::operator!=(const QVariant &v) const
       
  2773 
       
  2774     Compares this QVariant with \a v and returns true if they are not
       
  2775     equal; otherwise returns false.
       
  2776 
       
  2777     \warning This function doesn't support custom types registered
       
  2778     with qRegisterMetaType().
       
  2779 */
       
  2780 
       
  2781 static bool qIsNumericType(uint tp)
       
  2782 {
       
  2783     return (tp >= QVariant::Bool && tp <= QVariant::Double)
       
  2784            || (tp >= QMetaType::Long && tp <= QMetaType::Float);
       
  2785 }
       
  2786 
       
  2787 static bool qIsFloatingPoint(uint tp)
       
  2788 {
       
  2789     return tp == QVariant::Double || tp == QMetaType::Float;
       
  2790 }
       
  2791 
       
  2792 /*! \internal
       
  2793  */
       
  2794 bool QVariant::cmp(const QVariant &v) const
       
  2795 {
       
  2796     QVariant v2 = v;
       
  2797     if (d.type != v2.d.type) {
       
  2798         if (qIsNumericType(d.type) && qIsNumericType(v.d.type)) {
       
  2799             if (qIsFloatingPoint(d.type) || qIsFloatingPoint(v.d.type))
       
  2800                 return qFuzzyCompare(toReal(), v.toReal());
       
  2801             else
       
  2802                 return toLongLong() == v.toLongLong();
       
  2803         }
       
  2804         if (!v2.canConvert(Type(d.type)) || !v2.convert(Type(d.type)))
       
  2805             return false;
       
  2806     }
       
  2807     return handler->compare(&d, &v2.d);
       
  2808 }
       
  2809 
       
  2810 /*! \internal
       
  2811  */
       
  2812 
       
  2813 const void *QVariant::constData() const
       
  2814 {
       
  2815     return d.is_shared ? d.data.shared->ptr : reinterpret_cast<const void *>(&d.data.ptr);
       
  2816 }
       
  2817 
       
  2818 /*!
       
  2819     \fn const void* QVariant::data() const
       
  2820 
       
  2821     \internal
       
  2822 */
       
  2823 
       
  2824 /*! \internal */
       
  2825 void* QVariant::data()
       
  2826 {
       
  2827     detach();
       
  2828     return const_cast<void *>(constData());
       
  2829 }
       
  2830 
       
  2831 
       
  2832 #ifdef QT3_SUPPORT
       
  2833 /*! \internal
       
  2834  */
       
  2835 void *QVariant::castOrDetach(Type t)
       
  2836 {
       
  2837     if (d.type != uint(t)) {
       
  2838         if (!convert(t))
       
  2839             create(t, 0);
       
  2840     } else {
       
  2841         detach();
       
  2842     }
       
  2843     return data();
       
  2844 }
       
  2845 #endif
       
  2846 
       
  2847 /*!
       
  2848   Returns true if this is a NULL variant, false otherwise.
       
  2849 */
       
  2850 bool QVariant::isNull() const
       
  2851 {
       
  2852     return handler->isNull(&d);
       
  2853 }
       
  2854 
       
  2855 #ifndef QT_NO_DEBUG_STREAM
       
  2856 QDebug operator<<(QDebug dbg, const QVariant &v)
       
  2857 {
       
  2858 #ifndef Q_BROKEN_DEBUG_STREAM
       
  2859     dbg.nospace() << "QVariant(" << v.typeName() << ", ";
       
  2860     QVariant::handler->debugStream(dbg, v);
       
  2861     dbg.nospace() << ')';
       
  2862     return dbg.space();
       
  2863 #else
       
  2864     qWarning("This compiler doesn't support streaming QVariant to QDebug");
       
  2865     return dbg;
       
  2866     Q_UNUSED(v);
       
  2867 #endif
       
  2868 }
       
  2869 
       
  2870 QDebug operator<<(QDebug dbg, const QVariant::Type p)
       
  2871 {
       
  2872 #ifndef Q_BROKEN_DEBUG_STREAM
       
  2873     dbg.nospace() << "QVariant::" << QVariant::typeToName(p);
       
  2874     return dbg.space();
       
  2875 #else
       
  2876     qWarning("This compiler doesn't support streaming QVariant::Type to QDebug");
       
  2877     return dbg;
       
  2878     Q_UNUSED(p);
       
  2879 #endif
       
  2880 }
       
  2881 #endif
       
  2882 
       
  2883 /*!
       
  2884     \fn int &QVariant::asInt()
       
  2885 
       
  2886     Use toInt() instead.
       
  2887 */
       
  2888 
       
  2889 /*!
       
  2890     \fn uint &QVariant::asUInt()
       
  2891 
       
  2892     Use toUInt() instead.
       
  2893 */
       
  2894 
       
  2895 /*!
       
  2896     \fn qlonglong &QVariant::asLongLong()
       
  2897 
       
  2898     Use toLongLong() instead.
       
  2899 */
       
  2900 
       
  2901 /*!
       
  2902     \fn qulonglong &QVariant::asULongLong()
       
  2903 
       
  2904     Use toULongLong() instead.
       
  2905 */
       
  2906 
       
  2907 /*!
       
  2908     \fn bool &QVariant::asBool()
       
  2909 
       
  2910     Use toBool() instead.
       
  2911 */
       
  2912 
       
  2913 /*!
       
  2914     \fn double &QVariant::asDouble()
       
  2915 
       
  2916     Use toDouble() instead.
       
  2917 */
       
  2918 
       
  2919 /*!
       
  2920     \fn QByteArray &QVariant::asByteArray()
       
  2921 
       
  2922     Use toByteArray() instead.
       
  2923 */
       
  2924 
       
  2925 /*!
       
  2926     \fn QBitArray &QVariant::asBitArray()
       
  2927 
       
  2928     Use toBitArray() instead.
       
  2929 */
       
  2930 
       
  2931 /*!
       
  2932     \fn QString &QVariant::asString()
       
  2933 
       
  2934     Use toString() instead.
       
  2935 */
       
  2936 
       
  2937 /*!
       
  2938     \fn QStringList &QVariant::asStringList()
       
  2939 
       
  2940     Use toStringList() instead.
       
  2941 */
       
  2942 
       
  2943 /*!
       
  2944     \fn QDate &QVariant::asDate()
       
  2945 
       
  2946     Use toDate() instead.
       
  2947 */
       
  2948 
       
  2949 /*!
       
  2950     \fn QTime &QVariant::asTime()
       
  2951 
       
  2952     Use toTime() instead.
       
  2953 */
       
  2954 
       
  2955 /*!
       
  2956     \fn QDateTime &QVariant::asDateTime()
       
  2957 
       
  2958     Use toDateTime() instead.
       
  2959 */
       
  2960 
       
  2961 /*!
       
  2962     \fn QList<QVariant> &QVariant::asList()
       
  2963 
       
  2964     Use toList() instead.
       
  2965 */
       
  2966 
       
  2967 /*!
       
  2968     \fn QMap<QString, QVariant> &QVariant::asMap()
       
  2969 
       
  2970     Use toMap() instead.
       
  2971 */
       
  2972 
       
  2973 /*!
       
  2974     \fn QVariant::QVariant(bool b, int dummy)
       
  2975 
       
  2976     Use the QVariant(bool) constructor instead.
       
  2977 
       
  2978 */
       
  2979 
       
  2980 /*!
       
  2981     \fn const QByteArray QVariant::toCString() const
       
  2982 
       
  2983     Use toByteArray() instead.
       
  2984 */
       
  2985 
       
  2986 /*!
       
  2987     \fn QByteArray &QVariant::asCString()
       
  2988 
       
  2989     Use toByteArray() instead.
       
  2990 */
       
  2991 
       
  2992 /*!
       
  2993     \fn QPoint &QVariant::asPoint()
       
  2994 
       
  2995     Use toPoint() instead.
       
  2996  */
       
  2997 
       
  2998 /*!
       
  2999     \fn QRect &QVariant::asRect()
       
  3000 
       
  3001     Use toRect() instead.
       
  3002  */
       
  3003 
       
  3004 /*!
       
  3005     \fn QSize &QVariant::asSize()
       
  3006 
       
  3007     Use toSize() instead.
       
  3008  */
       
  3009 
       
  3010 /*! \fn void QVariant::setValue(const T &value)
       
  3011 
       
  3012     Stores a copy of \a value. If \c{T} is a type that QVariant
       
  3013     doesn't support, QMetaType is used to store the value. A compile
       
  3014     error will occur if QMetaType doesn't handle the type.
       
  3015 
       
  3016     Example:
       
  3017 
       
  3018     \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 4
       
  3019 
       
  3020     \warning This function is not available with MSVC 6. Use
       
  3021     qVariantSetValue() instead if you need to support that version of
       
  3022     the compiler.
       
  3023 
       
  3024     \sa value(), fromValue(), canConvert()
       
  3025  */
       
  3026 
       
  3027 /*! \fn T QVariant::value() const
       
  3028 
       
  3029     Returns the stored value converted to the template type \c{T}.
       
  3030     Call canConvert() to find out whether a type can be converted.
       
  3031     If the value cannot be converted, \l{default-constructed value}
       
  3032     will be returned.
       
  3033 
       
  3034     If the type \c{T} is supported by QVariant, this function behaves
       
  3035     exactly as toString(), toInt() etc.
       
  3036 
       
  3037     Example:
       
  3038 
       
  3039     \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 5
       
  3040 
       
  3041     \warning This function is not available with MSVC 6. Use
       
  3042     qVariantValue() or qvariant_cast() instead if you need to support
       
  3043     that version of the compiler.
       
  3044 
       
  3045     \sa setValue(), fromValue(), canConvert()
       
  3046 */
       
  3047 
       
  3048 /*! \fn bool QVariant::canConvert() const
       
  3049 
       
  3050     Returns true if the variant can be converted to the template type \c{T},
       
  3051     otherwise false.
       
  3052 
       
  3053     Example:
       
  3054 
       
  3055     \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 6
       
  3056 
       
  3057     \warning This function is not available with MSVC 6. Use
       
  3058     qVariantCanConvert() instead if you need to support that version
       
  3059     of the compiler.
       
  3060 
       
  3061     \sa convert()
       
  3062 */
       
  3063 
       
  3064 /*! \fn static QVariant QVariant::fromValue(const T &value)
       
  3065 
       
  3066     Returns a QVariant containing a copy of \a value. Behaves
       
  3067     exactly like setValue() otherwise.
       
  3068 
       
  3069     Example:
       
  3070 
       
  3071     \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 7
       
  3072 
       
  3073     \note If you are working with custom types, you should use
       
  3074     the Q_DECLARE_METATYPE() macro to register your custom type.
       
  3075 
       
  3076     \warning This function is not available with MSVC 6. Use
       
  3077     qVariantFromValue() instead if you need to support that version
       
  3078     of the compiler.
       
  3079 
       
  3080     \sa setValue(), value()
       
  3081 */
       
  3082 
       
  3083 /*!
       
  3084     \fn QVariant qVariantFromValue(const T &value)
       
  3085     \relates QVariant
       
  3086 
       
  3087     Returns a variant containing a copy of the given \a value
       
  3088     with template type \c{T}.
       
  3089 
       
  3090     This function is equivalent to QVariant::fromValue(\a value). It
       
  3091     is provided as a work-around for MSVC 6, which doesn't support
       
  3092     member template functions.
       
  3093 
       
  3094     For example, a QObject pointer can be stored in a variant with the
       
  3095     following code:
       
  3096 
       
  3097     \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 8
       
  3098 
       
  3099     \sa QVariant::fromValue()
       
  3100 */
       
  3101 
       
  3102 /*! \fn void qVariantSetValue(QVariant &variant, const T &value)
       
  3103     \relates QVariant
       
  3104 
       
  3105     Sets the contents of the given \a variant to a copy of the
       
  3106     \a value with the specified template type \c{T}.
       
  3107 
       
  3108     This function is equivalent to QVariant::setValue(\a value). It
       
  3109     is provided as a work-around for MSVC 6, which doesn't support
       
  3110     member template functions.
       
  3111 
       
  3112     \sa QVariant::setValue()
       
  3113 */
       
  3114 
       
  3115 /*!
       
  3116     \fn T qvariant_cast(const QVariant &value)
       
  3117     \relates QVariant
       
  3118 
       
  3119     Returns the given \a value converted to the template type \c{T}.
       
  3120 
       
  3121     This function is equivalent to qVariantValue().
       
  3122 
       
  3123     \sa qVariantValue(), QVariant::value()
       
  3124 */
       
  3125 
       
  3126 /*! \fn T qVariantValue(const QVariant &value)
       
  3127     \relates QVariant
       
  3128 
       
  3129     Returns the given \a value converted to the template type \c{T}.
       
  3130 
       
  3131     This function is equivalent to
       
  3132     \l{QVariant::value()}{QVariant::value}<T>(\a value). It is
       
  3133     provided as a work-around for MSVC 6, which doesn't support
       
  3134     member template functions.
       
  3135 
       
  3136     \sa QVariant::value(), qvariant_cast()
       
  3137 */
       
  3138 
       
  3139 /*! \fn bool qVariantCanConvert(const QVariant &value)
       
  3140     \relates QVariant
       
  3141 
       
  3142     Returns true if the given \a value can be converted to the
       
  3143     template type specified; otherwise returns false.
       
  3144 
       
  3145     This function is equivalent to QVariant::canConvert(\a value). It
       
  3146     is provided as a work-around for MSVC 6, which doesn't support
       
  3147     member template functions.
       
  3148 
       
  3149     \sa QVariant::canConvert()
       
  3150 */
       
  3151 
       
  3152 /*!
       
  3153     \typedef QVariantList
       
  3154     \relates QVariant
       
  3155 
       
  3156     Synonym for QList<QVariant>.
       
  3157 */
       
  3158 
       
  3159 /*!
       
  3160     \typedef QVariantMap
       
  3161     \relates QVariant
       
  3162 
       
  3163     Synonym for QMap<QString, QVariant>.
       
  3164 */
       
  3165 
       
  3166 /*!
       
  3167     \typedef QVariantHash
       
  3168     \relates QVariant
       
  3169     \since 4.5
       
  3170 
       
  3171     Synonym for QHash<QString, QVariant>.
       
  3172 */
       
  3173 
       
  3174 /*!
       
  3175     \typedef QVariant::DataPtr
       
  3176     \internal
       
  3177 */
       
  3178 
       
  3179 /*!
       
  3180     \fn DataPtr &QVariant::data_ptr()
       
  3181     \internal
       
  3182 */
       
  3183 
       
  3184 QT_END_NAMESPACE