annotate qt/d1/qt/QtdObject.d @ 260:b5773ccab07d lifetime

closer
author maxter
date Fri, 18 Sep 2009 18:52:03 +0000
parents 515d6e1c7b10
children 8f7bb7fc3123
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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
25 skipNativeDelete = 0b0001,
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
26 skipDDelete = 0b0010,
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
27 hasDId = 0b0100,
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
28 stackAllocated = 0b1000
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
29 /+
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
30 // The will be deleted when is goes out of scope. Implies skipNativeDelete
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
31 scoped = 0x08
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
32 +/
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
33 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
34
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
35 class MetaObject
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
36 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
37 alias typeof(this) This;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
38
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
39 private
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
40 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
41 MetaObject _base;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
42 ClassInfo _classInfo;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
43 }
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 //COMPILER BUG: not accessible from QMetaObject
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
46 protected
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
47 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
48 This _firstDerived;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
49 This _next;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
50 }
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 private void addDerived(This mo)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
53 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
54 mo._next = _firstDerived;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
55 _firstDerived = mo;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
56 }
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 Next sibling on this derivation level
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
60 +/
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
61 final This next()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
62 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
63 return _next;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
64 }
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 Head of the linked list of derived classes
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
68 +/
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
69 final This firstDerived()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
70 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
71 return _firstDerived;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
72 }
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 // 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
75 this(This base)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
76 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
77 if (base)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
78 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
79 base.addDerived(this);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
80 _base = base;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
81 }
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 // TODO: can be removed when D acquires templated constructors
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
85 void construct(T : Object)()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
86 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
87 _classInfo = T.classinfo;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
88 }
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 final This base()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
91 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
92 return _base;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
93 }
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 final ClassInfo classInfo()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
96 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
97 return _classInfo;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
98 }
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
260
maxter
parents: 259
diff changeset
102 abstract class QtdMetaObjectBase : MetaObject
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
103 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
104 QtdObjectBase function(void* nativeId, QtdObjectFlags flags) _createWrapper;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
105
260
maxter
parents: 259
diff changeset
106 this(QtdMetaObjectBase base)
maxter
parents: 259
diff changeset
107 {
maxter
parents: 259
diff changeset
108 super(base);
maxter
parents: 259
diff changeset
109 }
maxter
parents: 259
diff changeset
110
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
111 void construct(T : QtdObject, Concrete = T)()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
112 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
113 super.construct!(T);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
114 _createWrapper = &T.__createWrapper;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
115 }
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 /++
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
119 Meta-object for polymorphic Qt classes.
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
120 +/
260
maxter
parents: 259
diff changeset
121 final class QtdMetaObject : QtdMetaObjectBase
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
122 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
123 alias typeof(this) This;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
124
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
125 private void* _typeId;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
126
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
127 this(void* typeId, QtdMetaObject base)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
128 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
129 super(base);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
130 _typeId = typeId;
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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
133 QtdObject wrap(void* nativeId, void* typeId, QtdObjectFlags flags = QtdObjectFlags.skipNativeDelete)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
134 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
135 if (typeId == _typeId)
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 /+
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
138 if (auto p = nativeId in _nativeToDMap)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
139 return *p;
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 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
142 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
143 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
144 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
145 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
146 if (auto obj = mo.wrap(nativeId, typeId, flags))
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
147 return obj;
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 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
150
260
maxter
parents: 259
diff changeset
151 return static_cast!(QtdObject)(_createWrapper(nativeId, flags));
258
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 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
154
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
155 abstract class QtdObjectBase
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
156 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
157 alias typeof(this) This;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
158
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
159 void* __nativeId;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
160 QtdObjectFlags __flags;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
161
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
162 new (size_t size, QtdObjectFlags flags = QtdObjectFlags.none)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
163 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
164 return flags & QtdObjectFlags.stackAllocated ? __stackAlloc.alloc(size) :
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
165 GC.malloc(size, GC.BlkAttr.FINALIZE);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
166 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
167
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
168 delete (void* p)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
169 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
170 if ((cast(This)p).__flags & QtdObjectFlags.stackAllocated)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
171 __stackAlloc.free(this.classinfo.init.length);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
172 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
173 GC.free(p);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
174 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
175
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
176 this(void* nativeId, QtdObjectFlags flags = QtdObjectFlags.none)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
177 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
178 __nativeId = nativeId;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
179 __flags = flags;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
180 debug(QtdVerbose) __print("D wrapper constructed");
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
181 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
182
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
183 debug(QtdVerbose)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
184 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
185 void __print(string msg)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
186 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
187 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
188 }
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
189 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
190
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
191 protected void __deleteNative()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
192 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
193 assert(false, "Cannot delete native "
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
194 ~ this.classinfo.name
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
195 ~ " because it has no public destructor");
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
196 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
197
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
198 ~this()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
199 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
200 debug(QtdVerbose) __print("In QtdObjectBase destructor");
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
201
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
202 if (!(__flags & QtdObjectFlags.skipNativeDelete))
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
203 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
204 __flags |= QtdObjectFlags.skipDDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
205 debug(QtdVerbose) __print("About to call native delete");
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
206 __deleteNative;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
207 }
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 }
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 // Base class for by-reference objects
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
212 abstract class QtdObject : QtdObjectBase
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
213 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
214 private
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
215 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
216 typeof(this) __next, __prev;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
217 static typeof(this) __root;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
218 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
219
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
220 /++
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
221 Use this method instead of 'is' operator to check if two D objects
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
222 wrap the same native object.
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
223 +/
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
224 bool isSame(QtdObject other)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
225 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
226 return __nativeId == other.__nativeId;
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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
229 mixin SignalHandlerOps;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
230
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
231 this(void* nativeId, QtdObjectFlags flags)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
232 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
233 super (nativeId, flags);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
234 if (!(flags & QtdObjectFlags.skipNativeDelete))
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
235 __pin;
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 final void __pin()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
239 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
240 debug(QtdVerbose) __print("Pinning");
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
241
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
242 __next = __root;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
243 __root = this;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
244 if (__next)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
245 __next.__prev = this;
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 final void __unpin()
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 debug(QtdVerbose) __print("Unpinning");
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
251
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
252 if (__prev)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
253 __prev.__next = __next;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
254 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
255 __root = __next;
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 if (__next)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
258 __next.__prev = __prev;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
259 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
260
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
261 void __nativeOwnership(bool value)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
262 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
263 if (value)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
264 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
265 assert (!(__flags & QtdObjectFlags.skipNativeDelete));
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
266 __flags |= QtdObjectFlags.skipNativeDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
267 __unpin;
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
268 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
269 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
270 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
271 assert (__flags & QtdObjectFlags.skipNativeDelete);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
272 __flags = __flags &= ~QtdObjectFlags.skipNativeDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
273 __pin;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
274 }
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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
277 ~this()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
278 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
279 debug(QtdVerbose) __print("In QtdObject destructor");
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
280
260
maxter
parents: 259
diff changeset
281 if (__prev || __root is this)
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
282 __unpin;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
283 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
284 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
285
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
286 /++
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
287 +/
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
288 void dispose(QtdObjectBase obj)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
289 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
290 obj.__flags &= ~QtdObjectFlags.skipNativeDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
291 delete obj;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
292 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
293
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
294 // Called from shell destructors
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
295 extern(C) void qtd_delete_d_object(void* dId)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
296 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
297 auto obj = cast(QtdObject)dId;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
298 debug(QtdVerbose) obj.__print("In qtd_delete_d_object");
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
299
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
300 if (!(obj.__flags & QtdObjectFlags.skipDDelete))
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
301 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
302 // Avoid deleting native object twice
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
303 obj.__flags |= QtdObjectFlags.skipNativeDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
304 delete obj;
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
305 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
306 }