Mercurial > projects > qtd
annotate d2/qtd/Core.d @ 372:a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Thu, 08 Jul 2010 17:19:05 +0300 |
parents | 49d0a43433e7 |
children | d2f48c4cb3e3 |
rev | line source |
---|---|
359 | 1 module qtd.Core; |
2 | |
3 import | |
4 qtd.ctfe.Format, | |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
5 std.traits; |
359 | 6 |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
7 /** |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
8 Casts T to U, bypassing dynamic cast checks |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
9 */ |
359 | 10 T static_cast(T, U)(U obj) |
11 { | |
12 return cast(T)cast(void*)obj; | |
13 } | |
14 | |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
15 /** |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
16 Strips qualifiers off the argument. |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
17 */ |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
18 auto ref unqual(T)(auto ref T v) |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
19 { |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
20 static if (__traits(isRef, v)) |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
21 { |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
22 auto p = cast(Unqual!(T)*)&v; |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
23 return *p; |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
24 } |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
25 else |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
26 return cast(Unqual!T)v; |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
27 } |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
28 |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
29 /** |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
30 Just an alias to the type T. Useful for declarations |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
31 with anonymous types. |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
32 */ |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
33 template Type(T) |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
34 { |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
35 alias T Type; |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
36 } |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
37 |
359 | 38 enum qtdExtern = "extern (C)"; |
39 | |
40 extern(C) alias void function() VoidFunc; | |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
41 extern(C) void qtdInitCore(); |
359 | 42 |
43 static this() | |
44 { | |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
360
diff
changeset
|
45 qtdInitCore(); |
359 | 46 } |
47 | |
48 /** | |
360 | 49 Defines a function that can be called from QtD C++ libraries. |
50 The function will be automatically | |
51 registered with the DLL at program startup. | |
359 | 52 */ |
53 string qtdExport(string retType, string name, string args, string funcBody) | |
54 { | |
55 string ret; | |
56 version (cpp_shared) // TODO: cpp_shared implies Windows, which is not correct | |
57 { | |
58 // TODO: hackery to workaround a dmd/optlink bug corrupting symbol names | |
59 // when a direct function pointer export is used | |
60 ret ~= format_ctfe( | |
61 " ${4} ${0} qtd_export_${1}(${2}) { ${3} }\n" | |
62 " ${4} export void qtd_set_${1}(VoidFunc func);\n" | |
63 " static this() { qtd_set_${1}(cast(VoidFunc)&qtd_export_${1}); }\n", | |
64 retType, name, args, funcBody, qtdExtern); | |
65 } | |
66 else | |
67 { | |
68 ret = format_ctfe( | |
69 "${4} ${0} qtd_${1}(${2}) { ${3} }\n", | |
70 retType, name, args, funcBody, qtdExtern); | |
71 } | |
72 | |
73 return ret; | |
74 } |