annotate d2/qtd/Marshal.d @ 350:31520b2c0b3c

Removed dependency on parent trait and stringof
author Max Samukha <maxter@spambox.com>
date Thu, 20 May 2010 15:49:08 +0300
parents 925386e0e780
children 9784459f0750
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,
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
6 qtd.ctfe.Format;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
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
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
9
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
10
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
11 template isQObjectType(T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
12 {
292
19498f420252 more QList goodness
eldar
parents: 288
diff changeset
13 enum isQObjectType = is(T.__isQObjectType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
14 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
15
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
16 template isObjectType(T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
17 {
292
19498f420252 more QList goodness
eldar
parents: 288
diff changeset
18 enum isObjectType = is(T.__isObjectType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
19 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
20
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
21 template isValueType(T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
22 {
293
8627891e4556 QList updates
eldar
parents: 292
diff changeset
23 enum isValueType = is(T.__isValueType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
24 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
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 */
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
36 template isNativeType(T) // type that doesn't require conversion i.e. is the same in C++ and D
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
37 {
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
38 enum isNativeType = isNumeric!T || is(T == bool) || is(T == struct);
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
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
41 template isStringType(T) // string type
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
42 {
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
43 enum isStringType = is(T == string);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
44 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
45
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
46 template isQList(T)
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
47 {
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
48 enum isQList = startsWith(Unqual!(T).stringof, "QList!");
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
49 }
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
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
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
67
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
68 // converts a D argument type to C++ for registering in Qt meta system
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
69 string qtDeclArg(T)()
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
70 {
303
98b211f3ee34 fix for #19
eldar_ins@eldar-laptop
parents: 302
diff changeset
71 static if (isQObjectType!T || isObjectType!T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
72 return T.stringof ~ "*";
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
73 else static if (isValueType!T)
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
74 return T.stringof;
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
75 else static if (isStringType!T)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
76 return "QString";
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
77 else static if (isQList!T)
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
78 {
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
79 alias templateParam!T ElementType;
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
80 static if (is(ElementType == string))
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
81 return "QStringList";
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
82 else
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
83 return "QList<" ~ qtDeclArg!(templateParam!T)() ~ ">";
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
84 }
339
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
85 else static if (is(T == enum))
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
86 return enumFullName!T;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
87 else static if (isNativeType!T)
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
88 return Unqual!T.stringof;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
89 else
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
90 return T.stringof;
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
91 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
92
350
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 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
95 argument argIndex.
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
96 */
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
97 string generateConvToD(uint argIndex)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
98 {
350
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
99 string res = format_ctfe(q{
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
100
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
101 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
102 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
103 else static if (isValueType!(Args[${0}]))
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
104 {
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
105 // COMPILER BUG: 'new' chokes on Args[argIndex], hence the alias
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
106 alias Args[${0}] Args${0};
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
107 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
108 }
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
109 else static if (isStringType!(Args[${0}]))
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
110 auto _out${0} = QStringUtil.toNativeString(_a[${0}]);
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
111 else
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 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
114 }
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 }, argIndex);
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
117
31520b2c0b3c Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents: 349
diff changeset
118 return res;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
119 }
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
120