annotate d2/qtd/Marshal.d @ 402:e67ce7c21758

gdc & 64 bit changes
author Eldar Insafutdinov
date Thu, 17 Mar 2011 19:45:42 +0000
parents da4235301224
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
349
925386e0e780 renamed MetaMarshall.d
maxter <spambox@d-coding.com>
parents: 344
diff changeset
1 module qtd.Marshal;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
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
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
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
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
11 {
292
19498f420252 more QList goodness
eldar
parents: 288
diff changeset
12 enum isQObjectType = is(T.__isQObjectType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
13 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
14
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
15 template isObjectType(T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
16 {
292
19498f420252 more QList goodness
eldar
parents: 288
diff changeset
17 enum isObjectType = is(T.__isObjectType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
18 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
19
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
20 template isValueType(T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
21 {
293
8627891e4556 QList updates
eldar
parents: 292
diff changeset
22 enum isValueType = is(T.__isValueType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
23 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
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
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
36 {
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
37 enum isNativeType = isNumeric!T || is(T == bool) || is(T == struct);
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
38 }
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
39
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
40 template isStringType(T) // string type
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
41 {
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
42 enum isStringType = is(T == string);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
43 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
44
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
45 template isQList(T)
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
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
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
48 }
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
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
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
66 // converts a D argument type to C++ for registering in Qt meta system
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
67 string qtDeclArg(T)()
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
68 {
303
98b211f3ee34 fix for #19
eldar_ins@eldar-laptop
parents: 302
diff changeset
69 static if (isQObjectType!T || isObjectType!T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
70 return T.stringof ~ "*";
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
71 else static if (isValueType!T)
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
72 return T.stringof;
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
73 else static if (isStringType!T)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
74 return "QString";
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
75 else static if (isQList!T)
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
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
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
78 return "QStringList";
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
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
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
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
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
84 else static if (isNativeType!T)
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
85 return Unqual!T.stringof;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
86 else
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
87 return T.stringof;
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
88 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
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 */
402
e67ce7c21758 gdc & 64 bit changes
Eldar Insafutdinov
parents: 366
diff changeset
94 string generateConvToD(size_t argIndex)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
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
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
116 }
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
117