annotate d2/qtd/QMetaTypeImpl.d @ 372:a032df77b6ab

Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
author Max Samukha <maxter@spambox.com>
date Thu, 08 Jul 2010 17:19:05 +0300
parents bcbfffef4f9e
children b64ca517a6b7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }