annotate qt/core/QMetaObject.d @ 248:7664de4a55e5

Fixed #23. QtD_QObjectEntity is not created dynamically for shell classes any more. Class initialization is now performed by static constructors. When wrapping QObjects returned from functions, their run-time types are now taken into account. QObjects are allocated on GC heap, a doubly-linked list is used to prevent them from been collected (arguably a better solution than allocating on C heap and adding GC ranges) Minor changes (including unnecessary).
author maxter
date Thu, 20 Aug 2009 14:47:17 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
248
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
1 module qt.core.QMetaObject;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
2
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
3 import qt.QGlobal;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
4 import qt.core.QObject;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
5 import qt.QtdObject;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
6
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
7 final class QMetaObject
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
8 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
9 private
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
10 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
11 void* _nativeId;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
12 QMetaObject _base; // super class
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
13 QMetaObject _firstDerived; // head of the linked list of derived classes
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
14 QMetaObject _next; // next sibling on this derivation level
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
15 ClassInfo _classInfo;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
16
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
17 QObject function(void* nativeId) _createWrapper;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
18 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
19
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
20 private void addDerived(QMetaObject mo)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
21 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
22 mo._next = _firstDerived;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
23 _firstDerived = mo;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
24 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
25
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
26 // NOTE: construction is split between this non-templated constructor and 'construct' function below.
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
27 this(void* nativeId, QMetaObject base)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
28 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
29 _nativeId = nativeId;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
30 if (base)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
31 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
32 base.addDerived(this);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
33 _base = base;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
34 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
35 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
36
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
37 // TODO: remove when D acquires templated constructors
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
38 void construct(T : QObject, Concrete = T)()
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
39 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
40 _classInfo = T.classinfo;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
41
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
42 static QObject createWrapper(void* nativeId)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
43 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
44 T obj = new Concrete(nativeId, QtdObjectFlags.nativeOwnership);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
45 // TODO: this probably should be moved to QObject constructor
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
46 qtd_create_qobject_entity(nativeId, cast(void*)obj);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
47 return obj;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
48 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
49
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
50 _createWrapper = &createWrapper;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
51 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
52
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
53 /++
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
54 +/
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
55 QMetaObject base()
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
56 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
57 return _base;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
58 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
59
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
60 /++
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
61 +/
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
62 void* nativeId()
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
63 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
64 return _nativeId;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
65 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
66
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
67 /++
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
68 +/
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
69 ClassInfo classInfo()
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
70 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
71 return _classInfo;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
72 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
73
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
74 private QObject lookupDerived(void*[] moIds, void* nativeObjId)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
75 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
76 assert (moIds.length >= 1);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
77
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
78 for (auto mo = _firstDerived; mo !is null; mo = mo._next)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
79 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
80 if (mo._nativeId == moIds[0])
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
81 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
82 if (moIds.length == 1) // exact match found
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
83 return mo._createWrapper(nativeObjId);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
84 else // look deeper
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
85 return mo.lookupDerived(moIds[1..$], nativeObjId);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
86 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
87 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
88
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
89 // no initialized wrapper that matches the native object.
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
90 // use the base class wrapper
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
91 return _createWrapper(nativeObjId);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
92 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
93
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
94 QObject getObject(void* nativeObjId)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
95 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
96 QObject result;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
97
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
98 if (nativeObjId)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
99 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
100 result = cast(QObject)qtd_get_d_qobject(nativeObjId);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
101 if (!result)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
102 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
103 auto moId = qtd_QObject_metaObject(nativeObjId);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
104 if (_nativeId == moId)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
105 result = _createWrapper(nativeObjId);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
106 else
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
107 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
108 // get native metaobjects for the entire derivation lattice
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
109 // up to, but not including, the current metaobject.
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
110 size_t moCount = 1;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
111
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
112 for (void* tmp = moId;;)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
113 {
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
114 tmp = qtd_QMetaObject_superClass(tmp);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
115 assert(tmp);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
116 if (tmp == _nativeId)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
117 break;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
118 moCount++;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
119 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
120
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
121 void*[] moIds = (cast(void**)alloca(moCount * (void*).sizeof))[0..moCount];
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
122
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
123 moIds[--moCount] = moId;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
124 while (moCount > 0)
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
125 moIds[--moCount] = moId = qtd_QMetaObject_superClass(moId);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
126
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
127 result = lookupDerived(moIds, nativeObjId);
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
128 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
129 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
130 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
131
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
132 return result;
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
133 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
134 }
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
135
7664de4a55e5 Fixed #23.
maxter
parents:
diff changeset
136 extern(C) void* qtd_QMetaObject_superClass(void* nativeId);