annotate qt/d1/qt/QtdObject.d @ 259:515d6e1c7b10 lifetime

another iteration
author maxter
date Thu, 17 Sep 2009 16:28:41 +0000
parents 1da8870e9a62
children b5773ccab07d
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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
102 abstract class QtdMetaObject : MetaObject
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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
106 void construct(T : QtdObject, Concrete = T)()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
107 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
108 super.construct!(T);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
109 _createWrapper = &T.__createWrapper;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
110 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
111 }
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 /++
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
114 Meta-object for polymorphic Qt classes.
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 final class QtdMetaObject : MetaObject
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 alias typeof(this) This;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
119
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
120 private void* _typeId;
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 this(void* typeId, QtdMetaObject base)
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 super(base);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
125 _typeId = 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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
128 QtdObject wrap(void* nativeId, void* typeId, QtdObjectFlags flags = QtdObjectFlags.skipNativeDelete)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
129 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
130 if (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 if (auto p = nativeId in _nativeToDMap)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
134 return *p;
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 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
138 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
139 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
140 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
141 if (auto obj = mo.wrap(nativeId, typeId, flags))
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
142 return obj;
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 }
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 return _createWrapper(nativeId, flags);
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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
150 abstract class QtdObjectBase
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 alias typeof(this) This;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
153
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
154 void* __nativeId;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
155 QtdObjectFlags __flags;
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 new (size_t size, QtdObjectFlags flags = QtdObjectFlags.none)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
158 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
159 return flags & QtdObjectFlags.stackAllocated ? __stackAlloc.alloc(size) :
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
160 GC.malloc(size, GC.BlkAttr.FINALIZE);
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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
163 delete (void* p)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
164 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
165 if ((cast(This)p).__flags & QtdObjectFlags.stackAllocated)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
166 __stackAlloc.free(this.classinfo.init.length);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
167 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
168 GC.free(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
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
171 this(void* nativeId, QtdObjectFlags flags = QtdObjectFlags.none)
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
172 {
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
173 __nativeId = nativeId;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
174 __flags = flags;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
175 debug(QtdVerbose) __print("D wrapper constructed");
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
176 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
177
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
178 debug(QtdVerbose)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
179 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
180 void __print(string msg)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
181 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
182 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
183 }
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
184 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
185
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
186 protected void __deleteNative()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
187 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
188 assert(false, "Cannot delete native "
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
189 ~ this.classinfo.name
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
190 ~ " because it has no public destructor");
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
191 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
192
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
193 ~this()
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
194 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
195 debug(QtdVerbose) __print("In QtdObjectBase destructor");
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
196
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
197 if (!(__flags & QtdObjectFlags.skipNativeDelete))
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
198 {
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
199 __flags |= QtdObjectFlags.skipDDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
200 debug(QtdVerbose) __print("About to call native delete");
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
201 __deleteNative;
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
202 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
203 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
204 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
205
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
206 // Base class for by-reference objects
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
207 abstract class QtdObject : QtdObjectBase
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 private
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 typeof(this) __next, __prev;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
212 static typeof(this) __root;
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
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 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
217 wrap the same native object.
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 bool isSame(QtdObject other)
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 return __nativeId == other.__nativeId;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
222 }
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 mixin SignalHandlerOps;
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 this(void* nativeId, QtdObjectFlags flags)
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 super (nativeId, flags);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
229 if (!(flags & QtdObjectFlags.skipNativeDelete))
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
230 __pin;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
231 }
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 final void __pin()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
234 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
235 debug(QtdVerbose) __print("Pinning");
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 __next = __root;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
238 __root = this;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
239 if (__next)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
240 __next.__prev = this;
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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
243 final void __unpin()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
244 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
245 debug(QtdVerbose) __print("Unpinning");
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 if (__prev)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
248 __prev.__next = __next;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
249 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
250 __root = __next;
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 (__next)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
253 __next.__prev = __prev;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
254 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
255
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
256 void __nativeOwnership(bool value)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
257 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
258 if (value)
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 assert (!(__flags & QtdObjectFlags.skipNativeDelete));
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
261 __flags |= QtdObjectFlags.skipNativeDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
262 __unpin;
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
263 }
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
264 else
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
265 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
266 assert (__flags & QtdObjectFlags.skipNativeDelete);
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
267 __flags = __flags &= ~QtdObjectFlags.skipNativeDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
268 __pin;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
269 }
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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
272 ~this()
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
273 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
274 debug(QtdVerbose) __print("In QtdObject destructor");
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
275
259
515d6e1c7b10 another iteration
maxter
parents: 258
diff changeset
276 if (__prev || __root is this)d
258
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
277 __unpin;
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 }
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
280
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
281 /++
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
282 +/
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
283 void dispose(QtdObjectBase obj)
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 obj.__flags &= ~QtdObjectFlags.skipNativeDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
286 delete obj;
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
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
289 // Called from shell destructors
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
290 extern(C) void qtd_delete_d_object(void* dId)
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
291 {
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
292 auto obj = cast(QtdObject)dId;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
293 debug(QtdVerbose) obj.__print("In qtd_delete_d_object");
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
294
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
295 if (!(obj.__flags & QtdObjectFlags.skipDDelete))
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 // Avoid deleting native object twice
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
298 obj.__flags |= QtdObjectFlags.skipNativeDelete;
1da8870e9a62 branched for changes to object lifetime handling
maxter
parents: 256
diff changeset
299 delete obj;
253
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
300 }
073b9153ed8a Rev. 264 done right.
maxter
parents:
diff changeset
301 }