annotate d2/qtd/Marshal.d @ 349:925386e0e780

renamed MetaMarshall.d
author maxter <spambox@d-coding.com>
date Mon, 17 May 2010 21:48:15 +0300
parents d2/qtd/MetaMarshall.d@96a75b1e5b26
children 31520b2c0b3c
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
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
3 import std.traits;
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
4
344
96a75b1e5b26 project structure changes
Max Samukha <maxter@spambox.com>
parents: 339
diff changeset
5 import qtd.Meta;
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
6
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
7 template isQObjectType(T) // is a QObject type that belongs to the library
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
8 {
292
19498f420252 more QList goodness
eldar
parents: 288
diff changeset
9 enum isQObjectType = is(T.__isQObjectType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
10 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
11
293
8627891e4556 QList updates
eldar
parents: 292
diff changeset
12 template isObjectType(T) // is a Qt Object type that belongs to the library
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
13 {
292
19498f420252 more QList goodness
eldar
parents: 288
diff changeset
14 enum isObjectType = is(T.__isObjectType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
15 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
16
293
8627891e4556 QList updates
eldar
parents: 292
diff changeset
17 template isValueType(T) // is a Qt Value type that belongs to the library
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
18 {
293
8627891e4556 QList updates
eldar
parents: 292
diff changeset
19 enum isValueType = is(T.__isValueType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
20 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
21
339
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
22 template isQtType(T)
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
23 {
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
24 mixin ("enum isQtType = is(T.__isQtType_" ~ T.stringof ~ ");");
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
25 }
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 template isQtType(T)
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 enum isQtType = isQObjectType!(T) || isObjectType!(T) || isValueType!(T) || is(T.__isQtType);
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 */
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
32 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
33 {
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
34 enum isNativeType = isNumeric!T || is(T == bool) || is(T == struct);
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
35 }
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
36
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
37 template isStringType(T) // string type
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 enum isStringType = is(T == string);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
40 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
41
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
42 template isQList(T)
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
43 {
319
894d40eb89b6 new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
eldar_ins@eldar-laptop
parents: 318
diff changeset
44 enum isQList = ctfeStartsWith(Unqual!(T).stringof, "QList!");
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
45 }
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
46
339
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
47 // returns full name of enum:
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
48 // for Qt enum it is in the form of QPaintDevice::PaintDeviceMetric
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
49 // for pure D enums it is Foo.Bar
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
50 template enumFullName(T)
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
51 {
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
52 static if(!isModule(__traits(parent, T).stringof))
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
53 {
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
54 static if(isQtType!(__traits(parent, T)))
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
55 enum enumFullName = qualifiedCppName!T;
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
56 else
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
57 enum enumFullName = qualifiedDName!T;
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
58 }
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;
349
925386e0e780 renamed MetaMarshall.d
maxter <spambox@d-coding.com>
parents: 344
diff changeset
61
339
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
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
64 // converts an argumnent from C++ to D in qt_metacall
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
65 string metaCallArgument(T)(string ptr)
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
66 {
303
98b211f3ee34 fix for #19
eldar_ins@eldar-laptop
parents: 302
diff changeset
67 static if (isQObjectType!T || isObjectType!T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
68 return T.stringof ~ ".__getObject(*cast(void**)(" ~ ptr ~ "))";
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
69 else static if (isValueType!T)
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
70 return "new " ~ T.stringof ~ "(" ~ T.stringof ~ ".__constructNativeCopy(" ~ ptr ~ "))";
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
71 else static if (isNativeType!T)
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
72 return "*(cast(" ~ T.stringof ~ "*)" ~ ptr ~ ")";
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 "QStringUtil.toNativeString(" ~ ptr ~ ")";
339
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
75 else static if (is(T == enum))
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
76 return "*(cast(" ~ qualifiedDName!T ~ "*)" ~ ptr ~ ")";
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
77 else
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
78 return "*(cast(" ~ T.stringof ~ "*)" ~ ptr ~ ")";
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
79 //res = T.stringof;
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
80 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
81
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
82 // converts a D argument type to C++ for registering in Qt meta system
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
83 string qtDeclArg(T)()
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
84 {
303
98b211f3ee34 fix for #19
eldar_ins@eldar-laptop
parents: 302
diff changeset
85 static if (isQObjectType!T || isObjectType!T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
86 return T.stringof ~ "*";
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
87 else static if (isValueType!T)
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
88 return T.stringof;
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
89 else static if (isStringType!T)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
90 return "QString";
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
91 else static if (isQList!T)
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
92 {
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
93 alias templateParam!T ElementType;
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
94 static if (is(ElementType == string))
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
95 return "QStringList";
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
96 else
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
97 return "QList<" ~ qtDeclArg!(templateParam!T)() ~ ">";
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
98 }
339
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
99 else static if (is(T == enum))
4e31cbd9e20c fix enumeration problems. requires patched dmd
Eldar Insafutdinov
parents: 323
diff changeset
100 return enumFullName!T;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
101 else static if (isNativeType!T)
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
102 return Unqual!T.stringof;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
103 else
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
104 return T.stringof;
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
105 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
106
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
107 // converts an argument from D to C++ in a signal emitter
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
108 string convertSignalArgument(T)(string arg)
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
109 {
303
98b211f3ee34 fix for #19
eldar_ins@eldar-laptop
parents: 302
diff changeset
110 static if (isQObjectType!T || isObjectType!T)
323
7a3c43424dca make all examples compile with new signals/slots
eldar_ins@eldar-laptop
parents: 319
diff changeset
111 return arg ~ " ? " "&" ~ arg ~ ".__nativeId : cast(void**) &" ~ arg; // since it is a pointer type check arg for null
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
112 else static if (isValueType!T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
113 return arg ~ ".__nativeId";
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
114 else static if (isStringType!T)
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
115 return "&_qt" ~ arg;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
116 else static if (isNativeType!T)
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
117 return "&" ~ arg;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
118 else
318
ce07227f00c1 more signals and QList
eldar_ins@eldar-laptop
parents: 309
diff changeset
119 return "&" ~ arg;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
120 }
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
121
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
122 string prepareSignalArguments(Args...)()
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
123 {
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
124 string res;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
125 foreach(i, _; Args)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
126 static if (isStringType!(Args[i]))
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
127 res ~= "auto _qt_t" ~ __toString(i) ~ " = QString(_t" ~ __toString(i) ~ ");\n";
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
128 return res;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
129 }