Mercurial > projects > qtd
annotate d2/qtd/Marshal.d @ 357:9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Q_CLASSINFO implementation
Now Qtd can be built on Windows
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Wed, 02 Jun 2010 19:38:05 +0300 |
parents | 31520b2c0b3c |
children | da4235301224 |
rev | line source |
---|---|
349 | 1 module qtd.Marshal; |
288 | 2 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
3 import |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
4 std.traits, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
5 qtd.meta.Compiletime, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
6 qtd.ctfe.Format; |
288 | 7 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
8 import std.string : startsWith; |
309 | 9 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
10 |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
350
diff
changeset
|
11 template isQObjectType(T) // |
288 | 12 { |
292 | 13 enum isQObjectType = is(T.__isQObjectType); |
288 | 14 } |
15 | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
16 template isObjectType(T) |
288 | 17 { |
292 | 18 enum isObjectType = is(T.__isObjectType); |
288 | 19 } |
20 | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
21 template isValueType(T) |
288 | 22 { |
293 | 23 enum isValueType = is(T.__isValueType); |
288 | 24 } |
25 | |
339
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
26 template isQtType(T) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
27 { |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
28 mixin ("enum isQtType = is(T.__isQtType_" ~ T.stringof ~ ");"); |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
29 } |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
30 /* |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
31 template isQtType(T) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
32 { |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
33 enum isQtType = isQObjectType!(T) || isObjectType!(T) || isValueType!(T) || is(T.__isQtType); |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
34 } |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
35 */ |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
350
diff
changeset
|
36 template isNativeType(T) |
288 | 37 { |
302 | 38 enum isNativeType = isNumeric!T || is(T == bool) || is(T == struct); |
39 } | |
40 | |
41 template isStringType(T) // string type | |
42 { | |
43 enum isStringType = is(T == string); | |
288 | 44 } |
45 | |
309 | 46 template isQList(T) |
47 { | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
350
diff
changeset
|
48 enum isQList = startsWith(Unqual!(T).stringof, "QList!"); //hack |
309 | 49 } |
50 | |
339
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
51 // returns full name of enum: |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
52 // for Qt enum it is in the form of QPaintDevice::PaintDeviceMetric |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
53 // for pure D enums it is Foo.Bar |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
54 template enumFullName(T) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
55 { |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
56 static if(!isModule(__traits(parent, T).stringof)) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
57 { |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
58 static if(isQtType!(__traits(parent, T))) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
59 enum enumFullName = qualifiedCppName!T; |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
60 else |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
61 enum enumFullName = qualifiedDName!T; |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
62 } |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
63 else |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
64 enum enumFullName = qualifiedDName!T; |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
65 } |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
66 |
288 | 67 // converts a D argument type to C++ for registering in Qt meta system |
68 string qtDeclArg(T)() | |
69 { | |
303 | 70 static if (isQObjectType!T || isObjectType!T) |
288 | 71 return T.stringof ~ "*"; |
318 | 72 else static if (isValueType!T) |
73 return T.stringof; | |
302 | 74 else static if (isStringType!T) |
75 return "QString"; | |
309 | 76 else static if (isQList!T) |
318 | 77 { |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
350
diff
changeset
|
78 static if (is(T.ElementType == string)) |
318 | 79 return "QStringList"; |
80 else | |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
350
diff
changeset
|
81 return "QList<" ~ qtDeclArg!(T.ElementType)() ~ ">"; |
318 | 82 } |
339
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
83 else static if (is(T == enum)) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
84 return enumFullName!T; |
288 | 85 else static if (isNativeType!T) |
302 | 86 return Unqual!T.stringof; |
288 | 87 else |
88 return T.stringof; | |
89 } | |
90 | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
91 /** |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
92 Generates C++-to-D conversion code for the |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
93 argument argIndex. |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
94 */ |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
95 string generateConvToD(uint argIndex) |
288 | 96 { |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
97 string res = format_ctfe(q{ |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
98 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
99 static if (isQObjectType!(Args[${0}]) || isObjectType!(Args[${0}])) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
100 auto _out${0} = Args[${0}].__getObject(*cast(void**)_a[${0}]); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
101 else static if (isValueType!(Args[${0}])) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
102 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
103 // COMPILER BUG: 'new' chokes on Args[argIndex], hence the alias |
357
9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Max Samukha <maxter@spambox.com>
parents:
350
diff
changeset
|
104 alias Args[${0}] Args${0}; |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
105 auto _out${0} = new Args${0}(Args[${0}].__constructNativeCopy(_a[${0}])); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
106 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
107 else static if (isStringType!(Args[${0}])) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
108 auto _out${0} = QStringUtil.toNativeString(_a[${0}]); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
109 else |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
110 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
111 auto _out${0} = *cast(Args[${0}]*)_a[${0}]; |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
112 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
113 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
114 }, argIndex); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
115 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
116 return res; |
288 | 117 } |
302 | 118 |