311
|
1 module qt.core.QMetaType;
|
|
2 public import qt.core.Qt;
|
|
3 private import qt.core.QDataStream;
|
|
4
|
|
5 version (Tango)
|
|
6 {
|
|
7 import tango.core.Array;
|
|
8 import tango.stdc.stringz;
|
|
9 import tango.core.Traits;
|
|
10 }
|
|
11
|
|
12 alias extern(C) void *function(void *copy) Ctor;
|
|
13 alias extern(C) void function(void *obj) Dtor;
|
|
14 alias extern(C) void function(void *stream, void * object) StreamOp;
|
|
15
|
|
16 struct DArrayToC
|
|
17 {
|
|
18 void[] array;
|
|
19 }
|
|
20
|
|
21 public template MetaTypeOps(T)
|
|
22 {
|
|
23 // TODO:
|
|
24 // static assert(typeof(new T), "Type " ~ T.stringof ~ " has no default constructor");
|
|
25 // static assert(typeof(new T(T.init))), "Type " ~ T.stringof ~ " has no default copy constructor");
|
|
26
|
|
27 extern(C) void* ctor(void* copy)
|
|
28 {
|
|
29 static if (is(T == class) || is(T == interface))
|
|
30 {
|
|
31 return cast(void*)(copy ? new T(cast(T)copy) : new T);
|
|
32 }
|
|
33 else static if (isDynamicArrayType!(T) || isStaticArrayType!(T) )
|
|
34 {
|
|
35 auto darray = new DArrayToC;
|
|
36 if(copy)
|
|
37 darray.array = (cast(DArrayToC*)copy).array.dup;
|
|
38 return cast(void*)darray;
|
|
39 }
|
|
40 else
|
|
41 {
|
|
42 auto data = new T;
|
|
43 if(copy)
|
|
44 *data = *cast(T*)copy;
|
|
45 return cast(void*)data;
|
|
46 }
|
|
47 }
|
|
48
|
|
49
|
|
50 extern(C) void dtor(void* obj)
|
|
51 {
|
|
52 static if (is(T == class) || is(T == interface))
|
|
53 {
|
|
54 auto tmp = cast(T)obj;
|
|
55 delete tmp;
|
|
56 }
|
|
57 else
|
|
58 {
|
|
59 auto tmp = cast(T*)obj;
|
|
60 delete tmp;
|
|
61 }
|
|
62 }
|
|
63 }
|
|
64
|
|
65 public int qRegisterMetaType(T)(string name = null)
|
|
66 {
|
|
67 if (!name.length)
|
|
68 name = typeid(T).toString;
|
|
69
|
|
70 return qtd_registerType(toStringz(name), &MetaTypeOps!(T).ctor, &MetaTypeOps!(T).dtor);
|
|
71 }
|
|
72
|
|
73 /* Not work....
|
|
74 private class DataStreamPriv: QDataStream
|
|
75 {
|
|
76 this(void * cobj)
|
|
77 {
|
|
78 super(cobj);
|
|
79 }
|
|
80 }
|
|
81 */
|
|
82 /*
|
|
83 public void qRegisterMetaTypeStreamOperators(T)(void function(ref QDataStream, T ) saveOp, void function (ref QDataStream, ref T) loadOp, string name = null)
|
|
84 {
|
|
85 static void function(ref QDataStream, T ) SaveOp;
|
|
86 static void function (ref QDataStream, ref T) LoadOp;
|
|
87 SaveOp = saveOp;
|
|
88 LoadOp = loadOp;
|
|
89
|
|
90 if (!name.length)
|
|
91 name = typeid(T).toString;
|
|
92
|
|
93 extern(C) void saveOpC(void *stream, void *object)
|
|
94 {
|
|
95 QDataStream dstream = new DataStreamPriv(stream);
|
|
96 Stdout(object).newline;
|
|
97 static if (is(T == class) || is(T == interface))
|
|
98 SaveOp(dstream, cast(T)object);
|
|
99 else
|
|
100 SaveOp(dstream, *cast(T*)object);
|
|
101 }
|
|
102
|
|
103 extern(C) void loadOpC(void *stream, void *object)
|
|
104 {
|
|
105 //return stream;
|
|
106 }
|
|
107
|
|
108 qtd_registerStreamOperators(toStringz(name), cast(StreamOp)&saveOpC, cast(StreamOp)&loadOpC);
|
|
109 }
|
|
110 */
|
|
111 private extern(C) void qtd_registerStreamOperators(char *typeName, StreamOp saveOp, StreamOp loadOp);
|
|
112 private extern(C) int qtd_registerType(in char* namePtr, Ctor ctor, Dtor dtor);
|
|
113 extern(C) int qtd_MetatypeId(in char *id); // TODO: wrap to D. |