comparison d1/qt/core/QMetaType.d @ 311:8674fd5f34f4 lifetime

Added d1/d2 top directories
author maxter <spambox@d-coding.com>
date Wed, 23 Dec 2009 16:17:22 +0200
parents
children
comparison
equal deleted inserted replaced
310:5bcfe9e7db7f 311:8674fd5f34f4
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.