Mercurial > projects > qtd
annotate d2/qtd/QMetaTypeImpl.d @ 366:da4235301224
Fixed VoidFunc. Updated to dmd.2.047.
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Wed, 23 Jun 2010 21:34:43 +0300 |
parents | bcbfffef4f9e |
children | a032df77b6ab |
rev | line source |
---|---|
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
1 module qtd.QMetaTypeImpl; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
2 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
3 import |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
4 std.traits, |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
5 core.memory, |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
6 core.exception, |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
7 qt.core.Qt, |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
8 qt.core.QDataStream, |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
9 qt.core.QMetaType, |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
10 qtd.QtdObject; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
11 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
12 // TODO: remove |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
13 import std.stdio; |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
14 import std.conv; |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
15 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
16 private struct DArrayToC |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
17 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
18 void[] array; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
19 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
20 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
21 /** |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
22 */ |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
23 template MetaTypeOps(T) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
24 { |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
25 // Note that in case of byref objects we follow Qt's convention and |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
26 // allocate/copy references, not objects. |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
27 static void* construct(void* copy) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
28 { |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
29 auto T* p = cast(T*)GC.malloc(T.sizeof); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
30 if (!p) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
31 onOutOfMemoryError(); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
32 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
33 if (copy) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
34 *p = *cast(T*)copy; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
35 else |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
36 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
37 static if (!is(T == class) && __traits(compiles, T())) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
38 *p = T(); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
39 else static if (isAssociativeArray!T) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
40 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
41 // COMPILER BUG: need to special-case this because AA.init is broken. |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
42 // Consequently, no custom AA init values are supported. |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
43 *p = null; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
44 } |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
45 else |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
46 *p = T.init; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
47 } |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
48 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
49 return p; |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
50 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
51 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
52 static void destroy(void* ptr) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
53 { |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
54 // Run destructors for value types. Let the GC reclaim the memory. |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
55 static if (is(T == struct) && __traits(compiles, T.__dtor)) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
56 (cast(T*)ptr).__dtor; |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
57 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
58 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
59 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
60 /** |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
61 */ |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
62 template MetaTypeStreamOps(T) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
63 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
64 void save(QDataStream ds, const void* data) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
65 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
66 writeln("Saving ", ds.__nativeId, " ", data); |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
67 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
68 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
69 void load(QDataStream ds, void* data) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
70 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
71 writeln("Loading ", ds.__nativeId, " ", data); |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
72 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
73 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
74 |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
75 // TODO: only GNU C++ is supported |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
76 private template typeOpShim(alias op) |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
77 { |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
78 extern(C) void typeOpShim() |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
79 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
80 asm |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
81 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
82 naked; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
83 push EBP; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
84 mov EBP, ESP; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
85 mov EAX, 0x8[EBP]; |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
86 call op; |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
87 leave; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
88 ret; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
89 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
90 } |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
91 } |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
92 |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
93 /** |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
94 */ |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
95 int qRegisterMetaType(T, alias ops = MetaTypeOps)(string name = null) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
96 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
97 if (!name.length) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
98 name = typeid(T).toString; //TODO: use compile time full name |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
99 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
100 return qtd_registerType(toStringz(name), &typeOpShim!(ops!T.destroy), &typeOpShim!(ops!T.construct)); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
101 } |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
102 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
103 version (QtdUnittest) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
104 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
105 unittest |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
106 { |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
107 static class A |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
108 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
109 int x; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
110 } |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
111 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
112 static struct S |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
113 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
114 int x; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
115 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
116 static S* dtorCalled; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
117 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
118 static S opCall(int x = 31) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
119 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
120 S s; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
121 s.x = x; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
122 return s; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
123 } |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
124 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
125 ~this() |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
126 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
127 dtorCalled = &this; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
128 } |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
129 } |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
130 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
131 static void test(T)(T val, string typeName = null) |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
132 { |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
133 int id = qRegisterMetaType!T(typeName); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
134 assert(id > 0); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
135 auto p = cast(T*)QMetaType.construct(id, null); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
136 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
137 assert(*p is T.init); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
138 QMetaType.destroy(id, p); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
139 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
140 p = cast(T*)QMetaType.construct(id, &val); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
141 assert(p !is &val); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
142 assert(*p == val); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
143 QMetaType.destroy(id, p); |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
144 } |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
145 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
146 test(42, "d_int"); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
147 test(new A); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
148 test([1, 2, 3]); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
149 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
150 int sId = qRegisterMetaType!S(); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
151 int saId = qRegisterMetaType!(int[3])(); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
152 int aaId = qRegisterMetaType!(int[int])(); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
153 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
154 // structs |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
155 auto s = S(42); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
156 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
157 auto ps1 = cast(S*)QMetaType.construct(sId, null); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
158 assert(ps1.x == 31); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
159 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
160 auto ps2 = cast(S*)QMetaType.construct(sId, &s); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
161 assert(ps2 !is &s); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
162 assert(ps2.x == 42); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
163 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
164 QMetaType.destroy(sId, ps1); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
165 assert(S.dtorCalled is ps1); |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
166 |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
167 QMetaType.destroy(sId, ps2); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
168 assert(S.dtorCalled is ps2); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
169 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
170 // static arrays |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
171 int sa[3] = [42, 43, 44]; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
172 auto psa = cast(int[3]*)QMetaType.construct(saId, null); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
173 assert(*psa == [0, 0, 0] /* int[3].init */); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
174 QMetaType.destroy(saId, psa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
175 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
176 auto psa2 = cast(int[3]*)QMetaType.construct(saId, &sa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
177 assert(psa2 !is &sa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
178 assert(*psa2 == sa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
179 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
180 // associative arrays |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
181 int[int] aa = [1: 42, 2: 43, 3: 44]; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
182 auto paa = cast(int[int]*)QMetaType.construct(aaId, null); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
183 // COMPILER BUG: AA.init is broken |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
184 // assert (*paa == (int[int]).init); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
185 assert(!(*paa).length); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
186 QMetaType.destroy(aaId, paa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
187 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
188 auto paa2 = cast(int[int]*)QMetaType.construct(aaId, &aa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
189 assert(paa2 !is &aa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
190 assert(*paa2 == aa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
191 QMetaType.destroy(aaId, paa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
192 } |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
193 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
194 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
195 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
196 // COMPILER BUG: cannot put this inside qRegisterMetaTypeStreamOperators |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
197 // COMPILER BUG 2: cannot use extern(C) with templated functions: extern(C) void foo(T)(){} |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
198 private template streamOpShim(alias op) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
199 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
200 extern(C) void streamOpShim() |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
201 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
202 asm |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
203 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
204 naked; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
205 push EBP; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
206 mov EBP, ESP; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
207 mov EAX, 0x8[EBP]; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
208 push EAX; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
209 mov EAX, 0xC[EBP]; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
210 call op; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
211 leave; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
212 ret; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
213 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
214 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
215 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
216 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
217 /** |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
218 */ |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
219 void qRegisterMetaTypeStreamOperators(T, alias ops = MetaTypeStreamOps)(string name = null) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
220 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
221 if (!name.length) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
222 name = typeid(T).toString; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
223 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
224 static void save(void* ds, const void* data) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
225 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
226 scope dataStream = new QDataStream(ds, QtdObjectFlags.nativeOwnership); |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
227 ops!T.save(dataStream, data); |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
228 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
229 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
230 static void load(void* ds, void* data) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
231 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
232 scope dataStream = new QDataStream(ds, QtdObjectFlags.nativeOwnership); |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
233 ops!T.load(dataStream, data); |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
234 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
235 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
236 qtd_registerStreamOperators(toStringz(name), &streamOpShim!save, &streamOpShim!load); |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
237 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
238 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
239 /** |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
240 */ |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
241 private extern(C) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
242 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
243 void qtd_registerStreamOperators(in char *typeName, VoidFunc saveOp, VoidFunc loadOp); |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
244 int qtd_registerType(in char* namePtr, VoidFunc ctor, VoidFunc dtor); |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
245 int qtd_QMetaType_type_nativepointerchar(in char* typeName0); |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
246 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
247 |