📄 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 //DBL_DIGstatic 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)); Q_ASSERT_X(x->data.shared->ptr, "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;}#ifndef QT_NO_DATASTREAMstatic void load(QVariant::Private *d, QDataStream &s){ switch (d->type) { case QVariant::Invalid: { // Since we wrote something, we should read something QString x; s >> x; d->is_null = true; break; } case QVariant::Map: s >> *v_cast<QVariantMap>(d); break; case QVariant::List: s >> *v_cast<QVariantList>(d); break; case QVariant::String: s >> *v_cast<QString>(d); break; case QVariant::Char: s >> *v_cast<QChar>(d); break; case QVariant::StringList: s >> *v_cast<QStringList>(d); break;#ifndef QT_NO_GEOM_VARIANT case QVariant::Size: s >> *v_cast<QSize>(d); break; case QVariant::SizeF: s >> *v_cast<QSizeF>(d); break; case QVariant::Rect: s >> *v_cast<QRect>(d); break; case QVariant::Line: s >> *v_cast<QLine>(d); break; case QVariant::LineF: s >> *v_cast<QLineF>(d); break; case QVariant::RectF: s >> *v_cast<QRectF>(d); break; case QVariant::Point: s >> *v_cast<QPoint>(d); break; case QVariant::PointF: s >> *v_cast<QPointF>(d); break;#endif case QVariant::Url: s >> *v_cast<QUrl>(d); break; case QVariant::Locale: s >> *v_cast<QLocale>(d); break; case QVariant::RegExp: s >> *v_cast<QRegExp>(d); break; case QVariant::Int: s >> d->data.i; break; case QVariant::UInt: s >> d->data.u; break; case QVariant::LongLong: s >> d->data.ll; break; case QVariant::ULongLong: s >> d->data.ull; break; case QVariant::Bool: { qint8 x; s >> x; d->data.b = x; } break; case QVariant::Double: s >> d->data.d; break; case QVariant::Date: s >> *v_cast<QDate>(d); break; case QVariant::Time: s >> *v_cast<QTime>(d); break; case QVariant::DateTime: s >> *v_cast<QDateTime>(d); break; case QVariant::ByteArray: s >> *v_cast<QByteArray>(d); break; case QVariant::BitArray: s >> *v_cast<QBitArray>(d); break; default: if (QMetaType::isRegistered(d->type)) { if (!QMetaType::load(s, d->type, d->data.shared->ptr)) qFatal("QVariant::load: no streaming operators registered for type %d.", d->type); break; } else { qFatal("QVariant::load: type %d unknown to QVariant.", d->type); } }}static void save(const QVariant::Private *d, QDataStream &s){ switch (d->type) { case QVariant::List: s << *v_cast<QVariantList>(d); break; case QVariant::Map: s << *v_cast<QVariantMap>(d); break; case QVariant::String: s << *v_cast<QString>(d); break; case QVariant::Char: s << *v_cast<QChar>(d); break; case QVariant::StringList: s << *v_cast<QStringList>(d); break;#ifndef QT_NO_GEOM_VARIANT case QVariant::Size: s << *v_cast<QSize>(d); break; case QVariant::SizeF: s << *v_cast<QSizeF>(d); break; case QVariant::Point: s << *v_cast<QPoint>(d); break; case QVariant::PointF: s << *v_cast<QPointF>(d); break; case QVariant::Rect: s << *v_cast<QRect>(d); break; case QVariant::Line: s << *v_cast<QLine>(d); break; case QVariant::LineF: s << *v_cast<QLineF>(d); break; case QVariant::RectF: s << *v_cast<QRectF>(d); break;#endif case QVariant::Url: s << *v_cast<QUrl>(d); break; case QVariant::Locale: s << *v_cast<QLocale>(d); break; case QVariant::RegExp: s << *v_cast<QRegExp>(d); break; case QVariant::Int: s << d->data.i; break; case QVariant::UInt: s << d->data.u; break; case QVariant::LongLong: s << d->data.ll; break; case QVariant::ULongLong: s << d->data.ull; break; case QVariant::Bool: s << (qint8)d->data.b; break; case QVariant::Double: s << d->data.d; break; case QVariant::Date: s << *v_cast<QDate>(d); break; case QVariant::Time: s << *v_cast<QTime>(d); break; case QVariant::DateTime: s << *v_cast<QDateTime>(d); break; case QVariant::ByteArray: s << *v_cast<QByteArray>(d); break; case QVariant::BitArray: s << *v_cast<QBitArray>(d); break; case QVariant::Invalid:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -