?? qvariant.cpp
字號:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the QtCore module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qvariant.h"#include "qbitarray.h"#include "qbytearray.h"#include "qdatastream.h"#include "qdebug.h"#include "qmap.h"#include "qdatetime.h"#include "qlist.h"#include "qstring.h"#include "qstringlist.h"#include "qurl.h"#include "qlocale.h"#include "private/qvariant_p.h"#ifndef QT_NO_GEOM_VARIANT#include "qsize.h"#include "qpoint.h"#include "qrect.h"#include "qline.h"#endif#include <float.h>#ifndef DBL_DIG# define DBL_DIG 10#endif#ifndef FLT_DIG# define FLT_DIG 6#endifstatic const void *constData(const QVariant::Private &d){ switch (d.type) { case QVariant::Int: return &d.data.i; case QVariant::UInt: return &d.data.u; case QVariant::Bool: return &d.data.b; case QVariant::LongLong: return &d.data.ll; case QVariant::ULongLong: return &d.data.ull; case QVariant::Double: return &d.data.d; default: return d.is_shared ? d.data.shared->ptr : reinterpret_cast<const void *>(&d.data.ptr); }}static void construct(QVariant::Private *x, const void *copy){ x->is_shared = false; switch (x->type) { case QVariant::String: v_construct<QString>(x, copy); break; case QVariant::Char: v_construct<QChar>(x, copy); break; case QVariant::StringList: v_construct<QStringList>(x, copy); break; case QVariant::Map: v_construct<QVariantMap>(x, copy); break; case QVariant::List: v_construct<QVariantList>(x, copy); break; case QVariant::Date: v_construct<QDate>(x, copy); break; case QVariant::Time: v_construct<QTime>(x, copy); break; case QVariant::DateTime: v_construct<QDateTime>(x, copy); break; case QVariant::ByteArray: v_construct<QByteArray>(x, copy); break; case QVariant::BitArray: v_construct<QBitArray>(x, copy); break;#ifndef QT_NO_GEOM_VARIANT case QVariant::Size: v_construct<QSize>(x, copy); break; case QVariant::SizeF: v_construct<QSizeF>(x, copy); break; case QVariant::Rect: v_construct<QRect>(x, copy); break; case QVariant::LineF: v_construct<QLineF>(x, copy); break; case QVariant::Line: v_construct<QLine>(x, copy); break; case QVariant::RectF: v_construct<QRectF>(x, copy); break; case QVariant::Point: v_construct<QPoint>(x, copy); break; case QVariant::PointF: v_construct<QPointF>(x, copy); break;#endif case QVariant::Url: v_construct<QUrl>(x, copy); break; case QVariant::Locale: v_construct<QLocale>(x, copy); break; case QVariant::RegExp: v_construct<QRegExp>(x, copy); break; case QVariant::Int: x->data.i = copy ? *static_cast<const int *>(copy) : 0; break; case QVariant::UInt: x->data.u = copy ? *static_cast<const uint *>(copy) : 0u; break; case QVariant::Bool: x->data.b = copy ? *static_cast<const bool *>(copy) : false; break; case QVariant::Double: x->data.d = copy ? *static_cast<const double*>(copy) : 0.0; break; case QVariant::LongLong: x->data.ll = copy ? *static_cast<const qlonglong *>(copy) : Q_INT64_C(0); break; case QVariant::ULongLong: x->data.ull = copy ? *static_cast<const qulonglong *>(copy) : Q_UINT64_C(0); break; case QVariant::Invalid: case QVariant::UserType: break; default: x->is_shared = true; x->data.shared = new QVariant::PrivateShared(QMetaType::construct(x->type, copy)); if (!x->data.shared->ptr) Q_ASSERT_X(x->type > 62, "QVariant::construct()", "Unknown datatype"); break; } x->is_null = !copy;}static void clear(QVariant::Private *d){ switch (d->type) { case QVariant::String: v_clear<QString>(d); break; case QVariant::Char: v_clear<QChar>(d); break; case QVariant::StringList: v_clear<QStringList>(d); break; case QVariant::Map: v_clear<QVariantMap>(d); break; case QVariant::List: v_clear<QVariantList>(d); break; case QVariant::Date: v_clear<QDate>(d); break; case QVariant::Time: v_clear<QTime>(d); break; case QVariant::DateTime: v_clear<QDateTime>(d); break; case QVariant::ByteArray: v_clear<QByteArray>(d); break; case QVariant::BitArray: v_clear<QBitArray>(d); break;#ifndef QT_NO_GEOM_VARIANT case QVariant::Point: v_clear<QPoint>(d); break; case QVariant::PointF: v_clear<QPointF>(d); break; case QVariant::Size: v_clear<QSize>(d); break; case QVariant::SizeF: v_clear<QSizeF>(d); break; case QVariant::Rect: v_clear<QRect>(d); break; case QVariant::LineF: v_clear<QLineF>(d); break; case QVariant::Line: v_clear<QLine>(d); break; case QVariant::RectF: v_clear<QRectF>(d); break;#endif case QVariant::Url: v_clear<QUrl>(d); break; case QVariant::Locale: v_clear<QLocale>(d); break; case QVariant::RegExp: v_clear<QRegExp>(d); break; case QVariant::LongLong: case QVariant::ULongLong: case QVariant::Double: break; case QVariant::Invalid: case QVariant::UserType: case QVariant::Int: case QVariant::UInt: case QVariant::Bool: break; default: QMetaType::destroy(d->type, d->data.shared->ptr); delete d->data.shared; break; } d->type = QVariant::Invalid; d->is_null = true; d->is_shared = false;}static bool isNull(const QVariant::Private *d){ switch(d->type) { case QVariant::String: return v_cast<QString>(d)->isNull(); case QVariant::Char: return v_cast<QChar>(d)->isNull(); case QVariant::Date: return v_cast<QDate>(d)->isNull(); case QVariant::Time: return v_cast<QTime>(d)->isNull(); case QVariant::DateTime: return v_cast<QDateTime>(d)->isNull(); case QVariant::ByteArray: return v_cast<QByteArray>(d)->isNull(); case QVariant::BitArray: return v_cast<QBitArray>(d)->isNull();#ifndef QT_NO_GEOM_VARIANT case QVariant::Size: return v_cast<QSize>(d)->isNull(); case QVariant::SizeF: return v_cast<QSizeF>(d)->isNull(); case QVariant::Rect: return v_cast<QRect>(d)->isNull(); case QVariant::Line: return v_cast<QLine>(d)->isNull(); case QVariant::LineF: return v_cast<QLineF>(d)->isNull(); case QVariant::RectF: return v_cast<QRectF>(d)->isNull(); case QVariant::Point: return v_cast<QPoint>(d)->isNull(); case QVariant::PointF: return v_cast<QPointF>(d)->isNull();#endif case QVariant::Url: case QVariant::Locale: case QVariant::RegExp: case QVariant::StringList: case QVariant::Map: case QVariant::List: case QVariant::Invalid: case QVariant::UserType: case QVariant::Int: case QVariant::UInt: case QVariant::LongLong: case QVariant::ULongLong: case QVariant::Bool: case QVariant::Double: break; } return d->is_null;}static bool compare(const QVariant::Private *a, const QVariant::Private *b){ switch(a->type) { case QVariant::List: return *v_cast<QVariantList>(a) == *v_cast<QVariantList>(b); case QVariant::Map: { const QVariantMap *m1 = v_cast<QVariantMap>(a); const QVariantMap *m2 = v_cast<QVariantMap>(b); if (m1->count() != m2->count()) return false; QVariantMap::ConstIterator it = m1->constBegin(); QVariantMap::ConstIterator it2 = m2->constBegin(); while (it != m1->constEnd()) { if (*it != *it2) return false; ++it; ++it2; } return true; } case QVariant::String: return *v_cast<QString>(a) == *v_cast<QString>(b); case QVariant::Char: return *v_cast<QChar>(a) == *v_cast<QChar>(b); case QVariant::StringList: return *v_cast<QStringList>(a) == *v_cast<QStringList>(b);#ifndef QT_NO_GEOM_VARIANT case QVariant::Size: return *v_cast<QSize>(a) == *v_cast<QSize>(b); case QVariant::SizeF: return *v_cast<QSizeF>(a) == *v_cast<QSizeF>(b); case QVariant::Rect: return *v_cast<QRect>(a) == *v_cast<QRect>(b); case QVariant::Line: return *v_cast<QLine>(a) == *v_cast<QLine>(b); case QVariant::LineF: return *v_cast<QLineF>(a) == *v_cast<QLineF>(b); case QVariant::RectF: return *v_cast<QRectF>(a) == *v_cast<QRectF>(b); case QVariant::Point: return *v_cast<QPoint>(a) == *v_cast<QPoint>(b); case QVariant::PointF: return *v_cast<QPointF>(a) == *v_cast<QPointF>(b);#endif case QVariant::Url: return *v_cast<QUrl>(a) == *v_cast<QUrl>(b); case QVariant::Locale: return *v_cast<QLocale>(a) == *v_cast<QLocale>(b); case QVariant::RegExp: return *v_cast<QRegExp>(a) == *v_cast<QRegExp>(b); case QVariant::Int: return a->data.i == b->data.i; case QVariant::UInt: return a->data.u == b->data.u; case QVariant::LongLong: return a->data.ll == b->data.ll; case QVariant::ULongLong: return a->data.ull == b->data.ull; case QVariant::Bool: return a->data.b == b->data.b; case QVariant::Double: return a->data.d == b->data.d; case QVariant::Date: return *v_cast<QDate>(a) == *v_cast<QDate>(b); case QVariant::Time: return *v_cast<QTime>(a) == *v_cast<QTime>(b); case QVariant::DateTime: return *v_cast<QDateTime>(a) == *v_cast<QDateTime>(b); case QVariant::ByteArray: return *v_cast<QByteArray>(a) == *v_cast<QByteArray>(b); case QVariant::BitArray: return *v_cast<QBitArray>(a) == *v_cast<QBitArray>(b); case QVariant::Invalid: return true; default: break; } if (!QMetaType::isRegistered(a->type)) qFatal("QVariant::compare: type %d unknown to QVariant.", a->type); return a->data.shared->ptr == b->data.shared->ptr;}static qlonglong qMetaTypeNumber(const QVariant::Private *d){ switch (d->type) { case QMetaType::Int: return d->data.i; case QMetaType::LongLong: return d->data.ll; case QMetaType::Char: return qlonglong(*static_cast<signed char *>(d->data.shared->ptr)); case QMetaType::Short: return qlonglong(*static_cast<short *>(d->data.shared->ptr)); case QMetaType::Long: return qlonglong(*static_cast<long *>(d->data.shared->ptr)); case QMetaType::Float: return qRound64(*static_cast<float *>(d->data.shared->ptr)); case QVariant::Double: return qRound64(d->data.d); } Q_ASSERT(false); return 0;}static qulonglong qMetaTypeUNumber(const QVariant::Private *d){ switch (d->type) { case QVariant::UInt: return d->data.u; case QVariant::ULongLong: return d->data.ull; case QMetaType::UChar: return qulonglong(*static_cast<unsigned char *>(d->data.shared->ptr)); case QMetaType::UShort: return qulonglong(*static_cast<ushort *>(d->data.shared->ptr)); case QMetaType::ULong: return qulonglong(*static_cast<ulong *>(d->data.shared->ptr)); } Q_ASSERT(false); return 0;}static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok){ *ok = true; switch (uint(d->type)) { case QVariant::String: return v_cast<QString>(d)->toLongLong(ok); case QVariant::Char: return v_cast<QChar>(d)->unicode(); case QVariant::ByteArray: return v_cast<QByteArray>(d)->toLongLong(ok); case QVariant::Bool: return qlonglong(d->data.b); case QVariant::Double: case QVariant::Int: case QMetaType::Char: case QMetaType::Short: case QMetaType::Long: case QMetaType::Float: case QMetaType::LongLong: return qMetaTypeNumber(d); case QVariant::ULongLong: case QVariant::UInt: case QMetaType::UChar: case QMetaType::UShort: case QMetaType::ULong: return qlonglong(qMetaTypeUNumber(d)); } *ok = false; return Q_INT64_C(0);}static qulonglong qConvertToUnsignedNumber(const QVariant::Private *d, bool *ok)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -