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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
359
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
1 module qtd.Core;
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
2
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
3 import
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
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
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
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
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
10 T static_cast(T, U)(U obj)
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
11 {
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
12 return cast(T)cast(void*)obj;
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
13 }
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
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
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
38 enum qtdExtern = "extern (C)";
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
39
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
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
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
42
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
43 static this()
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
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
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
46 }
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
47
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
48 /**
360
49d0a43433e7 typo in comments
maxter <spambox@d-coding.com>
parents: 359
diff changeset
49 Defines a function that can be called from QtD C++ libraries.
49d0a43433e7 typo in comments
maxter <spambox@d-coding.com>
parents: 359
diff changeset
50 The function will be automatically
49d0a43433e7 typo in comments
maxter <spambox@d-coding.com>
parents: 359
diff changeset
51 registered with the DLL at program startup.
359
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
52 */
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
53 string qtdExport(string retType, string name, string args, string funcBody)
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
54 {
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
55 string ret;
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
56 version (cpp_shared) // TODO: cpp_shared implies Windows, which is not correct
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
57 {
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
58 // TODO: hackery to workaround a dmd/optlink bug corrupting symbol names
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
59 // when a direct function pointer export is used
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
60 ret ~= format_ctfe(
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
61 " ${4} ${0} qtd_export_${1}(${2}) { ${3} }\n"
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
62 " ${4} export void qtd_set_${1}(VoidFunc func);\n"
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
63 " static this() { qtd_set_${1}(cast(VoidFunc)&qtd_export_${1}); }\n",
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
64 retType, name, args, funcBody, qtdExtern);
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
65 }
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
66 else
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
67 {
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
68 ret = format_ctfe(
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
69 "${4} ${0} qtd_${1}(${2}) { ${3} }\n",
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
70 retType, name, args, funcBody, qtdExtern);
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
71 }
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
72
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
73 return ret;
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
74 }