annotate d2/qtd/QMetaTypeImpl.d @ 362:bcbfffef4f9e

Undecorated D types can be registered with Qt
author Max Samukha <maxter@maxter.com>
date Wed, 09 Jun 2010 16:37:24 +0300
parents beaf4a2974d7
children a032df77b6ab
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 /**
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