Mercurial > projects > qtd
annotate d2/qtd/QMetaTypeImpl.d @ 398:aa08a72d480a
Fixed construction of the ?--include-paths? generation argument in the build system.
Interestingly enough, it doesn't seem to have caused any problems so far.
author | David Nadlinger <code@klickverbot.at> |
---|---|
date | Sat, 15 Jan 2011 22:52:06 +0100 |
parents | a032df77b6ab |
children | b64ca517a6b7 |
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 /** |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
22 Default implementation of constructors/destructors |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
23 registered with Qt when qtd_qRegisterMetaType is called |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
24 for a T. |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
25 |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
26 For Ts that are passed-by-reference objects, we follow Qt's convention and |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
27 allocate/copy references, not objects. To override this behavior, |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
28 supply qtd_qRegisterMetaType with a custom constructor/destructor implementation. |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
29 */ |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
30 template MetaTypeOps(T) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
31 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
32 static void* construct(void* copy) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
33 { |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
34 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
|
35 if (!p) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
36 onOutOfMemoryError(); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
37 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
38 if (copy) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
39 *p = *cast(T*)copy; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
40 else |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
41 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
42 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
|
43 *p = T(); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
44 else static if (isAssociativeArray!T) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
45 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
46 // 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
|
47 // 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
|
48 *p = null; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
49 } |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
50 else |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
51 *p = T.init; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
52 } |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
53 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
54 return p; |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
55 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
56 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
57 static void destroy(void* ptr) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
58 { |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
59 // Run destructors for structs. Let the GC reclaim the memory. |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
60 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
|
61 (cast(T*)ptr).__dtor; |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
62 } |
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 |
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 */ |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
67 template MetaTypeStreamOps(T) |
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 save(QDataStream ds, const 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 } |
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 void load(QDataStream ds, void* data) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
74 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
75 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
76 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
77 |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
78 // TODO: only GNU C++ x86 is supported |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
79 private template typeOpShim(alias op) |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
80 { |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
81 extern(C) void typeOpShim() |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
82 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
83 asm |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
84 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
85 naked; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
86 push EBP; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
87 mov EBP, ESP; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
88 mov EAX, 0x8[EBP]; |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
89 call op; |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
90 leave; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
91 ret; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
92 } |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
93 } |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
94 } |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
95 |
362
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 */ |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
98 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
|
99 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
100 if (!name.length) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
101 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
|
102 |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
103 return qtd_QMetaType_registerType(toStringz(name), &typeOpShim!(ops!T.destroy), &typeOpShim!(ops!T.construct)); |
362
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 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
106 version (QtdUnittest) |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
107 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
108 unittest |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
109 { |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
110 /+ |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
111 static class A |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
112 { |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
113 int x; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
114 } |
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 struct S |
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 int x; |
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 static S* dtorCalled; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
121 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
122 static S opCall(int x = 31) |
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 S s; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
125 s.x = x; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
126 return s; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
127 } |
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 ~this() |
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 dtorCalled = &this; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
132 } |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
133 } |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
134 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
135 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
|
136 { |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
137 int id = qRegisterMetaType!T(typeName); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
138 assert(id > 0); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
139 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
|
140 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
141 assert(*p is T.init); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
142 QMetaType.destroy(id, p); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
143 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
144 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
|
145 assert(p !is &val); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
146 assert(*p == val); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
147 QMetaType.destroy(id, p); |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
148 } |
362
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 test(42, "d_int"); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
151 test(new A); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
152 test([1, 2, 3]); |
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 int sId = qRegisterMetaType!S(); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
155 int saId = qRegisterMetaType!(int[3])(); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
156 int aaId = qRegisterMetaType!(int[int])(); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
157 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
158 // structs |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
159 auto s = S(42); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
160 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
161 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
|
162 assert(ps1.x == 31); |
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 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
|
165 assert(ps2 !is &s); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
166 assert(ps2.x == 42); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
167 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
168 QMetaType.destroy(sId, ps1); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
169 assert(S.dtorCalled is ps1); |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
170 |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
171 QMetaType.destroy(sId, ps2); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
172 assert(S.dtorCalled is ps2); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
173 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
174 // static arrays |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
175 int sa[3] = [42, 43, 44]; |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
176 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
|
177 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
|
178 QMetaType.destroy(saId, psa); |
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 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
|
181 assert(psa2 !is &sa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
182 assert(*psa2 == sa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
183 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
184 // associative arrays |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
185 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
|
186 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
|
187 // COMPILER BUG: AA.init is broken |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
188 // assert (*paa == (int[int]).init); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
189 assert(!(*paa).length); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
190 QMetaType.destroy(aaId, paa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
191 |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
192 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
|
193 assert(paa2 !is &aa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
194 assert(*paa2 == aa); |
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
195 QMetaType.destroy(aaId, paa); |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
196 +/ |
362
bcbfffef4f9e
Undecorated D types can be registered with Qt
Max Samukha <maxter@maxter.com>
parents:
361
diff
changeset
|
197 } |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
198 } |
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 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
201 // 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
|
202 // 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
|
203 private template streamOpShim(alias op) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
204 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
205 extern(C) void streamOpShim() |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
206 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
207 asm |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
208 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
209 naked; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
210 push EBP; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
211 mov EBP, ESP; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
212 mov EAX, 0x8[EBP]; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
213 push EAX; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
214 mov EAX, 0xC[EBP]; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
215 call op; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
216 leave; |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
217 ret; |
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 } |
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 |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
222 /** |
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 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
|
225 { |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
226 if (!name.length) |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
227 name = typeid(T).toString; |
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 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
|
230 { |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
231 scope dataStream = new QDataStream(ds, QtdObjectInitFlags.onStack); |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
232 ops!T.save(dataStream, data); |
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
233 } |
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 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
|
236 { |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
237 scope dataStream = new QDataStream(ds, QtdObjectInitFlags.onStack); |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
238 ops!T.load(dataStream, data); |
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 |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
241 qtd_QMetaType_registerStreamOperators(toStringz(name), &streamOpShim!save, &streamOpShim!load); |
361
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 |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
244 extern(C) |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
245 { |
372
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
246 void qtd_QMetaType_registerStreamOperators(in char *typeName, VoidFunc saveOp, VoidFunc loadOp); |
a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
Max Samukha <maxter@spambox.com>
parents:
362
diff
changeset
|
247 int qtd_QMetaType_registerType(in char* namePtr, VoidFunc ctor, VoidFunc dtor); |
361
beaf4a2974d7
Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
Max Samukha <maxter@maxter.com>
parents:
diff
changeset
|
248 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
|
249 } |