diff d2/qtd/QMetaTypeImpl.d @ 361:beaf4a2974d7

Autogeneration of QMetaType. First attempts at fixing qRegisterMetaType etc
author Max Samukha <maxter@maxter.com>
date Wed, 09 Jun 2010 11:08:56 +0300
parents
children bcbfffef4f9e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/d2/qtd/QMetaTypeImpl.d	Wed Jun 09 11:08:56 2010 +0300
@@ -0,0 +1,141 @@
+module qtd.QMetaTypeImpl;
+
+import
+    qt.core.Qt,
+    qt.core.QDataStream,
+    qtd.QtdObject;
+
+// TODO: remove
+import std.stdio;
+
+private struct DArrayToC
+{
+    void[] array;
+}
+
+/**
+ */
+template MetaTypeOps(T)
+{
+    static void* construct(void* copy)
+    {
+        static assert (is(T : Object));
+        return cast(void*)new T(cast(T)copy);
+    }
+
+    static void destroy(void* ptr)
+    {
+        (cast(T)ptr).dispose();
+    }
+}
+
+/**
+ */
+template MetaTypeStreamOps(T)
+{
+    void save(QDataStream ds, const void* data)
+    {
+        writeln("Saving ", ds.__nativeId, " ", data);
+    }
+
+    void load(QDataStream ds, void* data)
+    {
+        writeln("Loading ", ds.__nativeId, " ", data);
+    }
+}
+
+/**
+ */
+int qRegisterMetaType(T, alias ops = MetaTypeOps)(string name = null)
+{
+    if (!name.length)
+        name = typeid(T).toString; //TODO: use compile time full name?
+
+    alias ops!T.construct construct;
+    alias ops!T.destroy destroy;
+
+    // TODO: only GNU C++
+    extern(C) static void ctorShim()
+    {
+        asm
+        {
+            naked;
+            push   EBP;
+            mov    EBP, ESP;
+            mov    EAX, 0x8[EBP];
+            call   construct;
+            leave;
+            ret;
+        }
+    }
+
+    extern(C) static void dtorShim()
+    {
+        asm
+        {
+            naked;
+            push   EBP;
+            mov    EBP, ESP;
+            mov    EAX, 0x8[EBP];
+            call   destroy;
+            leave;
+            ret;
+        }
+    }
+
+    return qtd_registerType(toStringz(name), &dtorShim, &ctorShim);
+}
+
+
+// COMPILER BUG: cannot put this inside qRegisterMetaTypeStreamOperators
+// COMPILER BUG 2: cannot use extern(C) with templated functions: extern(C) void foo(T)(){}
+private template streamOpShim(alias op)
+{
+    extern(C) void streamOpShim()
+    {
+        asm
+        {
+            naked;
+            push   EBP;
+            mov    EBP, ESP;
+            mov    EAX, 0x8[EBP];
+            push   EAX;
+            mov    EAX, 0xC[EBP];
+            call   op;
+            leave;
+            ret;
+        }
+    }
+}
+
+/**
+ */
+void qRegisterMetaTypeStreamOperators(T, alias ops = MetaTypeStreamOps)(string name = null)
+{
+    if (!name.length)
+        name = typeid(T).toString;
+
+    static void save(void* ds, const void* data)
+    {
+        scope dataStream = new QDataStream(ds, QtdObjectFlags.nativeOwnership);
+        ops!T.save(dataStream, data);
+    }
+
+    static void load(void* ds, void* data)
+    {
+        scope dataStream = new QDataStream(ds, QtdObjectFlags.nativeOwnership);
+        ops!T.load(dataStream, data);
+    }
+
+    qtd_registerStreamOperators(toStringz(name), &streamOpShim!save, &streamOpShim!load);
+}
+
+/**
+ */
+private extern(C)
+{
+    void qtd_registerStreamOperators(in char *typeName, VoidFunc saveOp, VoidFunc loadOp);
+    int qtd_registerType(in char* namePtr, VoidFunc ctor, VoidFunc dtor);
+    int qtd_QMetaType_type_nativepointerchar(in char* typeName0);
+}
+