qvariant.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:17k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtCore module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QVARIANT_H
  38. #define QVARIANT_H
  39. #include <QtCore/qatomic.h>
  40. #include <QtCore/qbytearray.h>
  41. #include <QtCore/qlist.h>
  42. #include <QtCore/qmetatype.h>
  43. #include <QtCore/qmap.h>
  44. #include <QtCore/qstring.h>
  45. QT_BEGIN_HEADER
  46. QT_BEGIN_NAMESPACE
  47. QT_MODULE(Core)
  48. class QBitArray;
  49. class QDataStream;
  50. class QDate;
  51. class QDateTime;
  52. class QLine;
  53. class QLineF;
  54. class QLocale;
  55. class QMatrix;
  56. class QTransform;
  57. class QStringList;
  58. class QTime;
  59. class QPoint;
  60. class QPointF;
  61. class QSize;
  62. class QSizeF;
  63. class QRect;
  64. class QRectF;
  65. #ifndef QT_NO_REGEXP
  66. class QRegExp;
  67. #endif
  68. class QTextFormat;
  69. class QTextLength;
  70. class QUrl;
  71. class QVariant;
  72. class QVariantComparisonHelper;
  73. #ifndef QT_NO_MEMBER_TEMPLATES
  74. template <typename T>
  75. inline QVariant qVariantFromValue(const T &);
  76. template <typename T>
  77. inline void qVariantSetValue(QVariant &, const T &);
  78. template<typename T>
  79. inline T qVariantValue(const QVariant &);
  80. template<typename T>
  81. inline bool qVariantCanConvert(const QVariant &);
  82. #endif
  83. class Q_CORE_EXPORT QVariant
  84. {
  85.  public:
  86.     enum Type {
  87.         Invalid = 0,
  88.         Bool = 1,
  89.         Int = 2,
  90.         UInt = 3,
  91.         LongLong = 4,
  92.         ULongLong = 5,
  93.         Double = 6,
  94.         Char = 7,
  95.         Map = 8,
  96.         List = 9,
  97.         String = 10,
  98.         StringList = 11,
  99.         ByteArray = 12,
  100.         BitArray = 13,
  101.         Date = 14,
  102.         Time = 15,
  103.         DateTime = 16,
  104.         Url = 17,
  105.         Locale = 18,
  106.         Rect = 19,
  107.         RectF = 20,
  108.         Size = 21,
  109.         SizeF = 22,
  110.         Line = 23,
  111.         LineF = 24,
  112.         Point = 25,
  113.         PointF = 26,
  114. RegExp = 27,
  115.         LastCoreType = RegExp,
  116.         // value 62 is internally reserved
  117. #ifdef QT3_SUPPORT
  118.         ColorGroup = 63,
  119. #endif
  120.         Font = 64,
  121.         Pixmap = 65,
  122.         Brush = 66,
  123.         Color = 67,
  124.         Palette = 68,
  125.         Icon = 69,
  126.         Image = 70,
  127.         Polygon = 71,
  128.         Region = 72,
  129.         Bitmap = 73,
  130.         Cursor = 74,
  131.         SizePolicy = 75,
  132.         KeySequence = 76,
  133.         Pen = 77,
  134.         TextLength = 78,
  135.         TextFormat = 79,
  136.         Matrix = 80,
  137.         Transform = 81,
  138.         LastGuiType = Transform,
  139.         UserType = 127,
  140. #ifdef QT3_SUPPORT
  141.         IconSet = Icon,
  142.         CString = ByteArray,
  143.         PointArray = Polygon,
  144. #endif
  145.         LastType = 0xffffffff // need this so that gcc >= 3.4 allocates 32 bits for Type
  146.     };
  147.     inline QVariant();
  148.     ~QVariant();
  149.     QVariant(Type type);
  150.     QVariant(int typeOrUserType, const void *copy);
  151.     QVariant(const QVariant &other);
  152. #ifndef QT_NO_DATASTREAM
  153.     QVariant(QDataStream &s);
  154. #endif
  155.     QVariant(int i);
  156.     QVariant(uint ui);
  157.     QVariant(qlonglong ll);
  158.     QVariant(qulonglong ull);
  159.     QVariant(bool b);
  160.     QVariant(double d);
  161. #ifndef QT_NO_CAST_FROM_ASCII
  162.     QT_ASCII_CAST_WARN_CONSTRUCTOR QVariant(const char *str);
  163. #endif
  164.     QVariant(const QByteArray &bytearray);
  165.     QVariant(const QBitArray &bitarray);
  166.     QVariant(const QString &string);
  167.     QVariant(const QLatin1String &string);
  168.     QVariant(const QStringList &stringlist);
  169.     QVariant(const QChar &qchar);
  170.     QVariant(const QDate &date);
  171.     QVariant(const QTime &time);
  172.     QVariant(const QDateTime &datetime);
  173.     QVariant(const QList<QVariant> &list);
  174.     QVariant(const QMap<QString,QVariant> &map);
  175. #ifndef QT_NO_GEOM_VARIANT
  176.     QVariant(const QSize &size);
  177.     QVariant(const QSizeF &size);
  178.     QVariant(const QPoint &pt);
  179.     QVariant(const QPointF &pt);
  180.     QVariant(const QLine &line);
  181.     QVariant(const QLineF &line);
  182.     QVariant(const QRect &rect);
  183.     QVariant(const QRectF &rect);
  184. #endif
  185.     QVariant(const QUrl &url);
  186.     QVariant(const QLocale &locale);
  187. #ifndef QT_NO_REGEXP
  188.     QVariant(const QRegExp &regExp);
  189. #endif
  190.     QVariant(Qt::GlobalColor color);
  191.     QVariant& operator=(const QVariant &other);
  192.     Type type() const;
  193.     int userType() const;
  194.     const char *typeName() const;
  195.     bool canConvert(Type t) const;
  196.     bool convert(Type t);
  197. #ifdef QT3_SUPPORT
  198.     inline QT3_SUPPORT bool canCast(Type t) const
  199.     { return canConvert(t); }
  200.     inline QT3_SUPPORT bool cast(Type t)
  201.     { return convert(t); }
  202. #endif
  203.     inline bool isValid() const;
  204.     bool isNull() const;
  205.     void clear();
  206.     void detach();
  207.     inline bool isDetached() const;
  208.     int toInt(bool *ok = 0) const;
  209.     uint toUInt(bool *ok = 0) const;
  210.     qlonglong toLongLong(bool *ok = 0) const;
  211.     qulonglong toULongLong(bool *ok = 0) const;
  212.     bool toBool() const;
  213.     double toDouble(bool *ok = 0) const;
  214.     QByteArray toByteArray() const;
  215.     QBitArray toBitArray() const;
  216.     QString toString() const;
  217.     QStringList toStringList() const;
  218.     QChar toChar() const;
  219.     QDate toDate() const;
  220.     QTime toTime() const;
  221.     QDateTime toDateTime() const;
  222.     QList<QVariant> toList() const;
  223.     QMap<QString, QVariant> toMap() const;
  224. #ifndef QT_NO_GEOM_VARIANT
  225.     QPoint toPoint() const;
  226.     QPointF toPointF() const;
  227.     QRect toRect() const;
  228.     QSize toSize() const;
  229.     QSizeF toSizeF() const;
  230.     QLine toLine() const;
  231.     QLineF toLineF() const;
  232.     QRectF toRectF() const;
  233. #endif
  234.     QUrl toUrl() const;
  235.     QLocale toLocale() const;
  236. #ifndef QT_NO_REGEXP
  237.     QRegExp toRegExp() const;
  238. #endif
  239. #ifdef QT3_SUPPORT
  240.     inline QT3_SUPPORT int &asInt();
  241.     inline QT3_SUPPORT uint &asUInt();
  242.     inline QT3_SUPPORT qlonglong &asLongLong();
  243.     inline QT3_SUPPORT qulonglong &asULongLong();
  244.     inline QT3_SUPPORT bool &asBool();
  245.     inline QT3_SUPPORT double &asDouble();
  246.     inline QT3_SUPPORT QByteArray &asByteArray();
  247.     inline QT3_SUPPORT QBitArray &asBitArray();
  248.     inline QT3_SUPPORT QString &asString();
  249.     inline QT3_SUPPORT QStringList &asStringList();
  250.     inline QT3_SUPPORT QDate &asDate();
  251.     inline QT3_SUPPORT QTime &asTime();
  252.     inline QT3_SUPPORT QDateTime &asDateTime();
  253.     inline QT3_SUPPORT QList<QVariant> &asList();
  254.     inline QT3_SUPPORT QMap<QString,QVariant> &asMap();
  255.     inline QT3_SUPPORT QPoint &asPoint();
  256.     inline QT3_SUPPORT QRect &asRect();
  257.     inline QT3_SUPPORT QSize &asSize();
  258. #endif //QT3_SUPPORT
  259. #ifndef QT_NO_DATASTREAM
  260.     void load(QDataStream &ds);
  261.     void save(QDataStream &ds) const;
  262. #endif
  263.     static const char *typeToName(Type type);
  264.     static Type nameToType(const char *name);
  265. #ifdef QT3_SUPPORT
  266.     inline QT3_SUPPORT_CONSTRUCTOR QVariant(bool val, int) { create(Bool, &val); }
  267.     inline QT3_SUPPORT const QByteArray toCString() const { return toByteArray(); }
  268.     inline QT3_SUPPORT QByteArray &asCString() { return *reinterpret_cast<QByteArray *>(castOrDetach(ByteArray)); }
  269. #endif
  270.     void *data();
  271.     const void *constData() const;
  272.     inline const void *data() const { return constData(); }
  273. #ifndef QT_NO_MEMBER_TEMPLATES
  274.     template<typename T>
  275.     inline void setValue(const T &value);
  276.     template<typename T>
  277.     inline T value() const
  278.     { return qVariantValue<T>(*this); }
  279.     template<typename T>
  280.     static inline QVariant fromValue(const T &value)
  281.     { return qVariantFromValue(value); }
  282.     template<typename T>
  283.     bool canConvert() const
  284.     { return qVariantCanConvert<T>(*this); }
  285. #endif
  286.  public:
  287. #ifndef qdoc
  288.     struct PrivateShared
  289.     {
  290.         inline PrivateShared() : ref(1) { }
  291.         inline PrivateShared(void *v) : ptr(v), ref(1) { }
  292.         void *ptr;
  293.         QAtomicInt ref;
  294.     };
  295.     struct Private
  296.     {
  297.         inline Private(): type(Invalid), is_shared(false), is_null(true) { data.ptr = 0; }
  298.         inline Private(const Private &other)
  299.             : data(other.data), type(other.type),
  300.               is_shared(other.is_shared), is_null(other.is_null)
  301.         {}
  302.         union Data
  303.         {
  304.             char c;
  305.             int i;
  306.             uint u;
  307.             bool b;
  308.             double d;
  309.             qlonglong ll;
  310.             qulonglong ull;
  311.             void *ptr;
  312.             PrivateShared *shared;
  313.         } data;
  314.         uint type : 30;
  315.         uint is_shared : 1;
  316.         uint is_null : 1;
  317.     };
  318.  public:
  319.     typedef void (*f_construct)(Private *, const void *);
  320.     typedef void (*f_clear)(Private *);
  321.     typedef bool (*f_null)(const Private *);
  322. #ifndef QT_NO_DATASTREAM
  323.     typedef void (*f_load)(Private *, QDataStream &);
  324.     typedef void (*f_save)(const Private *, QDataStream &);
  325. #endif
  326.     typedef bool (*f_compare)(const Private *, const Private *);
  327.     typedef bool (*f_convert)(const QVariant::Private *d, Type t, void *, bool *);
  328.     typedef bool (*f_canConvert)(const QVariant::Private *d, Type t);
  329.     typedef void (*f_debugStream)(QDebug, const QVariant &);
  330.     struct Handler {
  331.         f_construct construct;
  332.         f_clear clear;
  333.         f_null isNull;
  334. #ifndef QT_NO_DATASTREAM
  335.         f_load load;
  336.         f_save save;
  337. #endif
  338.         f_compare compare;
  339.         f_convert convert;
  340.         f_canConvert canConvert;
  341.         f_debugStream debugStream;
  342.     };
  343. #endif
  344.     inline bool operator==(const QVariant &v) const
  345.     { return cmp(v); }
  346.     inline bool operator!=(const QVariant &v) const
  347.     { return !cmp(v); }
  348. protected:
  349.     friend inline bool qvariant_cast_helper(const QVariant &, QVariant::Type, void *);
  350.     friend int qRegisterGuiVariant();
  351.     friend int qUnregisterGuiVariant();
  352.     friend inline bool operator==(const QVariant &, const QVariantComparisonHelper &);
  353. #ifndef QT_NO_DEBUG_STREAM
  354.     friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QVariant &);
  355. #endif
  356.     Private d;
  357.     static const Handler *handler;
  358.     void create(int type, const void *copy);
  359. #ifdef QT3_SUPPORT
  360.     void *castOrDetach(Type t);
  361. #endif
  362.     bool cmp(const QVariant &other) const;
  363. private:
  364. #ifdef QT_NO_CAST_FROM_ASCII
  365.     // force compile error when implicit conversion is not wanted
  366.     inline QVariant(const char *) { Q_ASSERT(false); }
  367. #endif
  368. #ifndef QT3_SUPPORT
  369.     // force compile error, prevent QVariant(QVariant::Type, int) to be called
  370.     inline QVariant(bool, int) { Q_ASSERT(false); }
  371. #endif
  372. public:
  373.     typedef Private DataPtr;
  374.     inline DataPtr &data_ptr() { return d; }
  375. };
  376. typedef QList<QVariant> QVariantList;
  377. typedef QMap<QString, QVariant> QVariantMap;
  378. inline bool qvariant_cast_helper(const QVariant &v, QVariant::Type tp, void *ptr)
  379. { return QVariant::handler->convert(&v.d, tp, ptr, 0); }
  380. template <typename T>
  381. inline QVariant qVariantFromValue(const T &t)
  382. {
  383.     return QVariant(qMetaTypeId<T>(reinterpret_cast<T *>(0)), &t);
  384. }
  385. template <>
  386. inline QVariant qVariantFromValue(const QVariant &t) { return t; }
  387. template <typename T>
  388. inline void qVariantSetValue(QVariant &v, const T &t)
  389. {
  390.     v = QVariant(qMetaTypeId<T>(reinterpret_cast<T *>(0)), &t);
  391. }
  392. inline QVariant::QVariant() {}
  393. inline bool QVariant::isValid() const { return d.type != Invalid; }
  394. #ifdef QT3_SUPPORT
  395. inline int &QVariant::asInt()
  396. { return *reinterpret_cast<int *>(castOrDetach(Int)); }
  397. inline uint &QVariant::asUInt()
  398. { return *reinterpret_cast<uint *>(castOrDetach(UInt)); }
  399. inline qlonglong &QVariant::asLongLong()
  400. { return *reinterpret_cast<qlonglong *>(castOrDetach(LongLong)); }
  401. inline qulonglong &QVariant::asULongLong()
  402. { return *reinterpret_cast<qulonglong *>(castOrDetach(ULongLong)); }
  403. inline bool &QVariant::asBool()
  404. { return *reinterpret_cast<bool *>(castOrDetach(Bool)); }
  405. inline double &QVariant::asDouble()
  406. { return *reinterpret_cast<double *>(castOrDetach(Double)); }
  407. inline QByteArray& QVariant::asByteArray()
  408. { return *reinterpret_cast<QByteArray *>(castOrDetach(ByteArray)); }
  409. inline QBitArray& QVariant::asBitArray()
  410. { return *reinterpret_cast<QBitArray *>(castOrDetach(BitArray)); }
  411. inline QString& QVariant::asString()
  412. { return *reinterpret_cast<QString *>(castOrDetach(String)); }
  413. inline QStringList& QVariant::asStringList()
  414. { return *reinterpret_cast<QStringList *>(castOrDetach(StringList)); }
  415. inline QDate& QVariant::asDate()
  416. { return *reinterpret_cast<QDate *>(castOrDetach(Date)); }
  417. inline QTime& QVariant::asTime()
  418. { return *reinterpret_cast<QTime *>(castOrDetach(Time)); }
  419. inline QDateTime& QVariant::asDateTime()
  420. { return *reinterpret_cast<QDateTime *>(castOrDetach(DateTime)); }
  421. inline QList<QVariant>& QVariant::asList()
  422. { return *reinterpret_cast<QList<QVariant> *>(castOrDetach(List)); }
  423. inline QMap<QString, QVariant>& QVariant::asMap()
  424. { return *reinterpret_cast<QMap<QString, QVariant> *>(castOrDetach(Map)); }
  425. inline QPoint &QVariant::asPoint()
  426. { return *reinterpret_cast<QPoint *>(castOrDetach(Point)); }
  427. inline QRect &QVariant::asRect()
  428. { return *reinterpret_cast<QRect *>(castOrDetach(Rect)); }
  429. inline QSize &QVariant::asSize()
  430. { return *reinterpret_cast<QSize *>(castOrDetach(Size)); }
  431. #endif //QT3_SUPPORT
  432. #ifndef QT_NO_MEMBER_TEMPLATES
  433. template<typename T>
  434. inline void QVariant::setValue(const T &avalue)
  435. { qVariantSetValue(*this, avalue); }
  436. #endif
  437. #ifndef QT_NO_DATASTREAM
  438. Q_CORE_EXPORT QDataStream& operator>> (QDataStream& s, QVariant& p);
  439. Q_CORE_EXPORT QDataStream& operator<< (QDataStream& s, const QVariant& p);
  440. Q_CORE_EXPORT QDataStream& operator>> (QDataStream& s, QVariant::Type& p);
  441. Q_CORE_EXPORT QDataStream& operator<< (QDataStream& s, const QVariant::Type p);
  442. #endif
  443. inline bool QVariant::isDetached() const
  444. { return !d.is_shared || d.data.shared->ref == 1; }
  445. #ifdef qdoc
  446.     inline bool operator==(const QVariant &v1, const QVariant &v2);
  447.     inline bool operator!=(const QVariant &v1, const QVariant &v2);
  448. #else
  449. /* Helper class to add one more level of indirection to prevent
  450.    implicit casts.
  451. */
  452. class QVariantComparisonHelper
  453. {
  454. public:
  455.     inline QVariantComparisonHelper(const QVariant &var)
  456.         : v(&var) {}
  457. private:
  458.     friend inline bool operator==(const QVariant &, const QVariantComparisonHelper &);
  459.     const QVariant *v;
  460. };
  461. inline bool operator==(const QVariant &v1, const QVariantComparisonHelper &v2)
  462. {
  463.     return v1.cmp(*v2.v);
  464. }
  465. inline bool operator!=(const QVariant &v1, const QVariantComparisonHelper &v2)
  466. {
  467.     return !operator==(v1, v2);
  468. }
  469. #endif
  470. #ifndef QT_MOC
  471. #if !defined qdoc && defined Q_CC_MSVC && _MSC_VER < 1300
  472. template<typename T> T qvariant_cast(const QVariant &v, T * = 0)
  473. {
  474.     const int vid = qMetaTypeId<T>(static_cast<T *>(0));
  475.     if (vid == v.userType())
  476.         return *reinterpret_cast<const T *>(v.constData());
  477.     if (vid < int(QMetaType::User)) {
  478.         T t;
  479.         if (qvariant_cast_helper(v, QVariant::Type(vid), &t))
  480.             return t;
  481.     }
  482.     return T();
  483. }
  484. template<typename T>
  485. inline T qVariantValue(const QVariant &variant, T *t = 0)
  486. { return qvariant_cast<T>(variant, t); }
  487. template<typename T>
  488. inline bool qVariantCanConvert(const QVariant &variant, T *t = 0)
  489. {
  490.     return variant.canConvert(static_cast<QVariant::Type>(qMetaTypeId<T>(t)));
  491. }
  492. #else
  493. template<typename T> T qvariant_cast(const QVariant &v)
  494. {
  495.     const int vid = qMetaTypeId<T>(static_cast<T *>(0));
  496.     if (vid == v.userType())
  497.         return *reinterpret_cast<const T *>(v.constData());
  498.     if (vid < int(QMetaType::User)) {
  499.         T t;
  500.         if (qvariant_cast_helper(v, QVariant::Type(vid), &t))
  501.             return t;
  502.     }
  503.     return T();
  504. }
  505. template<typename T>
  506. inline T qVariantValue(const QVariant &variant)
  507. { return qvariant_cast<T>(variant); }
  508. template<typename T>
  509. inline bool qVariantCanConvert(const QVariant &variant)
  510. {
  511.     return variant.canConvert(static_cast<QVariant::Type>(
  512.                 qMetaTypeId<T>(static_cast<T *>(0))));
  513. }
  514. #endif
  515. #endif
  516. Q_DECLARE_SHARED(QVariant)
  517. Q_DECLARE_TYPEINFO(QVariant, Q_MOVABLE_TYPE);
  518. #ifndef QT_NO_DEBUG_STREAM
  519. Q_CORE_EXPORT QDebug operator<<(QDebug, const QVariant &);
  520. Q_CORE_EXPORT QDebug operator<<(QDebug, const QVariant::Type);
  521. #endif
  522. QT_END_NAMESPACE
  523. Q_DECLARE_BUILTIN_METATYPE(QVariantList, QVariantList)
  524. Q_DECLARE_BUILTIN_METATYPE(QVariantMap, QVariantMap)
  525. QT_END_HEADER
  526. #endif // QVARIANT_H