Mercurial > projects > qtd
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); +} +