Mercurial > projects > qtd
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 |
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, |
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
6 qtd.ctfe.Format; |
288 | 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 | 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 | 12 { |
292 | 13 enum isQObjectType = is(T.__isQObjectType); |
288 | 14 } |
15 | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
16 template isObjectType(T) |
288 | 17 { |
292 | 18 enum isObjectType = is(T.__isObjectType); |
288 | 19 } |
20 | |
350
31520b2c0b3c
Removed dependency on parent trait and stringof
Max Samukha <maxter@spambox.com>
parents:
349
diff
changeset
|
21 template isValueType(T) |
288 | 22 { |
293 | 23 enum isValueType = is(T.__isValueType); |
288 | 24 } |
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 | 36 template isNativeType(T) // type that doesn't require conversion i.e. is the same in C++ and D |
37 { | |
302 | 38 enum isNativeType = isNumeric!T || is(T == bool) || is(T == struct); |
39 } | |
40 | |
41 template isStringType(T) // string type | |
42 { | |
43 enum isStringType = is(T == string); | |
288 | 44 } |
45 | |
309 | 46 template isQList(T) |
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 | 49 } |
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 | 67 |
68 // converts a D argument type to C++ for registering in Qt meta system | |
69 string qtDeclArg(T)() | |
70 { | |
303 | 71 static if (isQObjectType!T || isObjectType!T) |
288 | 72 return T.stringof ~ "*"; |
318 | 73 else static if (isValueType!T) |
74 return T.stringof; | |
302 | 75 else static if (isStringType!T) |
76 return "QString"; | |
309 | 77 else static if (isQList!T) |
318 | 78 { |
79 alias templateParam!T ElementType; | |
80 static if (is(ElementType == string)) | |
81 return "QStringList"; | |
82 else | |
83 return "QList<" ~ qtDeclArg!(templateParam!T)() ~ ">"; | |
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 | 87 else static if (isNativeType!T) |
302 | 88 return Unqual!T.stringof; |
288 | 89 else |
90 return T.stringof; | |
91 } | |
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 | 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 | 119 } |
302 | 120 |