Mercurial > projects > qtd
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 |