Mercurial > projects > qtd
annotate d2/qtd/MOC.d @ 365:958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Fri, 11 Jun 2010 20:09:25 +0300 |
parents | a084e2df3776 |
children | f69341b40588 |
rev | line source |
---|---|
344 | 1 module qtd.MOC; |
288 | 2 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
3 import |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
4 std.typetuple, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
5 std.traits, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
6 std.typetuple, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
7 std.conv, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
8 qt.QGlobal, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
9 qtd.Signal, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
10 qtd.Marshal, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
11 qtd.Array, |
356 | 12 qtd.String, |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
13 qtd.meta.Compiletime, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
14 qtd.ctfe.Format; |
288 | 15 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
16 import qt.core.QString; |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
17 |
288 | 18 /** |
19 Utils. | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
20 */ |
288 | 21 int lastIndexOf(T)(T[] haystack, T[] needle, int from = -1) |
22 { | |
23 auto l = haystack.length; | |
24 auto ol = needle.length; | |
25 int delta = l - ol; | |
26 if (from < 0) | |
27 from = delta; | |
28 if (from < 0 || from > l) | |
29 return -1; | |
30 if (from > delta) | |
31 from = delta; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
32 |
288 | 33 while(from >= 0) |
34 { | |
35 if (haystack[from..from+ol] == needle) | |
36 return from; | |
37 from--; | |
38 } | |
39 return -1; | |
40 } | |
41 | |
42 string replicate(int n, char value) | |
43 { | |
44 char[] ret = "".dup; | |
45 if (n > 0) | |
46 { | |
47 // ret = newArray!char(n); | |
48 for(int i = 0; i < n; i++) | |
49 ret ~= value; | |
50 } | |
51 return cast(string)ret; | |
52 } | |
53 | |
54 /** | |
55 CTFE MOC port. | |
56 */ | |
57 | |
58 enum MethodFlags { | |
59 AccessPrivate = 0x00, | |
60 AccessProtected = 0x01, | |
61 AccessPublic = 0x02, | |
62 MethodMethod = 0x00, | |
63 MethodSignal = 0x04, | |
64 MethodSlot = 0x08, | |
65 MethodConstructor = 0x0c, | |
66 MethodCompatibility = 0x10, | |
67 MethodCloned = 0x20, | |
68 MethodScriptable = 0x40 | |
69 } | |
70 | |
71 enum Access { Private, Protected, Public } | |
72 | |
73 struct FunctionDef | |
74 { | |
75 /* FunctionDef(): returnTypeIsVolatile(false), access(Private), isConst(false), isVirtual(false), | |
76 inlineCode(false), wasCloned(false), isCompat(false), isInvokable(false), | |
77 isScriptable(false), isSlot(false), isSignal(false), | |
78 isConstructor(false), isDestructor(false), isAbstract(false) {} | |
79 */ | |
80 // Type type; | |
81 // string normalizedType; | |
82 // string tag; | |
83 // string name; | |
84 string sig; | |
85 string arguments; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
86 Access access; |
288 | 87 /* bool returnTypeIsVolatile; |
88 | |
89 QList<ArgumentDef> arguments; | |
90 | |
91 enum Access { Private, Protected, Public }; | |
92 bool isConst; | |
93 bool isVirtual; | |
94 bool inlineCode; | |
95 bool wasCloned; | |
96 | |
97 QByteArray inPrivateClass; | |
98 bool isCompat; | |
99 bool isInvokable; | |
100 bool isScriptable; | |
101 bool isSlot; | |
102 bool isSignal; | |
103 bool isConstructor; | |
104 bool isDestructor; | |
105 bool isAbstract; | |
106 */ | |
107 } | |
108 | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
109 struct ClassInfoDef |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
110 { |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
111 string name; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
112 string value; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
113 } |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
114 |
288 | 115 FunctionDef newSlot(string sig, string args) |
116 { | |
117 return FunctionDef(sig, args, Access.Public); | |
118 } | |
119 | |
120 FunctionDef newSignal(string sig, string args) | |
121 { | |
122 return FunctionDef(sig, args, Access.Protected); | |
123 } | |
124 | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
125 struct ClassDef |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
126 { |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
127 string classname; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
128 FunctionDef[] signalList; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
129 FunctionDef[] slotList; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
130 ClassInfoDef[] classInfoList; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
131 } |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
132 |
288 | 133 struct Generator |
134 { | |
135 string output; | |
136 string[] strings; | |
137 // QByteArray purestSuperClass; | |
138 // QList<QByteArray> metaTypes; | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
139 |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
140 ClassDef cdef; |
288 | 141 } |
142 | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
143 |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
144 |
288 | 145 int lengthOfEscapeSequence(string s, uint i) |
146 { | |
147 if (s[i] != '\\' || i >= s.length - 1) | |
148 return 1; | |
149 const int startPos = i; | |
150 ++i; | |
151 auto ch = s[i]; | |
152 if (ch == 'x') { | |
153 ++i; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
154 while (i < s.length && isHexChar(s[i])) |
288 | 155 ++i; |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
156 } else if (isOctalChar(ch)) { |
288 | 157 while (i < startPos + 4 |
158 && i < s.length | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
159 && isOctalChar(s[i])) { |
288 | 160 ++i; |
161 } | |
162 } else { // single character escape sequence | |
163 i = qMin(i + 1, s.length); | |
164 } | |
165 return i - startPos; | |
166 } | |
167 | |
168 int strreg(ref Generator gen, string s) | |
169 { | |
170 int idx = 0; | |
171 foreach (str; gen.strings) { | |
172 if (str == s) | |
173 return idx; | |
174 idx += str.length + 1; | |
175 foreach (i, c; str) { | |
176 if (c == '\\') { | |
177 int cnt = lengthOfEscapeSequence(str, i) - 1; | |
178 idx -= cnt; | |
179 i += cnt; | |
180 } | |
181 } | |
182 } | |
183 gen.strings ~= s; | |
184 return idx; | |
185 } | |
186 | |
187 void generateFunctions(ref Generator gen, FunctionDef[] list, string functype, byte type) | |
188 { | |
189 if (!list.length) | |
190 return; | |
191 gen.output ~= format_ctfe("\n // ${}s: signature, parameters, type, tag, flags\n", functype); | |
192 | |
193 foreach (i, f; list) { | |
194 byte flags = type; | |
195 | |
196 if (f.access == Access.Private) | |
197 flags |= MethodFlags.AccessPrivate; | |
198 else if (f.access == Access.Public) | |
199 flags |= MethodFlags.AccessPublic; | |
200 else if (f.access == Access.Protected) | |
201 flags |= MethodFlags.AccessProtected; | |
202 | |
203 gen.output ~= format_ctfe(" ${}, ${}, ${}, ${}, 0x${:x},\n", strreg(gen, f.sig), | |
204 strreg(gen, f.arguments), strreg(gen, ""/*f.normalizedType*/), strreg(gen, ""/*f.tag*/), flags); | |
205 } | |
206 } | |
207 | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
208 ClassInfoDef[] generateClassInfoDefs(T)() |
288 | 209 { |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
210 ClassInfoDef[] defs; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
211 alias GetAttributes!(T, "Q_CLASSINFO") classInfos; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
212 // COMPILER BUG: |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
213 enum len = classInfos.length; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
214 foreach (i, _; Repeat!(void, len)) |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
215 defs ~= ClassInfoDef(classInfos[i].tuple[2], classInfos[i].tuple[3]); |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
216 |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
217 return defs; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
218 } |
288 | 219 |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
220 void generateClassInfos(ref Generator gen) |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
221 { |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
222 if (!gen.cdef.classInfoList.length) |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
223 return; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
224 |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
225 gen.output ~= "\n // classinfo: key, value\n"; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
226 |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
227 foreach (c; gen.cdef.classInfoList) |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
228 gen.output ~= format_ctfe(" ${}, ${},\n", strreg(gen, c.name), strreg(gen, c.value)); |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
229 } |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
230 |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
231 string generateCode(ref Generator gen) |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
232 { |
288 | 233 /* bool isQt = (cdef->classname == "Qt"); |
234 bool isQObject = (cdef->classname == "QObject"); | |
235 bool isConstructible = !cdef->constructorList.isEmpty(); | |
236 | |
237 // | |
238 // build the data array | |
239 // | |
240 int i = 0; | |
241 | |
242 | |
243 // filter out undeclared enumerators and sets | |
244 { | |
245 QList<EnumDef> enumList; | |
246 for (i = 0; i < cdef->enumList.count(); ++i) { | |
247 EnumDef def = cdef->enumList.at(i); | |
248 if (cdef->enumDeclarations.contains(def.name)) { | |
249 enumList += def; | |
250 } | |
251 QByteArray alias = cdef->flagAliases.value(def.name); | |
252 if (cdef->enumDeclarations.contains(alias)) { | |
253 def.name = alias; | |
254 enumList += def; | |
255 } | |
256 } | |
257 cdef->enumList = enumList; | |
258 } | |
259 | |
260 | |
261 QByteArray qualifiedClassNameIdentifier = cdef->qualified; | |
262 qualifiedClassNameIdentifier.replace(':', '_'); | |
263 */ | |
264 bool isConstructible = false; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
265 |
288 | 266 FunctionDef[] propertyList, enumList, constructorList; |
267 int index = 12; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
268 gen.output ~= "private static const uint[] qt_meta_data = [\n"; |
288 | 269 gen.output ~= format_ctfe("\n // content:\n"); |
270 gen.output ~= format_ctfe(" ${}, // revision\n", 2); | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
271 gen.output ~= format_ctfe(" ${}, // classname\n", strreg(gen, gen.cdef.classname)); |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
272 gen.output ~= format_ctfe(" ${}, ${}, // classinfo\n", gen.cdef.classInfoList.length, gen.cdef.classInfoList.length ? index : 0); |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
273 index += gen.cdef.classInfoList.length * 2; |
288 | 274 |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
275 int methodCount = gen.cdef.signalList.length + gen.cdef.slotList.length;// + cdef->methodList.count(); |
288 | 276 gen.output ~= format_ctfe(" ${}, ${}, // methods\n", methodCount, methodCount ? index : 0); |
277 index += methodCount * 5; | |
278 gen.output ~= format_ctfe(" ${}, ${}, // properties\n", propertyList.length, propertyList.length ? index : 0); | |
279 index += propertyList.length * 3; | |
280 // if(cdef->notifyableProperties) | |
281 // index += cdef->propertyList.count(); | |
282 gen.output ~= format_ctfe(" ${}, ${}, // enums/sets\n", enumList.length, enumList.length ? index : 0); | |
283 | |
284 // int enumsIndex = index; | |
285 // for (i = 0; i < cdef->enumList.count(); ++i) | |
286 // index += 4 + (cdef->enumList.at(i).values.count() * 2); | |
287 gen.output ~= format_ctfe(" ${}, ${}, // constructors\n", isConstructible ? constructorList.length : 0, | |
288 isConstructible ? index : 0); | |
289 | |
290 // | |
291 // Build classinfo array | |
292 // | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
293 generateClassInfos(gen); |
288 | 294 |
295 // | |
296 // Build signals array first, otherwise the signal indices would be wrong | |
297 // | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
298 generateFunctions(gen, gen.cdef.signalList, "signal", MethodFlags.MethodSignal); |
288 | 299 |
300 // | |
301 // Build slots array | |
302 // | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
303 generateFunctions(gen, gen.cdef.slotList, "slot", MethodFlags.MethodSlot); |
288 | 304 |
305 // | |
306 // Build method array | |
307 // | |
308 // generateFunctions(cdef->methodList, "method", MethodMethod); | |
309 | |
310 | |
311 // | |
312 // Build property array | |
313 // | |
314 // generateProperties(); | |
315 | |
316 // | |
317 // Build enums array | |
318 // | |
319 // generateEnums(enumsIndex); | |
320 | |
321 // | |
322 // Build constructors array | |
323 // | |
324 // if (isConstructible) | |
325 // generateFunctions(cdef->constructorList, "constructor", MethodConstructor); | |
326 | |
327 // | |
328 // Terminate data array | |
329 // | |
330 gen.output ~= format_ctfe("\n 0 // eod\n];\n\n"); | |
331 | |
332 // | |
333 // Build stringdata array | |
334 // | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
335 gen.output ~= "private static const string qt_meta_stringdata = \n"; |
288 | 336 gen.output ~= format_ctfe(" \""); |
337 int col = 0; | |
338 int len = 0; | |
339 foreach (i, s; gen.strings) { | |
340 len = s.length; | |
341 if (col && col + len >= 72) { | |
342 gen.output ~= format_ctfe("\"\n \""); | |
343 col = 0; | |
344 } else if (len && s[0] >= '0' && s[0] <= '9') { | |
345 gen.output ~= format_ctfe("\"\""); | |
346 len += 2; | |
347 } | |
348 int idx = 0; | |
349 while (idx < s.length) { | |
350 if (idx > 0) { | |
351 col = 0; | |
352 gen.output ~= format_ctfe("\"\n \""); | |
353 } | |
354 int spanLen = qMin(cast(uint)70, s.length - idx); | |
355 // don't cut escape sequences at the end of a line | |
356 int backSlashPos = s.lastIndexOf("\\", idx + spanLen - 1); | |
357 if (backSlashPos >= idx) { | |
358 int escapeLen = lengthOfEscapeSequence(s, backSlashPos); | |
359 spanLen = qBound(spanLen, backSlashPos + escapeLen - idx, cast(int)(s.length - idx)); | |
360 } | |
361 gen.output ~= s[idx..idx+spanLen]; | |
362 idx += spanLen; | |
363 col += spanLen; | |
364 } | |
365 | |
366 gen.output ~= "\\0"; | |
367 col += len + 2; | |
368 } | |
369 gen.output ~= "\";\n\n"; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
370 |
288 | 371 return gen.output; |
372 } | |
373 | |
374 string qtDeclArgs(Args...)() | |
375 { | |
376 string ret; | |
377 foreach(i, _; Args) | |
378 { | |
379 if(i > 0) | |
380 ret ~= ","; | |
381 ret ~= qtDeclArg!(Args[i]); | |
382 } | |
383 return ret; | |
384 } | |
385 | |
386 size_t commaCount(int argCount) | |
387 { | |
388 size_t ret = 0; | |
389 if(argCount > 1) | |
390 ret = argCount - 1; | |
391 return ret; | |
392 } | |
393 | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
394 FunctionDef[] genFuncDefs(alias newFunc, Funcs...)() |
288 | 395 { |
396 typeof(return) res; | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
397 enum funcsCount = Funcs.length; |
288 | 398 foreach(i, bogus; Repeat!(void, funcsCount)) |
399 { | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
400 alias ParameterTypeTuple!(Funcs[i]) Args; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
401 string args = replicate(commaCount(Args.length), ','); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
402 string funcSig = methodName!(Funcs[i]) ~ "(" ~ qtDeclArgs!(Args)() ~ ")"; |
288 | 403 res ~= newFunc(funcSig, args); |
404 } | |
405 return res; | |
406 } | |
407 | |
408 template Q_OBJECT_BIND() | |
409 { | |
410 } | |
322
7c2cf27391c4
A slight change of the connect syntax. More sofisticated signals/slots lookup. Some fixes in examples.
eldar_ins@eldar-laptop
parents:
320
diff
changeset
|
411 |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
412 // ------------------------------------------------------------------------------------------ |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
413 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
414 string generateSignalEmitters(uint signalCount) |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
415 { |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
416 string res = ""; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
417 foreach (i; 0..signalCount) |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
418 { |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
419 auto iStr = to!string(i); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
420 res ~= "mixin SignalEmitter!(SignalKind.NewSignal, " ~ iStr ~ ");\n"; |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
421 } |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
422 return res; |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
423 } |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
424 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
425 private mixin template SlotAlias(alias slot) |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
426 { |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
427 mixin ("alias slot " ~ methodName!slot ~ ";"); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
428 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
429 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
430 string generateSlotAliases(uint slotCount) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
431 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
432 string res = ""; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
433 foreach(i; 0..slotCount) |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
434 { |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
435 auto iStr = to!string(i); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
436 res ~= "mixin SlotAlias!(slots[" ~ iStr ~ "]);\n"; |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
437 } |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
438 return res; |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
439 } |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
440 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
441 string generateMetaCall(string methodName, size_t argCount) |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
442 { |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
443 string res = ""; |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
444 foreach (i; 1..argCount) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
445 res ~= generateConvToD(i); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
446 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
447 res ~= methodName ~ "("; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
448 foreach (i; 1..argCount) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
449 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
450 if (i > 1) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
451 res ~= ", "; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
452 res ~= "_out" ~ to!string(i); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
453 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
454 return res ~ ");\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
455 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
456 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
457 string generateDispatchSwitch(size_t methodCount) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
458 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
459 string res = "switch(_id) {\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
460 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
461 foreach(i; 0..methodCount) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
462 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
463 string iStr = to!string(i); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
464 res ~= " case " ~ iStr ~ ":\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
465 res ~= " alias methods[" ~ iStr ~ "] method;\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
466 res ~= " alias TypeTuple!(void, ParameterTypeTuple!method) Args;\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
467 res ~= " mixin(generateMetaCall(methodName!method, Args.length));\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
468 res ~= " break;\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
469 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
470 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
471 res ~= " default:\n"; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
472 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
473 return res ~ "}\n"; |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
474 } |
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
475 |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
476 string generateMetaInfo(T)() |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
477 { |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
478 Generator gen; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
479 |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
480 gen.cdef.classname = T.stringof; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
481 |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
482 gen.cdef.slotList = genFuncDefs!(newSignal, T.signals)(); |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
483 gen.cdef.signalList = genFuncDefs!(newSlot, T.slots)(); |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
484 gen.cdef.classInfoList = generateClassInfoDefs!T(); |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
485 |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
486 generateCode(gen); |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
487 |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
488 return gen.output; |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
489 } |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
490 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
491 mixin template Q_OBJECT() |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
492 { |
365
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
493 import std.typetuple; |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
494 import qtd.Marshal; |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
495 import std.stdio; |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
496 import qt.core.QString; // for QStringUtil.toNative |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
497 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
498 public: // required to override the outside scope protection. |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
499 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
500 alias typeof(this) This; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
501 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
502 alias findSignals!(This) signals; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
503 alias findSlots!(This) slots; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
504 alias TypeTuple!(signals, slots) methods; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
505 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
506 mixin (generateSignalEmitters(signals.length)); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
507 mixin (generateSlotAliases(slots.length)); |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
508 //pragma(msg, generateMetaInfo!This()); |
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
356
diff
changeset
|
509 mixin (generateMetaInfo!This()); |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
510 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
511 protected int qt_metacall(QMetaObject.Call _c, int _id, void **_a) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
512 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
513 _id = super.qt_metacall(_c, _id, _a); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
514 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
515 static if (methods.length) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
516 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
517 if (_id < 0) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
518 return _id; |
319
894d40eb89b6
new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents:
302
diff
changeset
|
519 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
520 if (_c == QMetaObject.Call.InvokeMetaMethod) { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
521 //pragma(msg, generateDispatchSwitch(methods.length)); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
522 mixin (generateDispatchSwitch(methods.length)); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
523 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
524 _id -= methods.length; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
525 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
526 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
527 return _id; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
528 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
529 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
530 @property |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
531 override QMetaObject metaObject() const { return staticMetaObject(); } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
532 |
365
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
533 private static |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
534 { |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
535 __gshared QMetaObject staticMetaObject_; |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
536 __gshared QMetaObjectNative nativeStaticMetaObject_; |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
537 bool staticMoInited_; |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
538 } |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
539 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
540 @property |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
541 static QMetaObject staticMetaObject() |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
542 { |
365
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
543 // using a thread-local flag to mitigate |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
544 // the performance hit caused by lazy initialization |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
545 if(!staticMoInited_) |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
546 { |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
547 synchronized(qtdMoLock) |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
548 { |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
549 if (!staticMetaObject_) |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
550 { |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
551 alias BaseClassesTuple!(This)[0] Base; |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
552 |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
553 nativeStaticMetaObject_ = QMetaObjectNative( |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
554 Base.staticMetaObject.nativeId, |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
555 qt_meta_stringdata.ptr, |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
556 qt_meta_data.ptr, null); |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
557 |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
558 QMetaObject.create!This(&nativeStaticMetaObject_); |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
559 } |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
560 } |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
561 staticMoInited_ = true; |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
562 } |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
563 |
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
564 return staticMetaObject_; |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
565 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
566 |
365
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
567 /*internal*/ static void setStaticMetaObject(QMetaObject m) |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
568 { |
365
958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
Max Samukha <maxter@spambox.com>
parents:
364
diff
changeset
|
569 staticMetaObject_ = m; |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
570 } |
327 | 571 } |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
347
diff
changeset
|
572 |