comparison 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
comparison
equal deleted inserted replaced
370:7fd4b69378bf 372:a032df77b6ab
17 { 17 {
18 void[] array; 18 void[] array;
19 } 19 }
20 20
21 /** 21 /**
22 */ 22 Default implementation of constructors/destructors
23 registered with Qt when qtd_qRegisterMetaType is called
24 for a T.
25
26 For Ts that are passed-by-reference objects, we follow Qt's convention and
27 allocate/copy references, not objects. To override this behavior,
28 supply qtd_qRegisterMetaType with a custom constructor/destructor implementation.
29 */
23 template MetaTypeOps(T) 30 template MetaTypeOps(T)
24 { 31 {
25 // Note that in case of byref objects we follow Qt's convention and
26 // allocate/copy references, not objects.
27 static void* construct(void* copy) 32 static void* construct(void* copy)
28 { 33 {
29 auto T* p = cast(T*)GC.malloc(T.sizeof); 34 auto T* p = cast(T*)GC.malloc(T.sizeof);
30 if (!p) 35 if (!p)
31 onOutOfMemoryError(); 36 onOutOfMemoryError();
49 return p; 54 return p;
50 } 55 }
51 56
52 static void destroy(void* ptr) 57 static void destroy(void* ptr)
53 { 58 {
54 // Run destructors for value types. Let the GC reclaim the memory. 59 // Run destructors for structs. Let the GC reclaim the memory.
55 static if (is(T == struct) && __traits(compiles, T.__dtor)) 60 static if (is(T == struct) && __traits(compiles, T.__dtor))
56 (cast(T*)ptr).__dtor; 61 (cast(T*)ptr).__dtor;
57 } 62 }
58 } 63 }
59 64
61 */ 66 */
62 template MetaTypeStreamOps(T) 67 template MetaTypeStreamOps(T)
63 { 68 {
64 void save(QDataStream ds, const void* data) 69 void save(QDataStream ds, const void* data)
65 { 70 {
66 writeln("Saving ", ds.__nativeId, " ", data);
67 } 71 }
68 72
69 void load(QDataStream ds, void* data) 73 void load(QDataStream ds, void* data)
70 { 74 {
71 writeln("Loading ", ds.__nativeId, " ", data); 75 }
72 } 76 }
73 } 77
74 78 // TODO: only GNU C++ x86 is supported
75 // TODO: only GNU C++ is supported
76 private template typeOpShim(alias op) 79 private template typeOpShim(alias op)
77 { 80 {
78 extern(C) void typeOpShim() 81 extern(C) void typeOpShim()
79 { 82 {
80 asm 83 asm
95 int qRegisterMetaType(T, alias ops = MetaTypeOps)(string name = null) 98 int qRegisterMetaType(T, alias ops = MetaTypeOps)(string name = null)
96 { 99 {
97 if (!name.length) 100 if (!name.length)
98 name = typeid(T).toString; //TODO: use compile time full name 101 name = typeid(T).toString; //TODO: use compile time full name
99 102
100 return qtd_registerType(toStringz(name), &typeOpShim!(ops!T.destroy), &typeOpShim!(ops!T.construct)); 103 return qtd_QMetaType_registerType(toStringz(name), &typeOpShim!(ops!T.destroy), &typeOpShim!(ops!T.construct));
101 } 104 }
102 105
103 version (QtdUnittest) 106 version (QtdUnittest)
104 { 107 {
105 unittest 108 unittest
106 { 109 {
110 /+
107 static class A 111 static class A
108 { 112 {
109 int x; 113 int x;
110 } 114 }
111 115
187 191
188 auto paa2 = cast(int[int]*)QMetaType.construct(aaId, &aa); 192 auto paa2 = cast(int[int]*)QMetaType.construct(aaId, &aa);
189 assert(paa2 !is &aa); 193 assert(paa2 !is &aa);
190 assert(*paa2 == aa); 194 assert(*paa2 == aa);
191 QMetaType.destroy(aaId, paa); 195 QMetaType.destroy(aaId, paa);
196 +/
192 } 197 }
193 } 198 }
194 199
195 200
196 // COMPILER BUG: cannot put this inside qRegisterMetaTypeStreamOperators 201 // COMPILER BUG: cannot put this inside qRegisterMetaTypeStreamOperators
221 if (!name.length) 226 if (!name.length)
222 name = typeid(T).toString; 227 name = typeid(T).toString;
223 228
224 static void save(void* ds, const void* data) 229 static void save(void* ds, const void* data)
225 { 230 {
226 scope dataStream = new QDataStream(ds, QtdObjectFlags.nativeOwnership); 231 scope dataStream = new QDataStream(ds, QtdObjectInitFlags.onStack);
227 ops!T.save(dataStream, data); 232 ops!T.save(dataStream, data);
228 } 233 }
229 234
230 static void load(void* ds, void* data) 235 static void load(void* ds, void* data)
231 { 236 {
232 scope dataStream = new QDataStream(ds, QtdObjectFlags.nativeOwnership); 237 scope dataStream = new QDataStream(ds, QtdObjectInitFlags.onStack);
233 ops!T.load(dataStream, data); 238 ops!T.load(dataStream, data);
234 } 239 }
235 240
236 qtd_registerStreamOperators(toStringz(name), &streamOpShim!save, &streamOpShim!load); 241 qtd_QMetaType_registerStreamOperators(toStringz(name), &streamOpShim!save, &streamOpShim!load);
237 } 242 }
238 243
239 /** 244 extern(C)
240 */ 245 {
241 private extern(C) 246 void qtd_QMetaType_registerStreamOperators(in char *typeName, VoidFunc saveOp, VoidFunc loadOp);
242 { 247 int qtd_QMetaType_registerType(in char* namePtr, VoidFunc ctor, VoidFunc dtor);
243 void qtd_registerStreamOperators(in char *typeName, VoidFunc saveOp, VoidFunc loadOp);
244 int qtd_registerType(in char* namePtr, VoidFunc ctor, VoidFunc dtor);
245 int qtd_QMetaType_type_nativepointerchar(in char* typeName0); 248 int qtd_QMetaType_type_nativepointerchar(in char* typeName0);
246 } 249 }
247