annotate qt/d1/qt/QtdObject.d @ 261:8f7bb7fc3123 lifetime

Preparing for a better world
author maxter
date Mon, 21 Sep 2009 13:11:04 +0000
parents b5773ccab07d
children 90131f64c9c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
1 /**
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
2 *
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
3 * Copyright: Copyright QtD Team, 2008-2009
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
4 * License: <a href="http://www.boost.org/LICENSE_1_0.txt>Boost License 1.0</a>
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
5 * Authors: Max Samukha, Eldar Insafutdinov
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
6 *
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
7 * Copyright QtD Team, 2008-2009
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
8 * Distributed under the Boost Software License, Version 1.0.
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
9 * (See accompanying file boost-license-1.0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
10 *
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
11 */
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
12
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
13 module qt.QtdObject;
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
14
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
15 import qt.Signal;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
16 import tango.core.Memory;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
17 debug (QtdVerbose)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
18 import tango.io.Stdout;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
19
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
20
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
21 enum QtdObjectFlags : ubyte
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
22 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
23 none,
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
24 // The native object will not be deleted when the wrapper is deleted
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
25 skipNativeDelete = 0b0_0001,
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
26 // The wrapper will not be deleted when the native object is deleted
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
27 skipDDelete = 0b0_0010,
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
28 // D object reference is stored in the shell
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
29 hasDId = 0b0_0100,
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
30 // The wrapper is allocated on thread-local stack and destroyed at the end of the scope
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
31 stackAllocated = 0b0_1000
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
32 // It is a QObject
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
33 isQObject = 0b1_0000
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
34 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
35
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
36 class MetaObject
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
37 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
38 alias typeof(this) This;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
39
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
40 private
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
41 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
42 MetaObject _base;
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
43 ClassInfo _classInfo;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
44 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
45
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
46 //COMPILER BUG: not accessible from QMetaObject
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
47 protected
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
48 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
49 This _firstDerived;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
50 This _next;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
51 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
52
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
53 private void addDerived(This mo)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
54 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
55 mo._next = _firstDerived;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
56 _firstDerived = mo;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
57 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
58
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
59 /++
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
60 Next sibling on this derivation level
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
61 +/
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
62 final This next()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
63 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
64 return _next;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
65 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
66
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
67 /++
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
68 Head of the linked list of derived classes
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
69 +/
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
70 final This firstDerived()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
71 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
72 return _firstDerived;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
73 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
74
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
75 // NOTE: construction is split between this non-templated constructor and 'construct' function below.
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
76 this(This base)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
77 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
78 if (base)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
79 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
80 base.addDerived(this);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
81 _base = base;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
82 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
83 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
84
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
85 // TODO: can be removed when D acquires templated constructors
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
86 void construct(T : Object)()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
87 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
88 _classInfo = T.classinfo;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
89 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
90
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
91 final This base()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
92 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
93 return _base;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
94 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
95
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
96 final ClassInfo classInfo()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
97 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
98 return _classInfo;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
99 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
100 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
101
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
102
260
maxter
parents: 259
diff changeset
103 abstract class QtdMetaObjectBase : MetaObject
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
104 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
105 QtdObjectBase function(void* nativeId, QtdObjectFlags flags) _createWrapper;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
106
260
maxter
parents: 259
diff changeset
107 this(QtdMetaObjectBase base)
maxter
parents: 259
diff changeset
108 {
maxter
parents: 259
diff changeset
109 super(base);
maxter
parents: 259
diff changeset
110 }
maxter
parents: 259
diff changeset
111
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
112 void construct(T : QtdObject)()
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
113 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
114 super.construct!(T);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
115 _createWrapper = &T.__createWrapper;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
116 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
117 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
118
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
119
260
maxter
parents: 259
diff changeset
120 final class QtdMetaObject : QtdMetaObjectBase
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
121 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
122 alias typeof(this) This;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
123
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
124 private void* _typeId;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
125
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
126 this(void* typeId, QtdMetaObject base)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
127 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
128 super(base);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
129 _typeId = typeId;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
130 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
131
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
132 QtdObject wrap(void* nativeId, void* typeId, QtdObjectFlags flags = QtdObjectFlags.skipNativeDelete)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
133 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
134 if (typeId == _typeId)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
135 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
136 /+
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
137 if (auto p = nativeId in _nativeToDMap)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
138 return *p;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
139 +/
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
140 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
141 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
142 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
143 for (auto mo = static_cast!(This)(_firstDerived); mo; mo = static_cast!(This)(mo._next))
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
144 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
145 if (auto obj = mo.wrap(nativeId, typeId, flags))
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
146 return obj;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
147 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
148 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
149
260
maxter
parents: 259
diff changeset
150 return static_cast!(QtdObject)(_createWrapper(nativeId, flags));
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
151 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
152 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
153
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
154 class IdMappings
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
155 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
156 private void* _data;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
157
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
158 this()
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
159 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
160 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
161
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
162 void add(void* nativeId, void* dId)
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
163 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
164 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
165
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
166 void remove(void* dId)
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
167 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
168 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
169
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
170 void* opIndex[void* nativeId]
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
171 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
172 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
173
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
174 ~this()
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
175 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
176 free(_data);
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
177 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
178 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
179
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
180 abstract class QtdObjectBase
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
181 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
182 alias typeof(this) This;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
183
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
184 void* __nativeId;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
185 QtdObjectFlags __flags;
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
186
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
187 new (size_t size, QtdObjectFlags flags = QtdObjectFlags.none)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
188 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
189 return flags & QtdObjectFlags.stackAllocated ? __stackAlloc.alloc(size) :
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
190 GC.malloc(size, GC.BlkAttr.FINALIZE);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
191 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
192
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
193 delete (void* p)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
194 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
195 if ((cast(This)p).__flags & QtdObjectFlags.stackAllocated)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
196 __stackAlloc.free(this.classinfo.init.length);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
197 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
198 GC.free(p);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
199 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
200
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
201 this(void* nativeId, QtdObjectFlags flags = QtdObjectFlags.none)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
202 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
203 __nativeId = nativeId;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
204 __flags = flags;
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
205
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
206 debug(QtdVerbose) __print("D wrapper constructed");
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
207 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
208
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
209 debug(QtdVerbose)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
210 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
211 void __print(string msg)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
212 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
213 Stdout.formatln("{} (native: {}, D: {}, flags 0b{:b})", msg, __nativeId, cast(void*)this, __flags);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
214 }
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
215 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
216
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
217 protected void __deleteNative()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
218 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
219 assert(false, "Cannot delete native "
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
220 ~ this.classinfo.name
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
221 ~ " because it has no public destructor");
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
222 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
223
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
224 ~this()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
225 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
226 debug(QtdVerbose) __print("In QtdObjectBase destructor");
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
227
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
228 if (!(__flags & QtdObjectFlags.skipNativeDelete))
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
229 {
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
230 // Avoid deleting the wrapper twice
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
231 __flags |= QtdObjectFlags.skipDDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
232 debug(QtdVerbose) __print("About to call native delete");
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
233 __deleteNative;
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
234 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
235 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
236 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
237
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
238 // Base class for by-reference objects
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
239 abstract class QtdObject : QtdObjectBase
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
240 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
241 private
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
242 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
243 typeof(this) __next, __prev;
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
244 ubyte __nativeRef_;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
245 static typeof(this) __root;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
246 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
247
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
248 mixin SignalHandlerOps;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
249
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
250 this(void* nativeId, QtdObjectFlags flags)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
251 {
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
252 super (nativeId, flags);
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
253
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
254 if (!(flags & QtdObjectFlags.isQObject) && !(flags & QtdObjectFlags.hasDId))
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
255 __addIdMapping;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
256 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
257
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
258 void __addIdMapping() {}
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
259 void __removeIdMapping() {}
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
260
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
261 final void __nativeRef()
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
262 {
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
263 assert (__nativeRef_ < 255);
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
264
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
265 if (!__nativeRef_)
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
266 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
267 __next = __root;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
268 __root = this;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
269 if (__next)
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
270 __next.__prev = this;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
271 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
272 __nativeRef_++;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
273
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
274 debug(QtdVerbose) __print("Native ref incremented");
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
275 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
276
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
277 final void __nativeDeref()
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
278 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
279 assert (__nativeRef > 0);
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
280 __nativeRef_--;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
281
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
282 if (!__nativeRef_)
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
283 {
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
284 if (__prev)
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
285 __prev.__next = __next;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
286 else
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
287 __root = __next;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
288
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
289 if (__next)
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
290 __next.__prev = __prev;
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
291 }
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
292
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
293 debug(QtdVerbose) __print("Native ref decremented");
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
294 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
295
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
296 ~this()
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
297 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
298 if (!(__flags & QtdObjectFlags.isQObject) && !(__flags & QtdObjectFlags.hasDId))
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
299 __removeMapping;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
300
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
301 if (__nativeRef_)
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
302 {
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
303 if (__nativeRef_ > 1)
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
304 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
305 debug(QtdVerbose) __print("Native ref is greater then 1 when deleting the object");
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
306 __nativeRef_ = 1;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
307 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
308 __nativeDeref;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
309 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
310 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
311 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
312
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
313 // Called from shell destructors
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
314 extern(C) void qtd_delete_d_object(void* dId)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
315 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
316 auto obj = cast(QtdObject)dId;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
317 debug(QtdVerbose) obj.__print("In qtd_delete_d_object");
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
318
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
319 if (!(obj.__flags & QtdObjectFlags.skipDDelete))
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
320 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
321 // Avoid deleting native object twice
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
322 obj.__flags |= QtdObjectFlags.skipNativeDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
323 delete obj;
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
324 }
261
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
325 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
326
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
327 extern(C) void qtd_native_ref(void* dId)
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
328 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
329 (cast(QtdObject)dId).__nativeRef;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
330 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
331
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
332 extern(C) void qtd_native_deref(void* dId)
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
333 {
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
334 (cast(QtdObject)dId).__nativeDeref;
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
335 }
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
336
8f7bb7fc3123 Preparing for a better world
maxter
parents: 260
diff changeset
337