diff options
author | Timothy Pearson <[email protected]> | 2011-07-10 15:24:15 -0500 |
---|---|---|
committer | Timothy Pearson <[email protected]> | 2011-07-10 15:24:15 -0500 |
commit | bd0f3345a938b35ce6a12f6150373b0955b8dd12 (patch) | |
tree | 7a520322212d48ebcb9fbe1087e7fca28b76185c /src/kernel/qvariant.cpp | |
download | qt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.tar.gz qt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.zip |
Add Qt3 development HEAD version
Diffstat (limited to 'src/kernel/qvariant.cpp')
-rw-r--r-- | src/kernel/qvariant.cpp | 3496 |
1 files changed, 3496 insertions, 0 deletions
diff --git a/src/kernel/qvariant.cpp b/src/kernel/qvariant.cpp new file mode 100644 index 0000000..c9ea5b1 --- /dev/null +++ b/src/kernel/qvariant.cpp @@ -0,0 +1,3496 @@ +/**************************************************************************** +** +** Implementation of QVariant class +** +** Created : 990414 +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the kernel module of the Qt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free Qt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing requirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at [email protected]. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.QPL +** included in the packaging of this file. Licensees holding valid Qt +** Commercial licenses may use this file in accordance with the Qt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include <float.h> + +#include "qvariant.h" +#ifndef QT_NO_VARIANT +#include "qstring.h" +#include "qcstring.h" +#include "qfont.h" +#include "qpixmap.h" +#include "qimage.h" +#include "qbrush.h" +#include "qpoint.h" +#include "qrect.h" +#include "qsize.h" +#include "qcolor.h" +#include "qpalette.h" +#include "qiconset.h" +#include "qdatastream.h" +#include "qregion.h" +#include "qpointarray.h" +#include "qbitmap.h" +#include "qcursor.h" +#include "qdatetime.h" +#include "qsizepolicy.h" +#include "qshared.h" +#include "qbitarray.h" +#include "qkeysequence.h" +#include "qpen.h" + +#ifndef DBL_DIG +#define DBL_DIG 10 +#endif //DBL_DIG + +// Uncomment to test for memory leaks or to run qt/test/qvariant/main.cpp +// #define QVARIANT_DEBUG + + +static bool isNumeric(QVariant::Type type) +{ + return (type == QVariant::Int || type == QVariant::UInt + || type == QVariant::Double || type == QVariant::LongLong + || type == QVariant::ULongLong || type == QVariant::Bool); +} + + +#ifdef QVARIANT_DEBUG +int qv_count = 0; +int get_qv_count() { return qv_count; } +#endif + +QVariant::Private::Private() +{ +#ifdef QVARIANT_DEBUG + qv_count++; +#endif + typ = QVariant::Invalid; + is_null = TRUE; +} + +QVariant::Private::Private( Private* d ) +{ +#ifdef QVARIANT_DEBUG + qv_count++; +#endif + + switch( d->typ ) + { + case QVariant::Invalid: + break; + case QVariant::Bitmap: + value.ptr = new QBitmap( *((QBitmap*)d->value.ptr) ); + break; + case QVariant::Region: + value.ptr = new QRegion( *((QRegion*)d->value.ptr) ); + // ## Force a detach + // ((QRegion*)value.ptr)->translate( 0, 0 ); + break; + case QVariant::PointArray: + // QPointArray is explicit shared + value.ptr = new QPointArray( *((QPointArray*)d->value.ptr) ); + break; + case QVariant::String: + value.ptr = new QString( *((QString*)d->value.ptr) ); + break; + case QVariant::CString: + // QCString is explicit shared + value.ptr = new QCString( *((QCString*)d->value.ptr) ); + break; +#ifndef QT_NO_STRINGLIST + case QVariant::StringList: + value.ptr = new QStringList( *((QStringList*)d->value.ptr) ); + break; +#endif //QT_NO_STRINGLIST + case QVariant::Font: + value.ptr = new QFont( *((QFont*)d->value.ptr) ); + break; + case QVariant::Pixmap: + value.ptr = new QPixmap( *((QPixmap*)d->value.ptr) ); + break; + case QVariant::Image: + // QImage is explicit shared + value.ptr = new QImage( *((QImage*)d->value.ptr) ); + break; + case QVariant::Brush: + value.ptr = new QBrush( *((QBrush*)d->value.ptr) ); + // ## Force a detach + // ((QBrush*)value.ptr)->setColor( ((QBrush*)value.ptr)->color() ); + break; + case QVariant::Point: + value.ptr = new QPoint( *((QPoint*)d->value.ptr) ); + break; + case QVariant::Rect: + value.ptr = new QRect( *((QRect*)d->value.ptr) ); + break; + case QVariant::Size: + value.ptr = new QSize( *((QSize*)d->value.ptr) ); + break; + case QVariant::Color: + value.ptr = new QColor( *((QColor*)d->value.ptr) ); + break; +#ifndef QT_NO_PALETTE + case QVariant::Palette: + value.ptr = new QPalette( *((QPalette*)d->value.ptr) ); + break; + case QVariant::ColorGroup: + value.ptr = new QColorGroup( *((QColorGroup*)d->value.ptr) ); + break; +#endif +#ifndef QT_NO_ICONSET + case QVariant::IconSet: + value.ptr = new QIconSet( *((QIconSet*)d->value.ptr) ); + break; +#endif +#ifndef QT_NO_TEMPLATE_VARIANT + case QVariant::Map: + value.ptr = new QMap<QString,QVariant>( *((QMap<QString,QVariant>*)d->value.ptr) ); + break; + case QVariant::List: + value.ptr = new QValueList<QVariant>( *((QValueList<QVariant>*)d->value.ptr) ); + break; +#endif + case QVariant::Date: + value.ptr = new QDate( *((QDate*)d->value.ptr) ); + break; + case QVariant::Time: + value.ptr = new QTime( *((QTime*)d->value.ptr) ); + break; + case QVariant::DateTime: + value.ptr = new QDateTime( *((QDateTime*)d->value.ptr) ); + break; + case QVariant::ByteArray: + value.ptr = new QByteArray( *((QByteArray*)d->value.ptr) ); + break; + case QVariant::BitArray: + value.ptr = new QBitArray( *((QBitArray*)d->value.ptr) ); + break; +#ifndef QT_NO_ACCEL + case QVariant::KeySequence: + value.ptr = new QKeySequence( *((QKeySequence*)d->value.ptr) ); + break; +#endif + case QVariant::Pen: + value.ptr = new QPen( *((QPen*)d->value.ptr) ); + break; + case QVariant::Int: + value.i = d->value.i; + break; + case QVariant::UInt: + value.u = d->value.u; + break; + case QVariant::LongLong: + value.ll = d->value.ll; + break; + case QVariant::ULongLong: + value.ull = d->value.ull; + break; + case QVariant::Bool: + value.b = d->value.b; + break; + case QVariant::Double: + value.d = d->value.d; + break; + case QVariant::SizePolicy: + value.ptr = new QSizePolicy( *((QSizePolicy*)d->value.ptr) ); + break; + case QVariant::Cursor: + value.ptr = new QCursor( *((QCursor*)d->value.ptr) ); + break; + default: + Q_ASSERT( 0 ); + } + + typ = d->typ; + is_null = d->is_null; +} + +QVariant::Private::~Private() +{ +#ifdef QVARIANT_DEBUG + qv_count--; +#endif + clear(); +} + +void QVariant::Private::clear() +{ + switch( typ ) + { + case QVariant::Bitmap: + delete (QBitmap*)value.ptr; + break; + case QVariant::Cursor: + delete (QCursor*)value.ptr; + break; + case QVariant::Region: + delete (QRegion*)value.ptr; + break; + case QVariant::PointArray: + delete (QPointArray*)value.ptr; + break; + case QVariant::String: + delete (QString*)value.ptr; + break; + case QVariant::CString: + delete (QCString*)value.ptr; + break; +#ifndef QT_NO_STRINGLIST + case QVariant::StringList: + delete (QStringList*)value.ptr; + break; +#endif //QT_NO_STRINGLIST + case QVariant::Font: + delete (QFont*)value.ptr; + break; + case QVariant::Pixmap: + delete (QPixmap*)value.ptr; + break; + case QVariant::Image: + delete (QImage*)value.ptr; + break; + case QVariant::Brush: + delete (QBrush*)value.ptr; + break; + case QVariant::Point: + delete (QPoint*)value.ptr; + break; + case QVariant::Rect: + delete (QRect*)value.ptr; + break; + case QVariant::Size: + delete (QSize*)value.ptr; + break; + case QVariant::Color: + delete (QColor*)value.ptr; + break; +#ifndef QT_NO_PALETTE + case QVariant::Palette: + delete (QPalette*)value.ptr; + break; + case QVariant::ColorGroup: + delete (QColorGroup*)value.ptr; + break; +#endif +#ifndef QT_NO_ICONSET + case QVariant::IconSet: + delete (QIconSet*)value.ptr; + break; +#endif +#ifndef QT_NO_TEMPLATE_VARIANT + case QVariant::Map: + delete (QMap<QString,QVariant>*)value.ptr; + break; + case QVariant::List: + delete (QValueList<QVariant>*)value.ptr; + break; +#endif + case QVariant::SizePolicy: + delete (QSizePolicy*)value.ptr; + break; + case QVariant::Date: + delete (QDate*)value.ptr; + break; + case QVariant::Time: + delete (QTime*)value.ptr; + break; + case QVariant::DateTime: + delete (QDateTime*)value.ptr; + break; + case QVariant::ByteArray: + delete (QByteArray*)value.ptr; + break; + case QVariant::BitArray: + delete (QBitArray*)value.ptr; + break; +#ifndef QT_NO_ACCEL + case QVariant::KeySequence: + delete (QKeySequence*)value.ptr; + break; +#endif + case QVariant::Pen: + delete (QPen*)value.ptr; + break; + case QVariant::Invalid: + case QVariant::Int: + case QVariant::UInt: + case QVariant::LongLong: + case QVariant::ULongLong: + case QVariant::Bool: + case QVariant::Double: + break; + } + + typ = QVariant::Invalid; + is_null = TRUE; +} + +/*! + \class QVariant qvariant.h + \brief The QVariant class acts like a union for the most common Qt data types. + + \ingroup objectmodel + \ingroup misc + \mainclass + + Because C++ forbids unions from including types that have + non-default constructors or destructors, most interesting Qt + classes cannot be used in unions. Without QVariant, this would be + a problem for QObject::property() and for database work, etc. + + A QVariant object holds a single value of a single type() at a + time. (Some type()s are multi-valued, for example a string list.) + You can find out what type, T, the variant holds, convert it to a + different type using one of the asT() functions, e.g. asSize(), + get its value using one of the toT() functions, e.g. toSize(), and + check whether the type can be converted to a particular type using + canCast(). + + The methods named toT() (for any supported T, see the \c Type + documentation for a list) are const. If you ask for the stored + type, they return a copy of the stored object. If you ask for a + type that can be generated from the stored type, toT() copies and + converts and leaves the object itself unchanged. If you ask for a + type that cannot be generated from the stored type, the result + depends on the type (see the function documentation for details). + + Note that three data types supported by QVariant are explicitly + shared, namely QImage, QPointArray, and QCString, and in these + cases the toT() methods return a shallow copy. In almost all cases + you must make a deep copy of the returned values before modifying + them. + + The asT() functions are not const. They do conversion like the + toT() methods, set the variant to hold the converted value, and + return a reference to the new contents of the variant. + + Here is some example code to demonstrate the use of QVariant: + + \code + QDataStream out(...); + QVariant v(123); // The variant now contains an int + int x = v.toInt(); // x = 123 + out << v; // Writes a type tag and an int to out + v = QVariant("hello"); // The variant now contains a QCString + v = QVariant(tr("hello"));// The variant now contains a QString + int y = v.toInt(); // y = 0 since v cannot be converted to an int + QString s = v.toString(); // s = tr("hello") (see QObject::tr()) + out << v; // Writes a type tag and a QString to out + ... + QDataStream in(...); // (opening the previously written stream) + in >> v; // Reads an Int variant + int z = v.toInt(); // z = 123 + qDebug("Type is %s", // prints "Type is int" + v.typeName()); + v.asInt() += 100; // The variant now hold the value 223. + v = QVariant( QStringList() ); + v.asStringList().append( "Hello" ); + \endcode + + You can even store QValueList<QVariant>s and + QMap<QString,QVariant>s in a variant, so you can easily construct + arbitrarily complex data structures of arbitrary types. This is + very powerful and versatile, but may prove less memory and speed + efficient than storing specific types in standard data structures. + + QVariant also supports the notion of NULL values, where you have a + defined type with no value set. + \code + QVariant x, y( QString() ), z( QString("") ); + x.asInt(); + // x.isNull() == TRUE, y.isNull() == TRUE, z.isNull() == FALSE + \endcode + + See the \link collection.html Collection Classes\endlink. +*/ + +/*! + \enum QVariant::Type + + This enum type defines the types of variable that a QVariant can + contain. + + \value Invalid no type + \value BitArray a QBitArray + \value ByteArray a QByteArray + \value Bitmap a QBitmap + \value Bool a bool + \value Brush a QBrush + \value Color a QColor + \value ColorGroup a QColorGroup + \value Cursor a QCursor + \value Date a QDate + \value DateTime a QDateTime + \value Double a double + \value Font a QFont + \value IconSet a QIconSet + \value Image a QImage + \value Int an int + \value KeySequence a QKeySequence + \value List a QValueList<QVariant> + \value LongLong a long long + \value ULongLong an unsigned long long + \value Map a QMap<QString,QVariant> + \value Palette a QPalette + \value Pen a QPen + \value Pixmap a QPixmap + \value Point a QPoint + \value PointArray a QPointArray + \value Rect a QRect + \value Region a QRegion + \value Size a QSize + \value SizePolicy a QSizePolicy + \value String a QString + \value CString a QCString + \value StringList a QStringList + \value Time a QTime + \value UInt an unsigned int + + Note that Qt's definition of bool depends on the compiler. + \c qglobal.h has the system-dependent definition of bool. +*/ + +/*! + Constructs an invalid variant. +*/ +QVariant::QVariant() +{ + d = new Private; +} + +/*! + Destroys the QVariant and the contained object. + + Note that subclasses that reimplement clear() should reimplement + the destructor to call clear(). This destructor calls clear(), but + because it is the destructor, QVariant::clear() is called rather + than a subclass's clear(). +*/ +QVariant::~QVariant() +{ + if ( d->deref() ) + delete d; +} + +/*! + Constructs a copy of the variant, \a p, passed as the argument to + this constructor. Usually this is a deep copy, but a shallow copy + is made if the stored data type is explicitly shared, as e.g. + QImage is. +*/ +QVariant::QVariant( const QVariant& p ) +{ + p.d->ref(); + d = p.d; +} + +#ifndef QT_NO_DATASTREAM +/*! + Reads the variant from the data stream, \a s. +*/ +QVariant::QVariant( QDataStream& s ) +{ + d = new Private; + s >> *this; +} +#endif //QT_NO_DATASTREAM + +/*! + Constructs a new variant with a string value, \a val. +*/ +QVariant::QVariant( const QString& val ) +{ + d = new Private; + d->typ = String; + d->value.ptr = new QString( val ); +} + +/*! + Constructs a new variant with a C-string value, \a val. + + If you want to modify the QCString after you've passed it to this + constructor, we recommend passing a deep copy (see + QCString::copy()). +*/ +QVariant::QVariant( const QCString& val ) +{ + d = new Private; + d->typ = CString; + d->value.ptr = new QCString( val ); +} + +/*! + Constructs a new variant with a C-string value of \a val if \a val + is non-null. The variant creates a deep copy of \a val. + + If \a val is null, the resulting variant has type Invalid. +*/ +QVariant::QVariant( const char* val ) +{ + d = new Private; + if ( val == 0 ) + return; + d->typ = CString; + d->value.ptr = new QCString( val ); +} + +#ifndef QT_NO_STRINGLIST +/*! + Constructs a new variant with a string list value, \a val. +*/ +QVariant::QVariant( const QStringList& val ) +{ + d = new Private; + d->typ = StringList; + d->value.ptr = new QStringList( val ); + d->is_null = FALSE; +} +#endif // QT_NO_STRINGLIST + +#ifndef QT_NO_TEMPLATE_VARIANT +/*! + Constructs a new variant with a map of QVariants, \a val. +*/ +QVariant::QVariant( const QMap<QString,QVariant>& val ) +{ + d = new Private; + d->typ = Map; + d->value.ptr = new QMap<QString,QVariant>( val ); + d->is_null = FALSE; +} +#endif +/*! + Constructs a new variant with a font value, \a val. +*/ +QVariant::QVariant( const QFont& val ) +{ + d = new Private; + d->typ = Font; + d->value.ptr = new QFont( val ); + d->is_null = FALSE; +} + +/*! + Constructs a new variant with a pixmap value, \a val. +*/ +QVariant::QVariant( const QPixmap& val ) +{ + d = new Private; + d->typ = Pixmap; + d->value.ptr = new QPixmap( val ); +} + + +/*! + Constructs a new variant with an image value, \a val. + + Because QImage is explicitly shared, you may need to pass a deep + copy to the variant using QImage::copy(), e.g. if you intend + changing the image you've passed later on. +*/ +QVariant::QVariant( const QImage& val ) +{ + d = new Private; + d->typ = Image; + d->value.ptr = new QImage( val ); +} + +/*! + Constructs a new variant with a brush value, \a val. +*/ +QVariant::QVariant( const QBrush& val ) +{ + d = new Private; + d->typ = Brush; + d->value.ptr = new QBrush( val ); + d->is_null = FALSE; +} + +/*! + Constructs a new variant with a point value, \a val. +*/ +QVariant::QVariant( const QPoint& val ) +{ + d = new Private; + d->typ = Point; + d->value.ptr = new QPoint( val ); +} + +/*! + Constructs a new variant with a rect value, \a val. +*/ +QVariant::QVariant( const QRect& val ) +{ + d = new Private; + d->typ = Rect; + d->value.ptr = new QRect( val ); +} + +/*! + Constructs a new variant with a size value, \a val. +*/ +QVariant::QVariant( const QSize& val ) +{ + d = new Private; + d->typ = Size; + d->value.ptr = new QSize( val ); +} + +/*! + Constructs a new variant with a color value, \a val. +*/ +QVariant::QVariant( const QColor& val ) +{ + d = new Private; + d->typ = Color; + d->value.ptr = new QColor( val ); + d->is_null = FALSE; +} + +#ifndef QT_NO_PALETTE +/*! + Constructs a new variant with a color palette value, \a val. +*/ +QVariant::QVariant( const QPalette& val ) +{ + d = new Private; + d->typ = Palette; + d->value.ptr = new QPalette( val ); + d->is_null = FALSE; +} + +/*! + Constructs a new variant with a color group value, \a val. +*/ +QVariant::QVariant( const QColorGroup& val ) +{ + d = new Private; + d->typ = ColorGroup; + d->value.ptr = new QColorGroup( val ); + d->is_null = FALSE; +} +#endif //QT_NO_PALETTE +#ifndef QT_NO_ICONSET +/*! + Constructs a new variant with an icon set value, \a val. +*/ +QVariant::QVariant( const QIconSet& val ) +{ + d = new Private; + d->typ = IconSet; + d->value.ptr = new QIconSet( val ); +} +#endif //QT_NO_ICONSET +/*! + Constructs a new variant with a region value, \a val. +*/ +QVariant::QVariant( const QRegion& val ) +{ + d = new Private; + d->typ = Region; + // ## Force a detach + d->value.ptr = new QRegion( val ); + ((QRegion*)d->value.ptr)->translate( 0, 0 ); +} + +/*! + Constructs a new variant with a bitmap value, \a val. +*/ +QVariant::QVariant( const QBitmap& val ) +{ + d = new Private; + d->typ = Bitmap; + d->value.ptr = new QBitmap( val ); +} + +/*! + Constructs a new variant with a cursor value, \a val. +*/ +QVariant::QVariant( const QCursor& val ) +{ + d = new Private; + d->typ = Cursor; + d->value.ptr = new QCursor( val ); + d->is_null = FALSE; +} + +/*! + Constructs a new variant with a point array value, \a val. + + Because QPointArray is explicitly shared, you may need to pass a + deep copy to the variant using QPointArray::copy(), e.g. if you + intend changing the point array you've passed later on. +*/ +QVariant::QVariant( const QPointArray& val ) +{ + d = new Private; + d->typ = PointArray; + d->value.ptr = new QPointArray( val ); +} + +/*! + Constructs a new variant with a date value, \a val. +*/ +QVariant::QVariant( const QDate& val ) +{ + d = new Private; + d->typ = Date; + d->value.ptr = new QDate( val ); +} + +/*! + Constructs a new variant with a time value, \a val. +*/ +QVariant::QVariant( const QTime& val ) +{ + d = new Private; + d->typ = Time; + d->value.ptr = new QTime( val ); +} + +/*! + Constructs a new variant with a date/time value, \a val. +*/ +QVariant::QVariant( const QDateTime& val ) +{ + d = new Private; + d->typ = DateTime; + d->value.ptr = new QDateTime( val ); +} + +/*! + Constructs a new variant with a bytearray value, \a val. +*/ +QVariant::QVariant( const QByteArray& val ) +{ + d = new Private; + d->typ = ByteArray; + d->value.ptr = new QByteArray( val ); +} + +/*! + Constructs a new variant with a bitarray value, \a val. +*/ +QVariant::QVariant( const QBitArray& val ) +{ + d = new Private; + d->typ = BitArray; + d->value.ptr = new QBitArray( val ); +} + +#ifndef QT_NO_ACCEL + +/*! + Constructs a new variant with a key sequence value, \a val. +*/ +QVariant::QVariant( const QKeySequence& val ) +{ + d = new Private; + d->typ = KeySequence; + d->value.ptr = new QKeySequence( val ); + d->is_null = FALSE; +} + +#endif + +/*! + Constructs a new variant with a pen value, \a val. +*/ +QVariant::QVariant( const QPen& val ) +{ + d = new Private; + d->typ = Pen; + d->value.ptr = new QPen( val ); +} + +/*! + Constructs a new variant with an integer value, \a val. +*/ +QVariant::QVariant( int val ) +{ + d = new Private; + d->typ = Int; + d->value.i = val; + d->is_null = FALSE; +} + +/*! + Constructs a new variant with an unsigned integer value, \a val. +*/ +QVariant::QVariant( uint val ) +{ + d = new Private; + d->typ = UInt; + d->value.u = val; + d->is_null = FALSE; +} + +/*! + Constructs a new variant with a long long integer value, \a val. +*/ +QVariant::QVariant( Q_LLONG val ) +{ + d = new Private; + d->typ = LongLong; + d->value.ll = val; + d->is_null = FALSE; +} + +/*! + Constructs a new variant with an unsigned long long integer value, \a val. +*/ + +QVariant::QVariant( Q_ULLONG val ) +{ + d = new Private; + d->typ = ULongLong; + d->value.ull = val; + d->is_null = FALSE; +} + +/*! + Constructs a new variant with a boolean value, \a val. The integer + argument is a dummy, necessary for compatibility with some + compilers. +*/ +QVariant::QVariant( bool val, int ) +{ // this is the comment that does NOT name said compiler. + d = new Private; + d->typ = Bool; + d->value.b = val; + d->is_null = FALSE; +} + + +/*! + Constructs a new variant with a floating point value, \a val. +*/ +QVariant::QVariant( double val ) +{ + d = new Private; + d->typ = Double; + d->value.d = val; + d->is_null = FALSE; +} + +#ifndef QT_NO_TEMPLATE_VARIANT +/*! + Constructs a new variant with a list value, \a val. +*/ +QVariant::QVariant( const QValueList<QVariant>& val ) +{ + d = new Private; + d->typ = List; + d->value.ptr = new QValueList<QVariant>( val ); + d->is_null = FALSE; +} +#endif + +/*! + Constructs a new variant with a size policy value, \a val. +*/ +QVariant::QVariant( QSizePolicy val ) +{ + d = new Private; + d->typ = SizePolicy; + d->value.ptr = new QSizePolicy( val ); + d->is_null = FALSE; +} + +/*! + Assigns the value of the variant \a variant to this variant. + + This is a deep copy of the variant, but note that if the variant + holds an explicitly shared type such as QImage, a shallow copy is + performed. +*/ +QVariant& QVariant::operator= ( const QVariant& variant ) +{ + QVariant& other = (QVariant&)variant; + + other.d->ref(); + if ( d->deref() ) + delete d; + + d = other.d; + + return *this; +} + +/*! + \internal +*/ +void QVariant::detach() +{ + if ( d->count == 1 ) + return; + + d->deref(); + d = new Private( d ); +} + +/*! + Returns the name of the type stored in the variant. The returned + strings describe the C++ datatype used to store the data: for + example, "QFont", "QString", or "QValueList<QVariant>". An Invalid + variant returns 0. +*/ +const char* QVariant::typeName() const +{ + return typeToName( (Type) d->typ ); +} + +/*! + Convert this variant to type Invalid and free up any resources + used. +*/ +void QVariant::clear() +{ + if ( d->count > 1 ) + { + d->deref(); + d = new Private; + return; + } + + d->clear(); +} + +/* Attention! + + For dependency reasons, this table is duplicated in moc.y. If you + change one, change both. + + (Search for the word 'Attention' in moc.y.) +*/ +static const int ntypes = 35; +static const char* const type_map[ntypes] = +{ + 0, + "QMap<QString,QVariant>", + "QValueList<QVariant>", + "QString", + "QStringList", + "QFont", + "QPixmap", + "QBrush", + "QRect", + "QSize", + "QColor", + "QPalette", + "QColorGroup", + "QIconSet", + "QPoint", + "QImage", + "int", + "uint", + "bool", + "double", + "QCString", + "QPointArray", + "QRegion", + "QBitmap", + "QCursor", + "QSizePolicy", + "QDate", + "QTime", + "QDateTime", + "QByteArray", + "QBitArray", + "QKeySequence", + "QPen", + "Q_LLONG", + "Q_ULLONG" +}; + + +/*! + Converts the enum representation of the storage type, \a typ, to + its string representation. +*/ +const char* QVariant::typeToName( Type typ ) +{ + if ( typ >= ntypes ) + return 0; + return type_map[typ]; +} + + +/*! + Converts the string representation of the storage type given in \a + name, to its enum representation. + + If the string representation cannot be converted to any enum + representation, the variant is set to \c Invalid. +*/ +QVariant::Type QVariant::nameToType( const char* name ) +{ + for ( int i = 0; i < ntypes; i++ ) { + if ( !qstrcmp( type_map[i], name ) ) + return (Type) i; + } + return Invalid; +} + +#ifndef QT_NO_DATASTREAM +/*! + Internal function for loading a variant from stream \a s. Use the + stream operators instead. + + \internal +*/ +void QVariant::load( QDataStream& s ) +{ + clear(); + Q_UINT32 u; + s >> u; + Type t = (Type)u; + + switch( t ) { + case Invalid: + { + // Since we wrote something, we should read something + QString x; + s >> x; + d->typ = t; + d->is_null = TRUE; + } + break; +#ifndef QT_NO_TEMPLATE_VARIANT + case Map: + { + QMap<QString,QVariant>* x = new QMap<QString,QVariant>; + s >> *x; + d->value.ptr = x; + d->is_null = FALSE; + } + break; + case List: + { + QValueList<QVariant>* x = new QValueList<QVariant>; + s >> *x; + d->value.ptr = x; + d->is_null = FALSE; + } + break; +#endif + case Cursor: + { +#ifndef QT_NO_CURSOR + QCursor* x = new QCursor; + s >> *x; + d->value.ptr = x; + d->is_null = FALSE; +#endif + } + break; + case Bitmap: + { + QBitmap* x = new QBitmap; +#ifndef QT_NO_IMAGEIO + s >> *x; +#endif + d->value.ptr = x; + } + break; + case Region: + { + QRegion* x = new QRegion; + s >> *x; + d->value.ptr = x; + } + break; + case PointArray: + { + QPointArray* x = new QPointArray; + s >> *x; + d->value.ptr = x; + } + break; + case String: + { + QString* x = new QString; + s >> *x; + d->value.ptr = x; + } + break; + case CString: + { + QCString* x = new QCString; + s >> *x; + d->value.ptr = x; + } + break; +#ifndef QT_NO_STRINGLIST + case StringList: + { + QStringList* x = new QStringList; + s >> *x; + d->value.ptr = x; + d->is_null = FALSE; + } + break; +#endif // QT_NO_STRINGLIST + case Font: + { + QFont* x = new QFont; + s >> *x; + d->value.ptr = x; + d->is_null = FALSE; + } + break; + case Pixmap: + { + QPixmap* x = new QPixmap; +#ifndef QT_NO_IMAGEIO + s >> *x; +#endif + d->value.ptr = x; + } + break; + case Image: + { + QImage* x = new QImage; +#ifndef QT_NO_IMAGEIO + s >> *x; +#endif + d->value.ptr = x; + } + break; + case Brush: + { + QBrush* x = new QBrush; + s >> *x; + d->value.ptr = x; + d->is_null = FALSE; + } + break; + case Rect: + { + QRect* x = new QRect; + s >> *x; + d->value.ptr = x; + } + break; + case Point: + { + QPoint* x = new QPoint; + s >> *x; + d->value.ptr = x; + } + break; + case Size: + { + QSize* x = new QSize; + s >> *x; + d->value.ptr = x; + } + break; + case Color: + { + QColor* x = new QColor; + s >> *x; + d->value.ptr = x; + d->is_null = FALSE; + } + break; +#ifndef QT_NO_PALETTE + case Palette: + { + QPalette* x = new QPalette; + s >> *x; + d->value.ptr = x; + d->is_null = FALSE; + } + break; + case ColorGroup: + { + QColorGroup* x = new QColorGroup; + s >> *x; + d->value.ptr = x; + d->is_null = FALSE; + } + break; +#endif +#ifndef QT_NO_ICONSET + case IconSet: + { + QPixmap x; + s >> x; + d->value.ptr = new QIconSet( x ); + } + break; +#endif + case Int: + { + int x; + s >> x; + d->value.i = x; + d->is_null = FALSE; + } + break; + case UInt: + { + uint x; + s >> x; + d->value.u = x; + d->is_null = FALSE; + } + break; + case LongLong: + { + Q_LLONG x; + s >> x; + d->value.ll = x; + } + break; + case ULongLong: + { + Q_ULLONG x; + s >> x; + d->value.ull = x; + } + break; + case Bool: + { + Q_INT8 x; + s >> x; + d->value.b = x; + d->is_null = FALSE; + } + break; + case Double: + { + double x; + s >> x; + d->value.d = x; + d->is_null = FALSE; + } + break; + case SizePolicy: + { + int h,v; + Q_INT8 hfw; + s >> h >> v >> hfw; + d->value.ptr = new QSizePolicy( (QSizePolicy::SizeType)h, + (QSizePolicy::SizeType)v, + (bool) hfw); + d->is_null = FALSE; + } + break; + case Date: + { + QDate* x = new QDate; + s >> *x; + d->value.ptr = x; + } + break; + case Time: + { + QTime* x = new QTime; + s >> *x; + d->value.ptr = x; + } + break; + case DateTime: + { + QDateTime* x = new QDateTime; + s >> *x; + d->value.ptr = x; + } + break; + case ByteArray: + { + QByteArray* x = new QByteArray; + s >> *x; + d->value.ptr = x; + } + break; + case BitArray: + { + QBitArray* x = new QBitArray; + s >> *x; + d->value.ptr = x; + } + break; +#ifndef QT_NO_ACCEL + case KeySequence: + { + QKeySequence* x = new QKeySequence; + s >> *x; + d->value.ptr = x; + d->is_null = FALSE; + } + break; +#endif // QT_NO_ACCEL + case Pen: + { + QPen* x = new QPen; + s >> *x; + d->value.ptr = x; + d->is_null = FALSE; + } + break; + } + d->typ = t; +} + +/*! + Internal function for saving a variant to the stream \a s. Use the + stream operators instead. + + \internal +*/ +void QVariant::save( QDataStream& s ) const +{ + s << (Q_UINT32)type(); + + switch( d->typ ) { + case Cursor: + s << *((QCursor*)d->value.ptr); + break; + case Bitmap: +#ifndef QT_NO_IMAGEIO + s << *((QBitmap*)d->value.ptr); +#endif + break; + case PointArray: + s << *((QPointArray*)d->value.ptr); + break; + case Region: + s << *((QRegion*)d->value.ptr); + break; +#ifndef QT_NO_TEMPLATE_VARIANT + case List: + s << *((QValueList<QVariant>*)d->value.ptr); + break; + case Map: + s << *((QMap<QString,QVariant>*)d->value.ptr); + break; +#endif + case String: + s << *((QString*)d->value.ptr); + break; + case CString: + s << *((QCString*)d->value.ptr); + break; +#ifndef QT_NO_STRINGLIST + case StringList: + s << *((QStringList*)d->value.ptr); + break; +#endif + case Font: + s << *((QFont*)d->value.ptr); + break; + case Pixmap: +#ifndef QT_NO_IMAGEIO + s << *((QPixmap*)d->value.ptr); +#endif + break; + case Image: +#ifndef QT_NO_IMAGEIO + s << *((QImage*)d->value.ptr); +#endif + break; + case Brush: + s << *((QBrush*)d->value.ptr); + break; + case Point: + s << *((QPoint*)d->value.ptr); + break; + case Rect: + s << *((QRect*)d->value.ptr); + break; + case Size: + s << *((QSize*)d->value.ptr); + break; + case Color: + s << *((QColor*)d->value.ptr); + break; +#ifndef QT_NO_PALETTE + case Palette: + s << *((QPalette*)d->value.ptr); + break; + case ColorGroup: + s << *((QColorGroup*)d->value.ptr); + break; +#endif +#ifndef QT_NO_ICONSET + case IconSet: + //### add stream operator to iconset + s << ((QIconSet*)d->value.ptr)->pixmap(); + break; +#endif + case Int: + s << d->value.i; + break; + case UInt: + s << d->value.u; + break; + case LongLong: + s << d->value.ll; + break; + case ULongLong: + s << d->value.ull; + break; + case Bool: + s << (Q_INT8)d->value.b; + break; + case Double: + s << d->value.d; + break; + case SizePolicy: + { + QSizePolicy p = toSizePolicy(); + s << (int) p.horData() << (int) p.verData() + << (Q_INT8) p.hasHeightForWidth(); + } + break; + case Date: + s << *((QDate*)d->value.ptr); + break; + case Time: + s << *((QTime*)d->value.ptr); + break; + case DateTime: + s << *((QDateTime*)d->value.ptr); + break; + case ByteArray: + s << *((QByteArray*)d->value.ptr); + break; + case BitArray: + s << *((QBitArray*)d->value.ptr); + break; +#ifndef QT_NO_ACCEL + case KeySequence: + s << *((QKeySequence*)d->value.ptr); + break; +#endif + case Pen: + s << *((QPen*)d->value.ptr); + break; + case Invalid: + s << QString(); // ### looks wrong. + break; + } +} + +/*! + Reads a variant \a p from the stream \a s. + + \sa \link datastreamformat.html Format of the QDataStream + operators \endlink +*/ +QDataStream& operator>> ( QDataStream& s, QVariant& p ) +{ + p.load( s ); + return s; +} + +/*! + Writes a variant \a p to the stream \a s. + + \sa \link datastreamformat.html Format of the QDataStream + operators \endlink +*/ +QDataStream& operator<< ( QDataStream& s, const QVariant& p ) +{ + p.save( s ); + return s; +} + +/*! + Reads a variant type \a p in enum representation from the stream \a s. +*/ +QDataStream& operator>> ( QDataStream& s, QVariant::Type& p ) +{ + Q_UINT32 u; + s >> u; + p = (QVariant::Type) u; + + return s; +} + +/*! + Writes a variant type \a p to the stream \a s. +*/ +QDataStream& operator<< ( QDataStream& s, const QVariant::Type p ) +{ + s << (Q_UINT32)p; + + return s; +} + +#endif //QT_NO_DATASTREAM + +/*! + \fn Type QVariant::type() const + + Returns the storage type of the value stored in the variant. + Usually it's best to test with canCast() whether the variant can + deliver the data type you are interested in. +*/ + +/*! + \fn bool QVariant::isValid() const + + Returns TRUE if the storage type of this variant is not + QVariant::Invalid; otherwise returns FALSE. +*/ + +/*! + \fn QValueListConstIterator<QString> QVariant::stringListBegin() const + \obsolete + + Returns an iterator to the first string in the list if the + variant's type is StringList; otherwise returns a null iterator. +*/ + +/*! + \fn QValueListConstIterator<QString> QVariant::stringListEnd() const + \obsolete + + Returns the end iterator for the list if the variant's type is + StringList; otherwise returns a null iterator. +*/ + +/*! + \fn QValueListConstIterator<QVariant> QVariant::listBegin() const + \obsolete + + Returns an iterator to the first item in the list if the variant's + type is appropriate; otherwise returns a null iterator. +*/ + +/*! + \fn QValueListConstIterator<QVariant> QVariant::listEnd() const + \obsolete + + Returns the end iterator for the list if the variant's type is + appropriate; otherwise returns a null iterator. +*/ + +/*! + \fn QMapConstIterator<QString, QVariant> QVariant::mapBegin() const + \obsolete + + Returns an iterator to the first item in the map, if the variant's + type is appropriate; otherwise returns a null iterator. +*/ + +/*! + \fn QMapConstIterator<QString, QVariant> QVariant::mapEnd() const + \obsolete + + Returns the end iterator for the map, if the variant's type is + appropriate; otherwise returns a null iterator. +*/ + +/*! + \fn QMapConstIterator<QString, QVariant> QVariant::mapFind( const QString& key ) const + \obsolete + + Returns an iterator to the item in the map with \a key as key, if + the variant's type is appropriate and \a key is a valid key; + otherwise returns a null iterator. +*/ + +/*! + Returns the variant as a QString if the variant can be cast to + String, otherwise returns QString::null. + + \sa asString(), canCast() +*/ +const QString QVariant::toString() const +{ + switch( d->typ ) { + case CString: + return QString::fromLatin1( toCString() ); + case Int: + return QString::number( toInt() ); + case UInt: + return QString::number( toUInt() ); + case LongLong: + return QString::number( toLongLong() ); + case ULongLong: + return QString::number( toULongLong() ); + case Double: + return QString::number( toDouble(), 'g', DBL_DIG ); +#if !defined(QT_NO_SPRINTF) && !defined(QT_NO_DATESTRING) + case Date: + return toDate().toString( Qt::ISODate ); + case Time: + return toTime().toString( Qt::ISODate ); + case DateTime: + return toDateTime().toString( Qt::ISODate ); +#endif + case Bool: + return toInt() ? "true" : "false"; +#ifndef QT_NO_ACCEL + case KeySequence: + return (QString) *( (QKeySequence*)d->value.ptr ); +#endif + case ByteArray: + return QString( *((QByteArray*)d->value.ptr) ); + case Font: + return toFont().toString(); + case Color: + return toColor().name(); + case String: + return *((QString*)d->value.ptr); + default: + return QString::null; + } +} +/*! + Returns the variant as a QCString if the variant can be cast to a + CString; otherwise returns 0. + + \sa asCString(), canCast() +*/ +const QCString QVariant::toCString() const +{ + switch( d->typ ) { + case CString: return *((QCString*)d->value.ptr); + case String: return ((QString*)d->value.ptr)->latin1(); + default: { + if (!canCast(String)) + return 0; + QString c = toString(); + return QCString(c.latin1()); + } + } +} + + +#ifndef QT_NO_STRINGLIST +/*! + Returns the variant as a QStringList if the variant has type() + StringList or List of a type that can be converted to QString; + otherwise returns an empty list. + + Note that if you want to iterate over the list, you should iterate + over a copy, e.g. + \code + QStringList list = myVariant.toStringList(); + QStringList::Iterator it = list.begin(); + while( it != list.end() ) { + myProcessing( *it ); + ++it; + } + \endcode + + \sa asStringList() +*/ +const QStringList QVariant::toStringList() const +{ + switch ( d->typ ) { + case StringList: + return *((QStringList*)d->value.ptr); +#ifndef QT_NO_TEMPLATE_VARIANT + case List: + { + QStringList lst; + QValueList<QVariant>::ConstIterator it = listBegin(); + QValueList<QVariant>::ConstIterator end = listEnd(); + while( it != end ) { + QString tmp = (*it).toString(); + ++it; + lst.append( tmp ); + } + return lst; + } +#endif + default: + return QStringList(); + } +} +#endif //QT_NO_STRINGLIST + +#ifndef QT_NO_TEMPLATE_VARIANT +/*! + Returns the variant as a QMap<QString,QVariant> if the variant has + type() Map; otherwise returns an empty map. + + Note that if you want to iterate over the map, you should iterate + over a copy, e.g. + \code + QMap<QString, QVariant> map = myVariant.toMap(); + QMap<QString, QVariant>::Iterator it = map.begin(); + while( it != map.end() ) { + myProcessing( *it ); + ++it; + } + \endcode + + \sa asMap() +*/ +const QMap<QString, QVariant> QVariant::toMap() const +{ + if ( d->typ != Map ) + return QMap<QString,QVariant>(); + + return *((QMap<QString,QVariant>*)d->value.ptr); +} +#endif +/*! + Returns the variant as a QFont if the variant can be cast to Font; + otherwise returns the application's default font. + + \sa asFont(), canCast() +*/ +const QFont QVariant::toFont() const +{ + switch ( d->typ ) { + case CString: + case ByteArray: + case String: + { + QFont fnt; + fnt.fromString( toString() ); + return fnt; + } + case Font: + return *((QFont*)d->value.ptr); + default: + return QFont(); + } +} + +/*! + Returns the variant as a QPixmap if the variant has type() Pixmap; + otherwise returns a null pixmap. + + \sa asPixmap() +*/ +const QPixmap QVariant::toPixmap() const +{ + if ( d->typ != Pixmap ) + return QPixmap(); + + return *((QPixmap*)d->value.ptr); +} + +/*! + Returns the variant as a QImage if the variant has type() Image; + otherwise returns a null image. + + \sa asImage() +*/ +const QImage QVariant::toImage() const +{ + if ( d->typ != Image ) + return QImage(); + + return *((QImage*)d->value.ptr); +} + +/*! + Returns the variant as a QBrush if the variant has type() Brush; + otherwise returns a default brush (with all black colors). + + \sa asBrush() +*/ +const QBrush QVariant::toBrush() const +{ + if( d->typ != Brush ) + return QBrush(); + + return *((QBrush*)d->value.ptr); +} + +/*! + Returns the variant as a QPoint if the variant has type() Point; + otherwise returns a point (0, 0). + + \sa asPoint() +*/ +const QPoint QVariant::toPoint() const +{ + if ( d->typ != Point ) + return QPoint(); + + return *((QPoint*)d->value.ptr); +} + +/*! + Returns the variant as a QRect if the variant has type() Rect; + otherwise returns an empty rectangle. + + \sa asRect() +*/ +const QRect QVariant::toRect() const +{ + if ( d->typ != Rect ) + return QRect(); + + return *((QRect*)d->value.ptr); +} + +/*! + Returns the variant as a QSize if the variant has type() Size; + otherwise returns an invalid size. + + \sa asSize() +*/ +const QSize QVariant::toSize() const +{ + if ( d->typ != Size ) + return QSize(); + + return *((QSize*)d->value.ptr); +} + +/*! + Returns the variant as a QColor if the variant can be cast to Color; + otherwise returns an invalid color. + + \sa asColor(), canCast() +*/ +const QColor QVariant::toColor() const +{ + switch ( d->typ ) { + case ByteArray: + case CString: + case String: + { + QColor col; + col.setNamedColor( toString() ); + return col; + } + case Color: + return *((QColor*)d->value.ptr); + default: + return QColor(); + } +} +#ifndef QT_NO_PALETTE +/*! + Returns the variant as a QPalette if the variant has type() + Palette; otherwise returns a completely black palette. + + \sa asPalette() +*/ +const QPalette QVariant::toPalette() const +{ + if ( d->typ != Palette ) + return QPalette(); + + return *((QPalette*)d->value.ptr); +} + +/*! + Returns the variant as a QColorGroup if the variant has type() + ColorGroup; otherwise returns a completely black color group. + + \sa asColorGroup() +*/ +const QColorGroup QVariant::toColorGroup() const +{ + if ( d->typ != ColorGroup ) + return QColorGroup(); + + return *((QColorGroup*)d->value.ptr); +} +#endif //QT_NO_PALETTE +#ifndef QT_NO_ICONSET +/*! + Returns the variant as a QIconSet if the variant has type() + IconSet; otherwise returns an icon set of null pixmaps. + + \sa asIconSet() +*/ +const QIconSet QVariant::toIconSet() const +{ + if ( d->typ != IconSet ) + return QIconSet(); + + return *((QIconSet*)d->value.ptr); +} +#endif //QT_NO_ICONSET +/*! + Returns the variant as a QPointArray if the variant has type() + PointArray; otherwise returns an empty QPointArray. + + \sa asPointArray() +*/ +const QPointArray QVariant::toPointArray() const +{ + if ( d->typ != PointArray ) + return QPointArray(); + + return *((QPointArray*)d->value.ptr); +} + +/*! + Returns the variant as a QBitmap if the variant has type() Bitmap; + otherwise returns a null QBitmap. + + \sa asBitmap() +*/ +const QBitmap QVariant::toBitmap() const +{ + if ( d->typ != Bitmap ) + return QBitmap(); + + return *((QBitmap*)d->value.ptr); +} + +/*! + Returns the variant as a QRegion if the variant has type() Region; + otherwise returns an empty QRegion. + + \sa asRegion() +*/ +const QRegion QVariant::toRegion() const +{ + if ( d->typ != Region ) + return QRegion(); + + return *((QRegion*)d->value.ptr); +} + +/*! + Returns the variant as a QCursor if the variant has type() Cursor; + otherwise returns the default arrow cursor. + + \sa asCursor() +*/ +const QCursor QVariant::toCursor() const +{ +#ifndef QT_NO_CURSOR + if ( d->typ != Cursor ) + return QCursor(); +#endif + + return *((QCursor*)d->value.ptr); +} + +/*! + Returns the variant as a QDate if the variant can be cast to Date; + otherwise returns an invalid date. + + Note that if the type() is String, CString or ByteArray an invalid + date will be returned if the string cannot be parsed as a + Qt::ISODate format date. + + \sa asDate(), canCast() +*/ +const QDate QVariant::toDate() const +{ + switch ( d->typ ) { + case Date: + return *((QDate*)d->value.ptr); + case DateTime: + return ((QDateTime*)d->value.ptr)->date(); +#ifndef QT_NO_DATESTRING + case String: + return QDate::fromString( *((QString*)d->value.ptr), Qt::ISODate ); + case CString: + case ByteArray: + return QDate::fromString(toString(), Qt::ISODate); +#endif + default: + return QDate(); + } +} + +/*! + Returns the variant as a QTime if the variant can be cast to Time; + otherwise returns an invalid date. + + Note that if the type() is String, CString or ByteArray an invalid + time will be returned if the string cannot be parsed as a + Qt::ISODate format time. + + \sa asTime() +*/ +const QTime QVariant::toTime() const +{ + switch ( d->typ ) { + case Time: + return *((QTime*)d->value.ptr); + case DateTime: + return ((QDateTime*)d->value.ptr)->time(); +#ifndef QT_NO_DATESTRING + case String: + return QTime::fromString( *((QString*)d->value.ptr), Qt::ISODate ); + case CString: + case ByteArray: + return QTime::fromString(toString(), Qt::ISODate); +#endif + default: + return QTime(); + } +} + +/*! + Returns the variant as a QDateTime if the variant can be cast to + DateTime; otherwise returns an invalid QDateTime. + + Note that if the type() is String, CString or ByteArray an invalid + QDateTime will be returned if the string cannot be parsed as a + Qt::ISODate format date/time. + + \sa asDateTime() +*/ +const QDateTime QVariant::toDateTime() const +{ + switch ( d->typ ) { + case DateTime: + return *((QDateTime*)d->value.ptr); +#ifndef QT_NO_DATESTRING + case String: + return QDateTime::fromString( *((QString*)d->value.ptr), Qt::ISODate ); + case CString: + case ByteArray: + return QDateTime::fromString(toString(), Qt::ISODate); +#endif + case Date: + return QDateTime( *((QDate*)d->value.ptr) ); + default: + return QDateTime(); + } +} + +/*! + Returns the variant as a QByteArray if the variant can be cast to + a ByteArray; otherwise returns an empty bytearray. + + \sa asByteArray(), canCast() +*/ +const QByteArray QVariant::toByteArray() const +{ + switch(d->typ) { + case ByteArray: return *((QByteArray*)d->value.ptr); + case CString: return *((QByteArray*)d->value.ptr); + default: { + QByteArray ret; + if (canCast(String)) { + QString c = toString(); + ret.duplicate(c.latin1(), c.length()); + } + return ret; + } + } +} + +/*! + Returns the variant as a QBitArray if the variant has type() + BitArray; otherwise returns an empty bitarray. + + \sa asBitArray() +*/ +const QBitArray QVariant::toBitArray() const +{ + if ( d->typ == BitArray ) + return *((QBitArray*)d->value.ptr); + return QBitArray(); +} + +#ifndef QT_NO_ACCEL + +/*! + Returns the variant as a QKeySequence if the variant can be cast + to a KeySequence; otherwise returns an empty key sequence. + + \sa asKeySequence(), canCast() +*/ +const QKeySequence QVariant::toKeySequence() const +{ + switch ( d->typ ) { + case KeySequence: + return *((QKeySequence*)d->value.ptr); + case String: + case ByteArray: + case CString: + return QKeySequence( toString() ); + case Int: + case UInt: + case Double: + case ULongLong: + case LongLong: + return QKeySequence( toInt() ); + default: + return QKeySequence(); + } +} + +#endif // QT_NO_ACCEL + +/*! + Returns the variant as a QPen if the variant has type() + Pen; otherwise returns an empty QPen. + + \sa asPen() +*/ +const QPen QVariant::toPen() const +{ + if ( d->typ != Pen ) + return QPen(); + + return *((QPen*)d->value.ptr); +} + +/*! + Returns the variant as an int if the variant can be cast to Int; + otherwise returns 0. + + If \a ok is non-null: \a *ok is set to TRUE if the value could be + converted to an int; otherwise \a *ok is set to FALSE. + + \sa asInt(), canCast() +*/ +int QVariant::toInt( bool * ok ) const +{ + if ( ok ) + *ok = canCast( Int ); + + switch ( d->typ ) { + case String: + return ((QString*)d->value.ptr)->toInt( ok ); + case CString: + case ByteArray: + return ((QCString*)d->value.ptr)->toInt( ok ); + case Int: + return d->value.i; + case UInt: + return (int)d->value.u; + case LongLong: + return (int)d->value.ll; + case ULongLong: + return (int)d->value.ull; + case Double: + return (int)d->value.d; + case Bool: + return (int)d->value.b; +#ifndef QT_NO_ACCEL + case KeySequence: + return (int) *( (QKeySequence*)d->value.ptr ); +#endif + default: + return 0; + } +} + +/*! + Returns the variant as an unsigned int if the variant can be cast + to UInt; otherwise returns 0. + + If \a ok is non-null: \a *ok is set to TRUE if the value could be + converted to an unsigned int; otherwise \a *ok is set to FALSE. + + \sa asUInt(), canCast() +*/ +uint QVariant::toUInt( bool * ok ) const +{ + if ( ok ) + *ok = canCast( UInt ); + + switch( d->typ ) { + case String: + return ((QString*)d->value.ptr)->toUInt( ok ); + case CString: + case ByteArray: + return ((QCString*)d->value.ptr)->toUInt( ok ); + case Int: + return (uint)d->value.i; + case UInt: + return d->value.u; + case LongLong: + return (uint)d->value.ll; + case ULongLong: + return (uint)d->value.ull; + case Double: + return (uint)d->value.d; + case Bool: + return (uint)d->value.b; + default: + return 0; + } +} + +/*! + Returns the variant as a long long int if the variant can be cast + to LongLong; otherwise returns 0. + + If \a ok is non-null: \a *ok is set to TRUE if the value could be + converted to an int; otherwise \a *ok is set to FALSE. + + \sa asLongLong(), canCast() +*/ +Q_LLONG QVariant::toLongLong( bool * ok ) const +{ + if ( ok ) + *ok = canCast( LongLong ); + + switch ( d->typ ) { + case String: + return ((QString*)d->value.ptr)->toLongLong( ok ); + case CString: + case ByteArray: + return QString(*(QCString*)d->value.ptr).toLongLong(ok); + case Int: + return (Q_LLONG)d->value.i; + case UInt: + return (Q_LLONG)d->value.u; + case LongLong: + return d->value.ll; + case ULongLong: + return (Q_LLONG)d->value.ull; + case Double: + return (Q_LLONG)d->value.d; + case Bool: + return (Q_LLONG)d->value.b; + default: + return 0; + } +} + +/*! + Returns the variant as as an unsigned long long int if the variant + can be cast to ULongLong; otherwise returns 0. + + If \a ok is non-null: \a *ok is set to TRUE if the value could be + converted to an int; otherwise \a *ok is set to FALSE. + + \sa asULongLong(), canCast() +*/ +Q_ULLONG QVariant::toULongLong( bool * ok ) const +{ + if ( ok ) + *ok = canCast( ULongLong ); + + switch ( d->typ ) { + case Int: + return (Q_ULLONG)d->value.i; + case UInt: + return (Q_ULLONG)d->value.u; + case LongLong: + return (Q_ULLONG)d->value.ll; + case ULongLong: + return d->value.ull; + case Double: + return (Q_ULLONG)d->value.d; + case Bool: + return (Q_ULLONG)d->value.b; + case String: + return ((QString*)d->value.ptr)->toULongLong( ok ); + case CString: + case ByteArray: + return QString(*(QCString*)d->value.ptr).toULongLong(ok); + default: + return 0; + } +} + +/*! + Returns the variant as a bool if the variant can be cast to Bool; + otherWise returns FALSE. + + Returns TRUE if the variant has a numeric type and its value is + non-zero, or if the variant has type String, ByteArray or CString + and its lower-case content is not empty, "0" or "false"; otherwise + returns FALSE. + + \sa asBool(), canCast() +*/ +bool QVariant::toBool() const +{ + switch( d->typ ) { + case Bool: + return d->value.b; + case Double: + return d->value.d != 0.0; + case Int: + return d->value.i != 0; + case UInt: + return d->value.u != 0; + case LongLong: + return d->value.ll != 0; + case ULongLong: + return d->value.ull != 0; + case String: + case CString: + case ByteArray: + { + QString str = toString().lower(); + return !(str == "0" || str == "false" || str.isEmpty() ); + } + default: + return FALSE; + } +} + +/*! + Returns the variant as a double if the variant can be cast to + Double; otherwise returns 0.0. + + If \a ok is non-null: \a *ok is set to TRUE if the value could be + converted to a double; otherwise \a *ok is set to FALSE. + + \sa asDouble(), canCast() +*/ +double QVariant::toDouble( bool * ok ) const +{ + if ( ok ) + *ok = canCast( Double ); + + switch ( d->typ ) { + case String: + return ((QString*)d->value.ptr)->toDouble( ok ); + case CString: + case ByteArray: + return ((QCString*)d->value.ptr)->toDouble( ok ); + case Double: + return d->value.d; + case Int: + return (double)d->value.i; + case Bool: + return (double)d->value.b; + case UInt: + return (double)d->value.u; + case LongLong: + return (double)d->value.ll; + case ULongLong: +#if defined(Q_CC_MSVC) && !defined(Q_CC_MSVC_NET) + return (double)(Q_LLONG)d->value.ull; +#else + return (double)d->value.ull; +#endif + default: + return 0.0; + } +} + +#ifndef QT_NO_TEMPLATE_VARIANT +/*! + Returns the variant as a QValueList<QVariant> if the variant has + type() List or StringList; otherwise returns an empty list. + + Note that if you want to iterate over the list, you should iterate + over a copy, e.g. + \code + QValueList<QVariant> list = myVariant.toList(); + QValueList<QVariant>::Iterator it = list.begin(); + while( it != list.end() ) { + myProcessing( *it ); + ++it; + } + \endcode + + \sa asList() +*/ +const QValueList<QVariant> QVariant::toList() const +{ + if ( d->typ == List ) + return *((QValueList<QVariant>*)d->value.ptr); +#ifndef QT_NO_STRINGLIST + if ( d->typ == StringList ) { + QValueList<QVariant> lst; + QStringList::ConstIterator it = stringListBegin(); + QStringList::ConstIterator end = stringListEnd(); + for( ; it != end; ++it ) + lst.append( QVariant( *it ) ); + return lst; + } +#endif //QT_NO_STRINGLIST + return QValueList<QVariant>(); +} +#endif + +/*! + Returns the variant as a QSizePolicy if the variant has type() + SizePolicy; otherwise returns an undefined (but legal) size + policy. +*/ + +QSizePolicy QVariant::toSizePolicy() const +{ + if ( d->typ == SizePolicy ) + return *((QSizePolicy*)d->value.ptr); + + return QSizePolicy(); +} + + +#define Q_VARIANT_AS( f ) Q##f& QVariant::as##f() \ +{ \ + bool b = isNull(); \ + if ( d->typ != f ) \ + *this = QVariant( to##f() ); \ + else \ + detach(); \ + d->is_null = b; \ + return *((Q##f*)d->value.ptr); \ +} + +Q_VARIANT_AS(String) +Q_VARIANT_AS(CString) +#ifndef QT_NO_STRINGLIST +Q_VARIANT_AS(StringList) +#endif +Q_VARIANT_AS(Font) +Q_VARIANT_AS(Pixmap) +Q_VARIANT_AS(Image) +Q_VARIANT_AS(Brush) +Q_VARIANT_AS(Point) +Q_VARIANT_AS(Rect) +Q_VARIANT_AS(Size) +Q_VARIANT_AS(Color) +#ifndef QT_NO_PALETTE +Q_VARIANT_AS(Palette) +Q_VARIANT_AS(ColorGroup) +#endif +#ifndef QT_NO_ICONSET +Q_VARIANT_AS(IconSet) +#endif +Q_VARIANT_AS(PointArray) +Q_VARIANT_AS(Bitmap) +Q_VARIANT_AS(Region) +Q_VARIANT_AS(Cursor) +Q_VARIANT_AS(SizePolicy) +Q_VARIANT_AS(Date) +Q_VARIANT_AS(Time) +Q_VARIANT_AS(DateTime) +Q_VARIANT_AS(ByteArray) +Q_VARIANT_AS(BitArray) +#ifndef QT_NO_ACCEL +Q_VARIANT_AS(KeySequence) +#endif +Q_VARIANT_AS(Pen) + +/*! + \fn QString& QVariant::asString() + + Tries to convert the variant to hold a string value. If that is + not possible the variant is set to an empty string. + + Returns a reference to the stored string. + + \sa toString() +*/ + +/*! + \fn QCString& QVariant::asCString() + + Tries to convert the variant to hold a string value. If that is + not possible the variant is set to an empty string. + + Returns a reference to the stored string. + + \sa toCString() +*/ + +/*! + \fn QStringList& QVariant::asStringList() + + Tries to convert the variant to hold a QStringList value. If that + is not possible the variant is set to an empty string list. + + Returns a reference to the stored string list. + + Note that if you want to iterate over the list, you should + iterate over a copy, e.g. + \code + QStringList list = myVariant.asStringList(); + QStringList::Iterator it = list.begin(); + while( it != list.end() ) { + myProcessing( *it ); + ++it; + } + \endcode + + \sa toStringList() +*/ + +/*! + \fn QFont& QVariant::asFont() + + Tries to convert the variant to hold a QFont. If that is not + possible the variant is set to the application's default font. + + Returns a reference to the stored font. + + \sa toFont() +*/ + +/*! + \fn QPixmap& QVariant::asPixmap() + + Tries to convert the variant to hold a pixmap value. If that is + not possible the variant is set to a null pixmap. + + Returns a reference to the stored pixmap. + + \sa toPixmap() +*/ + +/*! + \fn QImage& QVariant::asImage() + + Tries to convert the variant to hold an image value. If that is + not possible the variant is set to a null image. + + Returns a reference to the stored image. + + \sa toImage() +*/ + +/*! + \fn QBrush& QVariant::asBrush() + + Tries to convert the variant to hold a brush value. If that is not + possible the variant is set to a default black brush. + + Returns a reference to the stored brush. + + \sa toBrush() +*/ + +/*! + \fn QPoint& QVariant::asPoint() + + Tries to convert the variant to hold a point value. If that is not + possible the variant is set to a (0, 0) point. + + Returns a reference to the stored point. + + \sa toPoint() +*/ + +/*! + \fn QRect& QVariant::asRect() + + Tries to convert the variant to hold a rectangle value. If that is + not possible the variant is set to an empty rectangle. + + Returns a reference to the stored rectangle. + + \sa toRect() +*/ + +/*! + \fn QSize& QVariant::asSize() + + Tries to convert the variant to hold a QSize value. If that is not + possible the variant is set to an invalid size. + + Returns a reference to the stored size. + + \sa toSize() QSize::isValid() +*/ + +/*! + \fn QSizePolicy& QVariant::asSizePolicy() + + Tries to convert the variant to hold a QSizePolicy value. If that + fails, the variant is set to an arbitrary (valid) size policy. +*/ + + +/*! + \fn QColor& QVariant::asColor() + + Tries to convert the variant to hold a QColor value. If that is + not possible the variant is set to an invalid color. + + Returns a reference to the stored color. + + \sa toColor() QColor::isValid() +*/ + +/*! + \fn QPalette& QVariant::asPalette() + + Tries to convert the variant to hold a QPalette value. If that is + not possible the variant is set to a palette of black colors. + + Returns a reference to the stored palette. + + \sa toString() +*/ + +/*! + \fn QColorGroup& QVariant::asColorGroup() + + Tries to convert the variant to hold a QColorGroup value. If that + is not possible the variant is set to a color group of all black + colors. + + Returns a reference to the stored color group. + + \sa toColorGroup() +*/ + +/*! + \fn QIconSet& QVariant::asIconSet() + + Tries to convert the variant to hold a QIconSet value. If that is + not possible the variant is set to an empty iconset. + + Returns a reference to the stored iconset. + + \sa toIconSet() +*/ + +/*! + \fn QPointArray& QVariant::asPointArray() + + Tries to convert the variant to hold a QPointArray value. If that + is not possible the variant is set to an empty point array. + + Returns a reference to the stored point array. + + \sa toPointArray() +*/ + +/*! + \fn QBitmap& QVariant::asBitmap() + + Tries to convert the variant to hold a bitmap value. If that is + not possible the variant is set to a null bitmap. + + Returns a reference to the stored bitmap. + + \sa toBitmap() +*/ + +/*! + \fn QRegion& QVariant::asRegion() + + Tries to convert the variant to hold a QRegion value. If that is + not possible the variant is set to a null region. + + Returns a reference to the stored region. + + \sa toRegion() +*/ + +/*! + \fn QCursor& QVariant::asCursor() + + Tries to convert the variant to hold a QCursor value. If that is + not possible the variant is set to a default arrow cursor. + + Returns a reference to the stored cursor. + + \sa toCursor() +*/ + +/*! + \fn QDate& QVariant::asDate() + + Tries to convert the variant to hold a QDate value. If that is not + possible then the variant is set to an invalid date. + + Returns a reference to the stored date. + + \sa toDate() +*/ + +/*! + \fn QTime& QVariant::asTime() + + Tries to convert the variant to hold a QTime value. If that is not + possible then the variant is set to an invalid time. + + Returns a reference to the stored time. + + \sa toTime() +*/ + +/*! + \fn QDateTime& QVariant::asDateTime() + + Tries to convert the variant to hold a QDateTime value. If that is + not possible then the variant is set to an invalid date/time. + + Returns a reference to the stored date/time. + + \sa toDateTime() +*/ + +/*! + \fn QByteArray& QVariant::asByteArray() + + Tries to convert the variant to hold a QByteArray value. If that + is not possible then the variant is set to an empty bytearray. + + Returns a reference to the stored bytearray. + + \sa toByteArray() +*/ + +/*! + \fn QBitArray& QVariant::asBitArray() + + Tries to convert the variant to hold a QBitArray value. If that is + not possible then the variant is set to an empty bitarray. + + Returns a reference to the stored bitarray. + + \sa toBitArray() +*/ + +/*! + \fn QKeySequence& QVariant::asKeySequence() + + Tries to convert the variant to hold a QKeySequence value. If that + is not possible then the variant is set to an empty key sequence. + + Returns a reference to the stored key sequence. + + \sa toKeySequence() +*/ + +/*! \fn QPen& QVariant::asPen() + + Tries to convert the variant to hold a QPen value. If that + is not possible then the variant is set to an empty pen. + + Returns a reference to the stored pen. + + \sa toPen() +*/ + +/*! + Returns the variant's value as int reference. +*/ +int& QVariant::asInt() +{ + detach(); + if ( d->typ != Int ) { + int i = toInt(); + bool b = isNull(); + d->clear(); + d->value.i = i; + d->typ = Int; + d->is_null = b; + } + return d->value.i; +} + +/*! + Returns the variant's value as unsigned int reference. +*/ +uint& QVariant::asUInt() +{ + detach(); + if ( d->typ != UInt ) { + uint u = toUInt(); + bool b = isNull(); + d->clear(); + d->value.u = u; + d->typ = UInt; + d->is_null = b; + } + return d->value.u; +} + +/*! + Returns the variant's value as long long reference. +*/ +Q_LLONG& QVariant::asLongLong() +{ + detach(); + if ( d->typ != LongLong ) { + Q_LLONG ll = toLongLong(); + bool b = isNull(); + d->clear(); + d->value.ll = ll; + d->typ = LongLong; + d->is_null = b; + } + return d->value.ll; +} + +/*! + Returns the variant's value as unsigned long long reference. +*/ +Q_ULLONG& QVariant::asULongLong() +{ + detach(); + if ( d->typ != ULongLong ) { + Q_ULLONG ull = toULongLong(); + bool b = isNull(); + d->clear(); + d->value.ull = ull; + d->typ = ULongLong; + d->is_null = b; + } + return d->value.ull; +} + +/*! + Returns the variant's value as bool reference. +*/ +bool& QVariant::asBool() +{ + detach(); + if ( d->typ != Bool ) { + bool b = toBool(); + bool nb = isNull(); + d->clear(); + d->value.b = b; + d->typ = Bool; + d->is_null = nb; + } + return d->value.b; +} + +/*! + Returns the variant's value as double reference. +*/ +double& QVariant::asDouble() +{ + detach(); + if ( d->typ != Double ) { + double dbl = toDouble(); + bool b = isNull(); + d->clear(); + d->value.d = dbl; + d->typ = Double; + d->is_null = b; + } + return d->value.d; +} + +#ifndef QT_NO_TEMPLATE_VARIANT +/*! + Returns the variant's value as variant list reference. + + Note that if you want to iterate over the list, you should iterate + over a copy, e.g. + \code + QValueList<QVariant> list = myVariant.asList(); + QValueList<QVariant>::Iterator it = list.begin(); + while( it != list.end() ) { + myProcessing( *it ); + ++it; + } + \endcode +*/ +QValueList<QVariant>& QVariant::asList() +{ + bool b = isNull(); + if ( d->typ != List ) + *this = QVariant( toList() ); + else + detach(); + d->is_null = b; + return *((QValueList<QVariant>*)d->value.ptr); +} + +/*! + Returns the variant's value as variant map reference. + + Note that if you want to iterate over the map, you should iterate + over a copy, e.g. + \code + QMap<QString, QVariant> map = myVariant.asMap(); + QMap<QString, QVariant>::Iterator it = map.begin(); + while( it != map.end() ) { + myProcessing( *it ); + ++it; + } + \endcode +*/ +QMap<QString, QVariant>& QVariant::asMap() +{ + bool b = isNull(); + if ( d->typ != Map ) + *this = QVariant( toMap() ); + else + detach(); + d->is_null = b; + return *((QMap<QString,QVariant>*)d->value.ptr); +} +#endif + +/*! + Returns TRUE if the variant's type can be cast to the requested + type, \a t. Such casting is done automatically when calling the + toInt(), toBool(), ... or asInt(), asBool(), ... methods. + + The following casts are done automatically: + \table + \header \i Type \i Automatically Cast To + \row \i Bool \i Double, Int, UInt, LongLong, ULongLong, String, CString, ByteArray + \row \i Color \i String. CString. ByteArray + \row \i Date \i String, CString, ByteArray, DateTime + \row \i DateTime \i String, CString, ByteArray, Date, Time + \row \i Double \i String, CString, ByteArray, Int, Bool, UInt, LongLong, ULongLong + \row \i Font \i String, CString, ByteArray + \row \i Int \i String, CString, ByteArray, Double, Bool, UInt, LongLong, ULongLong, KeySequence + \row \i LongLong \i String, CString, ByteArray, Double, Bool, UInt, LongLong, ULongLong, KeySequence + \row \i ULongLong \i String, CString, ByteArray, Double, Bool, UInt, LongLong, ULongLong, KeySequence + \row \i List \i StringList (if the list contains only strings or + something that can be cast to a string) + \row \i String \i CString, ByteArray, CString, Int, UInt, Bool, Double, Date, + Time, DateTime, KeySequence, Font, Color + \row \i CString \i String, ByteArray, Int, UInt, Bool, Double, Date, ULongLong, LongLong + \row \i ByteArray \i String, CString, Int, UInt, Bool, Double, Date, ULongLong, LongLong + \row \i StringList \i List + \row \i Time \i String + \row \i Int \i String, CString, ByteArray, Double, Bool, UInt, LongLong, ULongLong, KeySequence + \row \i KeySequence \i String, CString, ByteArray, Int, UInt, LongLong, ULongLong + \endtable +*/ +bool QVariant::canCast( Type t ) const +{ + if ( Type( d->typ ) == t ) + return TRUE; + + switch ( t ) { + case Bool: + case Double: + if (d->typ == KeySequence) + break; + case Int: + case UInt: + case LongLong: + case ULongLong: + switch(d->typ) { + case Bool: + case ByteArray: + case CString: + case Double: + case Int: + case KeySequence: + case LongLong: + case String: + case UInt: + case ULongLong: + return TRUE; + default: break; + } + break; + + case CString: + case ByteArray: + case String: + switch(d->typ) { + case Bool: + case ByteArray: + case CString: + case Color: + case Date: + case DateTime: + case Double: + case Font: + case Int: + case KeySequence: + case LongLong: + case String: + case Time: + case UInt: + case ULongLong: + return TRUE; + default: break; + } + break; + + case Time: + if (d->typ == Date) + break; + case Date: + case DateTime: + switch(d->typ) { + case ByteArray: + case CString: + case Date: + case DateTime: + case String: + return TRUE; + default: break; + } + break; + + case KeySequence: + switch(d->typ) { + case ByteArray: + case CString: + case Int: + case UInt: + case LongLong: + case ULongLong: + case Double: + case String: + return TRUE; + default: break; + } + break; + + case Font: + case Color: + switch(d->typ) { + case ByteArray: + case CString: + case String: + return TRUE; + default: break; + } + break; + +#ifndef QT_NO_STRINGLIST + case List: + return d->typ == StringList; +#endif +#ifndef QT_NO_TEMPLATE_VARIANT + case StringList: + if ( d->typ == List ) { + QValueList<QVariant>::ConstIterator it = listBegin(); + QValueList<QVariant>::ConstIterator end = listEnd(); + for( ; it != end; ++it ) { + if ( !(*it).canCast( String ) ) + return FALSE; + } + return TRUE; + } +#endif + case Invalid: + case Map: + case Pixmap: + case Brush: + case Rect: + case Size: + case Palette: + case ColorGroup: + case IconSet: + case Point: + case Image: + case PointArray: + case Region: + case Bitmap: + case Cursor: + case SizePolicy: + case BitArray: + case Pen: + break; + } + return FALSE; +} + +/*! + Casts the variant to the requested type. If the cast cannot be + done, the variant is set to the default value of the requested + type (e.g. an empty string if the requested type \a t is + QVariant::String, an empty point array if the requested type \a t + is QVariant::PointArray, etc). Returns TRUE if the current type of + the variant was successfully cast; otherwise returns FALSE. + + \sa canCast() +*/ + +bool QVariant::cast( Type t ) +{ + switch ( t ) { +#ifndef QT_NO_TEMPLATE_VARIANT + case QVariant::Map: + asMap(); + break; + case QVariant::List: + asList(); + break; +#endif + case QVariant::String: + asString(); + break; +#ifndef QT_NO_STRINGLIST + case QVariant::StringList: + asStringList(); + break; +#endif + case QVariant::Font: + asFont(); + break; + case QVariant::Pixmap: + asPixmap(); + break; + case QVariant::Brush: + asBrush(); + break; + case QVariant::Rect: + asRect(); + break; + case QVariant::Size: + asSize(); + break; + case QVariant::Color: + asColor(); + break; +#ifndef QT_NO_PALETTE + case QVariant::Palette: + asPalette(); + break; + case QVariant::ColorGroup: + asColorGroup(); + break; +#endif +#ifndef QT_NO_ICONSET + case QVariant::IconSet: + asIconSet(); + break; +#endif + case QVariant::Point: + asPoint(); + break; + case QVariant::Image: + asImage(); + break; + case QVariant::Int: + asInt(); + break; + case QVariant::UInt: + asUInt(); + break; + case QVariant::Bool: + asBool(); + break; + case QVariant::Double: + asDouble(); + break; + case QVariant::CString: + asCString(); + break; + case QVariant::PointArray: + asPointArray(); + break; + case QVariant::Region: + asRegion(); + break; + case QVariant::Bitmap: + asBitmap(); + break; + case QVariant::Cursor: + asCursor(); + break; + case QVariant::SizePolicy: + asSizePolicy(); + break; + case QVariant::Date: + asDate(); + break; + case QVariant::Time: + asTime(); + break; + case QVariant::DateTime: + asDateTime(); + break; + case QVariant::ByteArray: + asByteArray(); + break; + case QVariant::BitArray: + asBitArray(); + break; +#ifndef QT_NO_ACCEL + case QVariant::KeySequence: + asKeySequence(); + break; +#endif + case QVariant::Pen: + asPen(); + break; + case QVariant::LongLong: + asLongLong(); + break; + case QVariant::ULongLong: + asULongLong(); + break; + default: + case QVariant::Invalid: + (*this) = QVariant(); + } + return canCast( t ); +} + +/*! + Compares this QVariant with \a v and returns TRUE if they are + equal; otherwise returns FALSE. +*/ + +bool QVariant::operator==( const QVariant &v ) const +{ + if (isNumeric(v.type()) && canCast(v.type())) { + bool ok; + switch(v.type()) { + case Bool: + return toBool() == v.toBool(); + case Int: + { + int val = toInt(&ok); + return (ok && val == v.toInt()); + } + case UInt: + { + uint val = toUInt(&ok); + return (ok && val == v.toUInt()); + } + + case Double: + { + double val = toDouble(&ok); + return (ok && val == v.toDouble()); + } + + case LongLong: + { + Q_LLONG val = toLongLong(&ok); + return (ok && val == v.toLongLong()); + } + + case ULongLong: + { + Q_ULLONG val = toULongLong(&ok); + return (ok && val == v.toULongLong()); + } + + default: + Q_ASSERT(FALSE); + } + } + + if (!v.canCast(d->typ)) { + return FALSE; + } + + switch( d->typ ) { + case Cursor: +#ifndef QT_NO_CURSOR + return v.toCursor().shape() == toCursor().shape(); +#endif + case Bitmap: + return v.toBitmap().serialNumber() == toBitmap().serialNumber(); + case PointArray: + return v.toPointArray() == toPointArray(); + case Region: + return v.toRegion() == toRegion(); +#ifndef QT_NO_TEMPLATE_VARIANT + case List: + return v.toList() == toList(); + case Map: { + if ( v.toMap().count() != toMap().count() ) + return FALSE; + QMap<QString, QVariant>::ConstIterator it = v.toMap().begin(); + QMap<QString, QVariant>::ConstIterator it2 = toMap().begin(); + while ( it != v.toMap().end() ) { + if ( *it != *it2 ) + return FALSE; + ++it; + ++it2; + } + return TRUE; + } +#endif + case String: + return v.toString() == toString(); + case CString: + return v.toCString() == toCString(); +#ifndef QT_NO_STRINGLIST + case StringList: + return v.toStringList() == toStringList(); +#endif + case Font: + return v.toFont() == toFont(); + case Pixmap: + return v.toPixmap().serialNumber() == toPixmap().serialNumber(); + case Image: + return v.toImage() == toImage(); + case Brush: + return v.toBrush() == toBrush(); + case Point: + return v.toPoint() == toPoint(); + case Rect: + return v.toRect() == toRect(); + case Size: + return v.toSize() == toSize(); + case Color: + return v.toColor() == toColor(); +#ifndef QT_NO_PALETTE + case Palette: + return v.toPalette() == toPalette(); + case ColorGroup: + return v.toColorGroup() == toColorGroup(); +#endif +#ifndef QT_NO_ICONSET + case IconSet: + return v.toIconSet().pixmap().serialNumber() + == toIconSet().pixmap().serialNumber(); +#endif + case Int: + return v.toInt() == toInt(); + case UInt: + return v.toUInt() == toUInt(); + case LongLong: + return v.toLongLong() == toLongLong(); + case ULongLong: + return v.toULongLong() == toULongLong(); + case Bool: + return v.toBool() == toBool(); + case Double: + return v.toDouble() == toDouble(); + case SizePolicy: + return v.toSizePolicy() == toSizePolicy(); + case Date: + return v.toDate() == toDate(); + case Time: + return v.toTime() == toTime(); + case DateTime: + return v.toDateTime() == toDateTime(); + case ByteArray: + return v.toByteArray() == toByteArray(); + case BitArray: + return v.toBitArray() == toBitArray(); +#ifndef QT_NO_ACCEL + case KeySequence: + return v.toKeySequence() == toKeySequence(); +#endif + case Pen: + return v.toPen() == toPen(); + case Invalid: + break; + } + return FALSE; +} + +/*! + Compares this QVariant with \a v and returns TRUE if they are not + equal; otherwise returns FALSE. +*/ + +bool QVariant::operator!=( const QVariant &v ) const +{ + return !( v == *this ); +} + + +/*! \internal + + Reads or sets the variant type and ptr + */ +void* QVariant::rawAccess( void* ptr, Type typ, bool deepCopy ) +{ + if ( ptr ) { + clear(); + d->typ = typ; + d->value.ptr = ptr; + d->is_null = FALSE; + if ( deepCopy ) { + QVariant::Private* p = new Private( d ); + d->typ = Invalid; + delete d; + d = p; + } + } + + if ( !deepCopy ) + return d->value.ptr; + QVariant::Private* p = new Private( d ); + void *ret = (void*)p->value.ptr; + p->typ = Invalid; + delete p; + return ret; +} + +/*! + Returns TRUE if this is a NULL variant, FALSE otherwise. +*/ +bool QVariant::isNull() const +{ + switch( d->typ ) + { + case QVariant::Bitmap: + return ((QBitmap*) d->value.ptr)->isNull(); + case QVariant::Region: + return ((QRegion*) d->value.ptr)->isNull(); + case QVariant::PointArray: + return ((QPointArray*) d->value.ptr)->isNull(); + case QVariant::String: + return ((QString*) d->value.ptr)->isNull(); + case QVariant::CString: + return ((QCString*) d->value.ptr)->isNull(); + case QVariant::Pixmap: + return ((QPixmap*) d->value.ptr)->isNull(); + case QVariant::Image: + return ((QImage*) d->value.ptr)->isNull(); + case QVariant::Point: + return ((QPoint*) d->value.ptr)->isNull(); + case QVariant::Rect: + return ((QRect*) d->value.ptr)->isNull(); + case QVariant::Size: + return ((QSize*) d->value.ptr)->isNull(); +#ifndef QT_NO_ICONSET + case QVariant::IconSet: + return ((QIconSet*) d->value.ptr)->isNull(); +#endif + case QVariant::Date: + return ((QDate*) d->value.ptr)->isNull(); + case QVariant::Time: + return ((QTime*) d->value.ptr)->isNull(); + case QVariant::DateTime: + return ((QDateTime*) d->value.ptr)->isNull(); + case QVariant::ByteArray: + return ((QByteArray*) d->value.ptr)->isNull(); + case QVariant::BitArray: + return ((QBitArray*) d->value.ptr)->isNull(); + case QVariant::Cursor: +#ifndef QT_NO_STRINGLIST + case QVariant::StringList: +#endif //QT_NO_STRINGLIST + case QVariant::Font: + case QVariant::Brush: + case QVariant::Color: +#ifndef QT_NO_PALETTE + case QVariant::Palette: + case QVariant::ColorGroup: +#endif +#ifndef QT_NO_TEMPLATE_VARIANT + case QVariant::Map: + case QVariant::List: +#endif + case QVariant::SizePolicy: +#ifndef QT_NO_ACCEL + case QVariant::KeySequence: +#endif + case QVariant::Pen: + case QVariant::Invalid: + case QVariant::Int: + case QVariant::UInt: + case QVariant::LongLong: + case QVariant::ULongLong: + case QVariant::Bool: + case QVariant::Double: + break; + } + return d->is_null; +} +#endif //QT_NO_VARIANT |