annotate qt/core/QTypeInfo.d @ 291:0d2094800bdb signals

QList native implementation
author eldar
date Mon, 09 Nov 2009 20:49:26 +0000
parents
children 19498f420252
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
291
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
1 module qt.core.QTypeInfo;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
2
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
3 //import qt.QGlobal;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
4 //import qt.qtd.Atomic;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
5
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
6 /*
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
7 The catch-all template.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
8 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
9
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
10 bool qIsDetached(T)(ref T) { return true; }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
11
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
12 struct QTypeInfo(T)
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
13 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
14 public:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
15 enum {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
16 isPointer = false,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
17 isComplex = true,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
18 isStatic = true,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
19 isLarge = (T.sizeof > sizeof(void*)),
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
20 isDummy = false
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
21 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
22 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
23
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
24 struct QTypeInfo(T : T*)
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
25 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
26 public:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
27 enum {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
28 isPointer = true,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
29 isComplex = false,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
30 isStatic = false,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
31 isLarge = false,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
32 isDummy = false
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
33 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
34 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
35
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
36 #else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
37
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
38 template <typename T> char QTypeInfoHelper(T*(*)());
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
39 void* QTypeInfoHelper(...);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
40
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
41 template <typename T> inline bool qIsDetached(T &) { return true; }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
42
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
43 template <typename T>
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
44 class QTypeInfo
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
45 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
46 public:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
47 enum {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
48 isPointer = (1 == sizeof(QTypeInfoHelper((T(*)())0))),
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
49 isComplex = !isPointer,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
50 isStatic = !isPointer,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
51 isLarge = (sizeof(T)>sizeof(void*)),
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
52 isDummy = false
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
53 };
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
54 };
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
55
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
56 #endif /* QT_NO_PARTIAL_TEMPLATE_SPECIALIZATION */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
57
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
58 /*
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
59 Specialize a specific type with:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
60
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
61 Q_DECLARE_TYPEINFO(type, flags);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
62
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
63 where 'type' is the name of the type to specialize and 'flags' is
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
64 logically-OR'ed combination of the flags below.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
65 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
66 enum { /* TYPEINFO flags */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
67 Q_COMPLEX_TYPE = 0,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
68 Q_PRIMITIVE_TYPE = 0x1,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
69 Q_STATIC_TYPE = 0,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
70 Q_MOVABLE_TYPE = 0x2,
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
71 Q_DUMMY_TYPE = 0x4
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
72 };
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
73
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
74 #define Q_DECLARE_TYPEINFO(TYPE, FLAGS) \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
75 template <> \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
76 class QTypeInfo<TYPE> \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
77 { \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
78 public: \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
79 enum { \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
80 isComplex = (((FLAGS) & Q_PRIMITIVE_TYPE) == 0), \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
81 isStatic = (((FLAGS) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
82 isLarge = (sizeof(TYPE)>sizeof(void*)), \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
83 isPointer = false, \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
84 isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0) \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
85 }; \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
86 static inline const char *name() { return #TYPE; } \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
87 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
88
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
89 /*
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
90 Specialize a shared type with:
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
91
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
92 Q_DECLARE_SHARED(type);
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
93
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
94 where 'type' is the name of the type to specialize. NOTE: shared
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
95 types must declare a 'bool isDetached(void) const;' member for this
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
96 to work.
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
97 */
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
98 #if defined Q_CC_MSVC && _MSC_VER < 1300
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
99 template <typename T>
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
100 inline void qSwap_helper(T &value1, T &value2, T*)
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
101 {
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
102 T t = value1;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
103 value1 = value2;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
104 value2 = t;
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
105 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
106 #define Q_DECLARE_SHARED(TYPE) \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
107 template <> inline bool qIsDetached<TYPE>(TYPE &t) { return t.isDetached(); } \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
108 template <> inline void qSwap_helper<TYPE>(TYPE &value1, TYPE &value2, TYPE*) \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
109 { \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
110 const TYPE::DataPtr t = value1.data_ptr(); \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
111 value1.data_ptr() = value2.data_ptr(); \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
112 value2.data_ptr() = t; \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
113 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
114 #else
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
115 #define Q_DECLARE_SHARED(TYPE) \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
116 template <> inline bool qIsDetached<TYPE>(TYPE &t) { return t.isDetached(); } \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
117 template <typename T> inline void qSwap(T &, T &); \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
118 template <> inline void qSwap<TYPE>(TYPE &value1, TYPE &value2) \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
119 { \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
120 const TYPE::DataPtr t = value1.data_ptr(); \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
121 value1.data_ptr() = value2.data_ptr(); \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
122 value2.data_ptr() = t; \
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
123 }
0d2094800bdb QList native implementation
eldar
parents:
diff changeset
124 #endif