comparison d2/qtd/QMetaTypeImpl.d @ 361:beaf4a2974d7

Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
author Max Samukha <maxter@maxter.com>
date Wed, 09 Jun 2010 11:08:56 +0300
parents
children bcbfffef4f9e
comparison
equal deleted inserted replaced
360:49d0a43433e7 361:beaf4a2974d7
1 module qtd.QMetaTypeImpl;
2
3 import
4 qt.core.Qt,
5 qt.core.QDataStream,
6 qtd.QtdObject;
7
8 // TODO: remove
9 import std.stdio;
10
11 private struct DArrayToC
12 {
13 void[] array;
14 }
15
16 /**
17 */
18 template MetaTypeOps(T)
19 {
20 static void* construct(void* copy)
21 {
22 static assert (is(T : Object));
23 return cast(void*)new T(cast(T)copy);
24 }
25
26 static void destroy(void* ptr)
27 {
28 (cast(T)ptr).dispose();
29 }
30 }
31
32 /**
33 */
34 template MetaTypeStreamOps(T)
35 {
36 void save(QDataStream ds, const void* data)
37 {
38 writeln("Saving ", ds.__nativeId, " ", data);
39 }
40
41 void load(QDataStream ds, void* data)
42 {
43 writeln("Loading ", ds.__nativeId, " ", data);
44 }
45 }
46
47 /**
48 */
49 int qRegisterMetaType(T, alias ops = MetaTypeOps)(string name = null)
50 {
51 if (!name.length)
52 name = typeid(T).toString; //TODO: use compile time full name?
53
54 alias ops!T.construct construct;
55 alias ops!T.destroy destroy;
56
57 // TODO: only GNU C++
58 extern(C) static void ctorShim()
59 {
60 asm
61 {
62 naked;
63 push EBP;
64 mov EBP, ESP;
65 mov EAX, 0x8[EBP];
66 call construct;
67 leave;
68 ret;
69 }
70 }
71
72 extern(C) static void dtorShim()
73 {
74 asm
75 {
76 naked;
77 push EBP;
78 mov EBP, ESP;
79 mov EAX, 0x8[EBP];
80 call destroy;
81 leave;
82 ret;
83 }
84 }
85
86 return qtd_registerType(toStringz(name), &dtorShim, &ctorShim);
87 }
88
89
90 // COMPILER BUG: cannot put this inside qRegisterMetaTypeStreamOperators
91 // COMPILER BUG 2: cannot use extern(C) with templated functions: extern(C) void foo(T)(){}
92 private template streamOpShim(alias op)
93 {
94 extern(C) void streamOpShim()
95 {
96 asm
97 {
98 naked;
99 push EBP;
100 mov EBP, ESP;
101 mov EAX, 0x8[EBP];
102 push EAX;
103 mov EAX, 0xC[EBP];
104 call op;
105 leave;
106 ret;
107 }
108 }
109 }
110
111 /**
112 */
113 void qRegisterMetaTypeStreamOperators(T, alias ops = MetaTypeStreamOps)(string name = null)
114 {
115 if (!name.length)
116 name = typeid(T).toString;
117
118 static void save(void* ds, const void* data)
119 {
120 scope dataStream = new QDataStream(ds, QtdObjectFlags.nativeOwnership);
121 ops!T.save(dataStream, data);
122 }
123
124 static void load(void* ds, void* data)
125 {
126 scope dataStream = new QDataStream(ds, QtdObjectFlags.nativeOwnership);
127 ops!T.load(dataStream, data);
128 }
129
130 qtd_registerStreamOperators(toStringz(name), &streamOpShim!save, &streamOpShim!load);
131 }
132
133 /**
134 */
135 private extern(C)
136 {
137 void qtd_registerStreamOperators(in char *typeName, VoidFunc saveOp, VoidFunc loadOp);
138 int qtd_registerType(in char* namePtr, VoidFunc ctor, VoidFunc dtor);
139 int qtd_QMetaType_type_nativepointerchar(in char* typeName0);
140 }
141