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

系统编程

开发平台:

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 QMETATYPE_H
  38. #define QMETATYPE_H
  39. #include <QtCore/qglobal.h>
  40. #include <QtCore/qatomic.h>
  41. #ifndef QT_NO_DATASTREAM
  42. #include <QtCore/qdatastream.h>
  43. #endif
  44. #ifdef Bool
  45. #error qmetatype.h must be included before any header file that defines Bool
  46. #endif
  47. QT_BEGIN_HEADER
  48. QT_BEGIN_NAMESPACE
  49. QT_MODULE(Core)
  50. class Q_CORE_EXPORT QMetaType {
  51. public:
  52.     enum Type {
  53.         // these are merged with QVariant
  54.         Void = 0, Bool = 1, Int = 2, UInt = 3, LongLong = 4, ULongLong = 5,
  55.         Double = 6, QChar = 7, QVariantMap = 8, QVariantList = 9,
  56.         QString = 10, QStringList = 11, QByteArray = 12,
  57.         QBitArray = 13, QDate = 14, QTime = 15, QDateTime = 16, QUrl = 17,
  58.         QLocale = 18, QRect = 19, QRectF = 20, QSize = 21, QSizeF = 22,
  59.         QLine = 23, QLineF = 24, QPoint = 25, QPointF = 26, QRegExp = 27,
  60.         LastCoreType = 27 /* QRegExp */,
  61.         FirstGuiType = 63 /* QColorGroup */,
  62. #ifdef QT3_SUPPORT
  63.         QColorGroup = 63,
  64. #endif
  65.         QFont = 64, QPixmap = 65, QBrush = 66, QColor = 67, QPalette = 68,
  66.         QIcon = 69, QImage = 70, QPolygon = 71, QRegion = 72, QBitmap = 73,
  67.         QCursor = 74, QSizePolicy = 75, QKeySequence = 76, QPen = 77,
  68.         QTextLength = 78, QTextFormat = 79, QMatrix = 80, QTransform = 81,
  69.         LastGuiType = 81 /* QTransform */,
  70.         FirstCoreExtType = 128 /* VoidStar */,
  71.         VoidStar = 128, Long = 129, Short = 130, Char = 131, ULong = 132,
  72.         UShort = 133, UChar = 134, Float = 135, QObjectStar = 136, QWidgetStar = 137,
  73.         LastCoreExtType = 137 /* QWidgetStar */,
  74.         User = 256
  75.     };
  76.     typedef void (*Destructor)(void *);
  77.     typedef void *(*Constructor)(const void *);
  78. #ifndef QT_NO_DATASTREAM
  79.     typedef void (*SaveOperator)(QDataStream &, const void *);
  80.     typedef void (*LoadOperator)(QDataStream &, void *);
  81.     static void registerStreamOperators(const char *typeName, SaveOperator saveOp,
  82.                                         LoadOperator loadOp);
  83. #endif
  84.     static int registerType(const char *typeName, Destructor destructor,
  85.                             Constructor constructor);
  86.     static int type(const char *typeName);
  87.     static const char *typeName(int type);
  88.     static bool isRegistered(int type);
  89.     static void *construct(int type, const void *copy = 0);
  90.     static void destroy(int type, void *data);
  91.     static void unregisterType(const char *typeName);
  92. #ifndef QT_NO_DATASTREAM
  93.     static bool save(QDataStream &stream, int type, const void *data);
  94.     static bool load(QDataStream &stream, int type, void *data);
  95. #endif
  96. };
  97. template <typename T>
  98. void qMetaTypeDeleteHelper(T *t)
  99. {
  100.     delete t;
  101. }
  102. template <typename T>
  103. void *qMetaTypeConstructHelper(const T *t)
  104. {
  105.     if (!t)
  106.         return new T;
  107.     return new T(*static_cast<const T*>(t));
  108. }
  109. #ifndef QT_NO_DATASTREAM
  110. template <typename T>
  111. void qMetaTypeSaveHelper(QDataStream &stream, const T *t)
  112. {
  113.     stream << *t;
  114. }
  115. template <typename T>
  116. void qMetaTypeLoadHelper(QDataStream &stream, T *t)
  117. {
  118.     stream >> *t;
  119. }
  120. #endif // QT_NO_DATASTREAM
  121. template <typename T>
  122. int qRegisterMetaType(const char *typeName
  123. #ifndef qdoc
  124.     , T * /* dummy */ = 0
  125. #endif
  126. )
  127. {
  128.     typedef void*(*ConstructPtr)(const T*);
  129.     ConstructPtr cptr = qMetaTypeConstructHelper<T>;
  130.     typedef void(*DeletePtr)(T*);
  131.     DeletePtr dptr = qMetaTypeDeleteHelper<T>;
  132.     return QMetaType::registerType(typeName, reinterpret_cast<QMetaType::Destructor>(dptr),
  133.                                    reinterpret_cast<QMetaType::Constructor>(cptr));
  134. }
  135. #ifndef QT_NO_DATASTREAM
  136. template <typename T>
  137. void qRegisterMetaTypeStreamOperators(const char *typeName
  138. #ifndef qdoc
  139.     , T * /* dummy */ = 0
  140. #endif
  141. )
  142. {
  143.     typedef void(*SavePtr)(QDataStream &, const T *);
  144.     typedef void(*LoadPtr)(QDataStream &, T *);
  145.     SavePtr sptr = qMetaTypeSaveHelper<T>;
  146.     LoadPtr lptr = qMetaTypeLoadHelper<T>;
  147.     qRegisterMetaType<T>(typeName);
  148.     QMetaType::registerStreamOperators(typeName, reinterpret_cast<QMetaType::SaveOperator>(sptr),
  149.                                        reinterpret_cast<QMetaType::LoadOperator>(lptr));
  150. }
  151. #endif
  152. template <typename T>
  153. struct QMetaTypeId
  154. {
  155.     enum { Defined = 0 };
  156. };
  157. template <typename T>
  158. struct QMetaTypeId2
  159. {
  160.     enum { Defined = QMetaTypeId<T>::Defined };
  161.     static inline int qt_metatype_id() { return QMetaTypeId<T>::qt_metatype_id(); }
  162. };
  163. template <typename T>
  164. inline int qMetaTypeId(
  165. #ifndef qdoc
  166.     T * /* dummy */ = 0
  167. #endif
  168. )
  169. {
  170.     return QMetaTypeId2<T>::qt_metatype_id();
  171. }
  172. template <typename T>
  173. inline int qRegisterMetaType(
  174. #if !defined(qdoc) && !defined(Q_CC_SUN)
  175.     T * dummy = 0
  176. #endif
  177. )
  178. {
  179. #ifdef Q_CC_SUN
  180.     return qMetaTypeId(static_cast<T *>(0));
  181. #else
  182.     return qMetaTypeId(dummy);
  183. #endif
  184. }
  185. #define Q_DECLARE_METATYPE(TYPE)                                        
  186.     QT_BEGIN_NAMESPACE                                                  
  187.     template <>                                                         
  188.     struct QMetaTypeId< TYPE >                                          
  189.     {                                                                   
  190.         enum { Defined = 1 };                                           
  191.         static int qt_metatype_id()                                     
  192.             {                                                           
  193.                 static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); 
  194.                 if (!metatype_id)                                       
  195.                     metatype_id = qRegisterMetaType< TYPE >(#TYPE);     
  196.                 return metatype_id;                                     
  197.             }                                                           
  198.     };                                                                  
  199.     QT_END_NAMESPACE
  200. #define Q_DECLARE_BUILTIN_METATYPE(TYPE, NAME) 
  201.     QT_BEGIN_NAMESPACE 
  202.     template<> struct QMetaTypeId2<TYPE> 
  203.     { 
  204.         enum { Defined = 1, MetaType = QMetaType::NAME }; 
  205.         static inline int qt_metatype_id() { return QMetaType::NAME; } 
  206.     }; 
  207.     QT_END_NAMESPACE
  208. class QString;
  209. class QByteArray;
  210. class QChar;
  211. class QStringList;
  212. class QBitArray;
  213. class QDate;
  214. class QTime;
  215. class QDateTime;
  216. class QUrl;
  217. class QLocale;
  218. class QRect;
  219. class QRectF;
  220. class QSize;
  221. class QSizeF;
  222. class QLine;
  223. class QLineF;
  224. class QPoint;
  225. class QPointF;
  226. #ifndef QT_NO_REGEXP
  227. class QRegExp;
  228. #endif
  229. class QWidget;
  230. class QObject;
  231. #ifdef QT3_SUPPORT
  232. class QColorGroup;
  233. #endif
  234. class QFont;
  235. class QPixmap;
  236. class QBrush;
  237. class QColor;
  238. class QPalette;
  239. class QIcon;
  240. class QImage;
  241. class QPolygon;
  242. class QRegion;
  243. class QBitmap;
  244. class QCursor;
  245. class QSizePolicy;
  246. class QKeySequence;
  247. class QPen;
  248. class QTextLength;
  249. class QTextFormat;
  250. class QMatrix;
  251. class QTransform;
  252. QT_END_NAMESPACE
  253. Q_DECLARE_BUILTIN_METATYPE(QString, QString)
  254. Q_DECLARE_BUILTIN_METATYPE(int, Int)
  255. Q_DECLARE_BUILTIN_METATYPE(uint, UInt)
  256. Q_DECLARE_BUILTIN_METATYPE(bool, Bool)
  257. Q_DECLARE_BUILTIN_METATYPE(double, Double)
  258. Q_DECLARE_BUILTIN_METATYPE(QByteArray, QByteArray)
  259. Q_DECLARE_BUILTIN_METATYPE(QChar, QChar)
  260. Q_DECLARE_BUILTIN_METATYPE(long, Long)
  261. Q_DECLARE_BUILTIN_METATYPE(short, Short)
  262. Q_DECLARE_BUILTIN_METATYPE(char, Char)
  263. Q_DECLARE_BUILTIN_METATYPE(ulong, ULong)
  264. Q_DECLARE_BUILTIN_METATYPE(ushort, UShort)
  265. Q_DECLARE_BUILTIN_METATYPE(uchar, UChar)
  266. Q_DECLARE_BUILTIN_METATYPE(float, Float)
  267. Q_DECLARE_BUILTIN_METATYPE(QObject *, QObjectStar)
  268. Q_DECLARE_BUILTIN_METATYPE(QWidget *, QWidgetStar)
  269. Q_DECLARE_BUILTIN_METATYPE(void *, VoidStar)
  270. Q_DECLARE_BUILTIN_METATYPE(qlonglong, LongLong)
  271. Q_DECLARE_BUILTIN_METATYPE(qulonglong, ULongLong)
  272. Q_DECLARE_BUILTIN_METATYPE(QStringList, QStringList)
  273. Q_DECLARE_BUILTIN_METATYPE(QBitArray, QBitArray)
  274. Q_DECLARE_BUILTIN_METATYPE(QDate, QDate)
  275. Q_DECLARE_BUILTIN_METATYPE(QTime, QTime)
  276. Q_DECLARE_BUILTIN_METATYPE(QDateTime, QDateTime)
  277. Q_DECLARE_BUILTIN_METATYPE(QUrl, QUrl)
  278. Q_DECLARE_BUILTIN_METATYPE(QLocale, QLocale)
  279. Q_DECLARE_BUILTIN_METATYPE(QRect, QRect)
  280. Q_DECLARE_BUILTIN_METATYPE(QRectF, QRectF)
  281. Q_DECLARE_BUILTIN_METATYPE(QSize, QSize)
  282. Q_DECLARE_BUILTIN_METATYPE(QSizeF, QSizeF)
  283. Q_DECLARE_BUILTIN_METATYPE(QLine, QLine)
  284. Q_DECLARE_BUILTIN_METATYPE(QLineF, QLineF)
  285. Q_DECLARE_BUILTIN_METATYPE(QPoint, QPoint)
  286. Q_DECLARE_BUILTIN_METATYPE(QPointF, QPointF)
  287. #ifndef QT_NO_REGEXP
  288. Q_DECLARE_BUILTIN_METATYPE(QRegExp, QRegExp)
  289. #endif
  290. #ifdef QT3_SUPPORT
  291. Q_DECLARE_BUILTIN_METATYPE(QColorGroup, QColorGroup)
  292. #endif
  293. Q_DECLARE_BUILTIN_METATYPE(QFont, QFont)
  294. Q_DECLARE_BUILTIN_METATYPE(QPixmap, QPixmap)
  295. Q_DECLARE_BUILTIN_METATYPE(QBrush, QBrush)
  296. Q_DECLARE_BUILTIN_METATYPE(QColor, QColor)
  297. Q_DECLARE_BUILTIN_METATYPE(QPalette, QPalette)
  298. Q_DECLARE_BUILTIN_METATYPE(QIcon, QIcon)
  299. Q_DECLARE_BUILTIN_METATYPE(QImage, QImage)
  300. Q_DECLARE_BUILTIN_METATYPE(QPolygon, QPolygon)
  301. Q_DECLARE_BUILTIN_METATYPE(QRegion, QRegion)
  302. Q_DECLARE_BUILTIN_METATYPE(QBitmap, QBitmap)
  303. Q_DECLARE_BUILTIN_METATYPE(QCursor, QCursor)
  304. Q_DECLARE_BUILTIN_METATYPE(QSizePolicy, QSizePolicy)
  305. Q_DECLARE_BUILTIN_METATYPE(QKeySequence, QKeySequence)
  306. Q_DECLARE_BUILTIN_METATYPE(QPen, QPen)
  307. Q_DECLARE_BUILTIN_METATYPE(QTextLength, QTextLength)
  308. Q_DECLARE_BUILTIN_METATYPE(QTextFormat, QTextFormat)
  309. Q_DECLARE_BUILTIN_METATYPE(QMatrix, QMatrix)
  310. Q_DECLARE_BUILTIN_METATYPE(QTransform, QTransform)
  311. QT_END_HEADER
  312. #endif // QMETATYPE_H