Mercurial > projects > qtd
comparison d2/qt/core/QMetaType.d @ 344:96a75b1e5b26
project structure changes
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Fri, 14 May 2010 12:14:37 +0300 |
parents | qt/core/QMetaType.d@7dd099050621 |
children | 9784459f0750 |
comparison
equal
deleted
inserted
replaced
343:552647ec0f82 | 344:96a75b1e5b26 |
---|---|
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. |