Mercurial > projects > qtd
annotate d2/qtd/Marshal.d @ 380:beb04f46ef4a
fix NULL default values
author | Eldar Insafutdinov |
---|---|
date | Sat, 10 Jul 2010 22:32:16 +0100 |
parents | da4235301224 |
children | e67ce7c21758 |
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, |
366
da4235301224
Fixed VoidFunc. Updated to dmd.2.047.
Max Samukha <maxter@spambox.com>
parents:
357
diff
changeset
|
6 qtd.String, |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
7 qtd.ctfe.Format; |
288 | 8 |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
9 |
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
|
10 template isQObjectType(T) // |
288 | 11 { |
292 | 12 enum isQObjectType = is(T.__isQObjectType); |
288 | 13 } |
14 | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
15 template isObjectType(T) |
288 | 16 { |
292 | 17 enum isObjectType = is(T.__isObjectType); |
288 | 18 } |
19 | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
20 template isValueType(T) |
288 | 21 { |
293 | 22 enum isValueType = is(T.__isValueType); |
288 | 23 } |
24 | |
339
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
25 template isQtType(T) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
26 { |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
27 mixin ("enum isQtType = is(T.__isQtType_" ~ T.stringof ~ ");"); |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
28 } |
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 template isQtType(T) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
31 { |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
32 enum isQtType = isQObjectType!(T) || isObjectType!(T) || isValueType!(T) || is(T.__isQtType); |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
33 } |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
34 */ |
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
|
35 template isNativeType(T) |
288 | 36 { |
302 | 37 enum isNativeType = isNumeric!T || is(T == bool) || is(T == struct); |
38 } | |
39 | |
40 template isStringType(T) // string type | |
41 { | |
42 enum isStringType = is(T == string); | |
288 | 43 } |
44 | |
309 | 45 template isQList(T) |
46 { | |
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
|
47 enum isQList = startsWith(Unqual!(T).stringof, "QList!"); //hack |
309 | 48 } |
49 | |
339
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
50 // returns full name of enum: |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
51 // for Qt enum it is in the form of QPaintDevice::PaintDeviceMetric |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
52 // for pure D enums it is Foo.Bar |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
53 template enumFullName(T) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
54 { |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
55 static if(!isModule(__traits(parent, T).stringof)) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
56 { |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
57 static if(isQtType!(__traits(parent, T))) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
58 enum enumFullName = qualifiedCppName!T; |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
59 else |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
60 enum enumFullName = qualifiedDName!T; |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
61 } |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
62 else |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
63 enum enumFullName = qualifiedDName!T; |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
64 } |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
65 |
288 | 66 // converts a D argument type to C++ for registering in Qt meta system |
67 string qtDeclArg(T)() | |
68 { | |
303 | 69 static if (isQObjectType!T || isObjectType!T) |
288 | 70 return T.stringof ~ "*"; |
318 | 71 else static if (isValueType!T) |
72 return T.stringof; | |
302 | 73 else static if (isStringType!T) |
74 return "QString"; | |
309 | 75 else static if (isQList!T) |
318 | 76 { |
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
|
77 static if (is(T.ElementType == string)) |
318 | 78 return "QStringList"; |
79 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
|
80 return "QList<" ~ qtDeclArg!(T.ElementType)() ~ ">"; |
318 | 81 } |
339
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
82 else static if (is(T == enum)) |
4e31cbd9e20c
fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents:
323
diff
changeset
|
83 return enumFullName!T; |
288 | 84 else static if (isNativeType!T) |
302 | 85 return Unqual!T.stringof; |
288 | 86 else |
87 return T.stringof; | |
88 } | |
89 | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
90 /** |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
91 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
|
92 argument argIndex. |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
93 */ |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
94 string generateConvToD(uint argIndex) |
288 | 95 { |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
96 string res = format_ctfe(q{ |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
97 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
98 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
|
99 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
|
100 else static if (isValueType!(Args[${0}])) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
101 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
102 // 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
|
103 alias Args[${0}] Args${0}; |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
104 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
|
105 } |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
106 else static if (isStringType!(Args[${0}])) |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
107 auto _out${0} = QStringUtil.toNativeString(_a[${0}]); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
108 else |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
109 { |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
110 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
|
111 } |
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 }, argIndex); |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
114 |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
115 return res; |
288 | 116 } |
302 | 117 |