annotate qt/qtd/MetaMarshall.d @ 309:8a0cf14e3419 signals

wrong merge
author eldar_ins@eldar-laptop
date Wed, 23 Dec 2009 04:48:11 +0500
parents 2485419c5c63
children ce07227f00c1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
1 module qt.qtd.MetaMarshall;
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
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
5 // utilities
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
6 // shouldn't be here
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
7
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
8 public bool startsWith(T)(T[] source, T[] pattern)
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
9 {
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
10 return source.length >= pattern.length && source[0 .. pattern.length] == pattern[];
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
11 }
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
12
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
13 string __toString(long v)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
14 {
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
15 if (v == 0)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
16 return "0";
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
17
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
18 string ret;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
19
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
20 bool neg;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
21 if (v < 0)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
22 {
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
23 neg = true;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
24 v = -v;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
25 }
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
26
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
27 while (v != 0)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
28 {
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
29 ret = cast(char)(v % 10 + '0') ~ ret;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
30 v = cast(long)(v / 10);
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
31 }
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
32
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
33 if (neg)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
34 ret = "-" ~ ret;
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 return ret;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
37 }
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
38
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
39 template templateParam(U : V!(U), alias V)
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
40 {
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
41 alias U templateParam;
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
42 }
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
43
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
44
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
45 /*
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
46 * actual stuff
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
47 */
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
48
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
49 template isQObjectType(T) // is a QObject type that belongs to the library
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
50 {
292
19498f420252 more QList goodness
eldar
parents: 288
diff changeset
51 enum isQObjectType = is(T.__isQObjectType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
52 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
53
293
8627891e4556 QList updates
eldar
parents: 292
diff changeset
54 template isObjectType(T) // is a Qt Object type that belongs to the library
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
55 {
292
19498f420252 more QList goodness
eldar
parents: 288
diff changeset
56 enum isObjectType = is(T.__isObjectType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
57 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
58
293
8627891e4556 QList updates
eldar
parents: 292
diff changeset
59 template isValueType(T) // is a Qt Value type that belongs to the library
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
60 {
293
8627891e4556 QList updates
eldar
parents: 292
diff changeset
61 enum isValueType = is(T.__isValueType);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
62 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
63
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
64 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
65 {
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
66 enum isNativeType = isNumeric!T || is(T == bool) || is(T == struct);
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
67 }
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
68
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
69 template isStringType(T) // string type
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
70 {
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
71 enum isStringType = is(T == string);
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
72 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
73
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
74 template isQList(T)
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
75 {
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
76 enum isQList = startsWith(Unqual!(T).stringof, "QList!");
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
77 }
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
78
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
79 // converts an argumnent from C++ to D in qt_metacall
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
80 string metaCallArgument(T)(string ptr)
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
81 {
303
98b211f3ee34 fix for #19
eldar_ins@eldar-laptop
parents: 302
diff changeset
82 static if (isQObjectType!T || isObjectType!T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
83 return T.stringof ~ ".__getObject(*cast(void**)(" ~ ptr ~ "))";
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
84 else static if (isNativeType!T)
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
85 return "*(cast(" ~ T.stringof ~ "*)" ~ ptr ~ ")";
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
86 else static if (isStringType!T)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
87 return "QStringUtil.toNativeString(" ~ ptr ~ ")";
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
88 else
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
89 return "*(cast(" ~ T.stringof ~ "*)" ~ ptr ~ ")";
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
90 //res = T.stringof;
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
91 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
92
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
93 // converts a D argument type to C++ for registering in Qt meta system
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
94 string qtDeclArg(T)()
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
95 {
303
98b211f3ee34 fix for #19
eldar_ins@eldar-laptop
parents: 302
diff changeset
96 static if (isQObjectType!T || isObjectType!T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
97 return T.stringof ~ "*";
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
98 else static if (isStringType!T)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
99 return "QString";
309
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
100 else static if (isQList!T)
8a0cf14e3419 wrong merge
eldar_ins@eldar-laptop
parents: 308
diff changeset
101 return "QList<" ~ qtDeclArg!(templateParam!T)() ~ ">";
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
102 else static if (isNativeType!T)
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
103 return Unqual!T.stringof;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
104 else
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
105 return T.stringof;
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
106 }
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
107
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
108 // converts an argument from D to C++ in a signal emitter
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
109 string convertSignalArgument(T)(string arg)
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
110 {
303
98b211f3ee34 fix for #19
eldar_ins@eldar-laptop
parents: 302
diff changeset
111 static if (isQObjectType!T || isObjectType!T)
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
112 return arg ~ ".__nativeId";
302
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
113 else static if (isStringType!T)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
114 return "_qt" ~ arg;
288
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
115 else static if (isNativeType!T)
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
116 return arg;
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
117 else
f9559a957be9 new signals and slots implementation
eldar
parents:
diff changeset
118 return arg;
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
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
121 string prepareSignalArguments(Args...)()
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
122 {
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
123 string res;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
124 foreach(i, _; Args)
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
125 static if (isStringType!(Args[i]))
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
126 res ~= "auto _qt_t" ~ __toString(i) ~ " = QString(_t" ~ __toString(i) ~ ");\n";
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
127 return res;
55ee4603365d string arguments for signals
eldar_ins@eldar-laptop
parents: 293
diff changeset
128 }