annotate d2/qtd/Core.d @ 359:2013af5d0627

Aded Core.d
author Max Samukha <maxter@spambox.com>
date Wed, 02 Jun 2010 23:19:44 +0300
parents
children 49d0a43433e7
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,
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
5 std.stdio;
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
6
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
7 T static_cast(T, U)(U obj)
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
8 {
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
9 return cast(T)cast(void*)obj;
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
10 }
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 enum qtdExtern = "extern (C)";
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 extern(C) alias void function() VoidFunc;
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
15 extern(C) void qtd_initCore();
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
16
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
17 immutable Object qtdMoLock;
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
18
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
19 static this()
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
20 {
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
21 qtdMoLock = cast(immutable)new Object;
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
22 qtd_initCore();
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
23 }
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
24
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
25 /**
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
26 Defines a function that can be called from QtD C++ libraries,
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
27 which will register the function with the DLL at program startup.
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
28 */
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
29 string qtdExport(string retType, string name, string args, string funcBody)
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
30 {
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
31 string ret;
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
32 version (cpp_shared) // TODO: cpp_shared implies Windows, which is not correct
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
33 {
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
34 // TODO: hackery to workaround a dmd/optlink bug corrupting symbol names
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
35 // when a direct function pointer export is used
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
36 ret ~= format_ctfe(
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
37 " ${4} ${0} qtd_export_${1}(${2}) { ${3} }\n"
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
38 " ${4} export void qtd_set_${1}(VoidFunc func);\n"
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
39 " static this() { qtd_set_${1}(cast(VoidFunc)&qtd_export_${1}); }\n",
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
40 retType, name, args, funcBody, qtdExtern);
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
41 }
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
42 else
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
43 {
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
44 ret = format_ctfe(
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
45 "${4} ${0} qtd_${1}(${2}) { ${3} }\n",
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
46 retType, name, args, funcBody, qtdExtern);
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
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
49 return ret;
2013af5d0627 Aded Core.d
Max Samukha <maxter@spambox.com>
parents:
diff changeset
50 }