Mercurial > projects > qtd
diff d2/qtd/QMetaTypeImpl.d @ 372:a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Thu, 08 Jul 2010 17:19:05 +0300 |
parents | bcbfffef4f9e |
children | b64ca517a6b7 |
line wrap: on
line diff
--- a/d2/qtd/QMetaTypeImpl.d Sun Jul 04 14:17:49 2010 +0100 +++ b/d2/qtd/QMetaTypeImpl.d Thu Jul 08 17:19:05 2010 +0300 @@ -19,11 +19,16 @@ } /** - */ + Default implementation of constructors/destructors + registered with Qt when qtd_qRegisterMetaType is called + for a T. + + For Ts that are passed-by-reference objects, we follow Qt's convention and + allocate/copy references, not objects. To override this behavior, + supply qtd_qRegisterMetaType with a custom constructor/destructor implementation. +*/ template MetaTypeOps(T) { - // Note that in case of byref objects we follow Qt's convention and - // allocate/copy references, not objects. static void* construct(void* copy) { auto T* p = cast(T*)GC.malloc(T.sizeof); @@ -51,7 +56,7 @@ static void destroy(void* ptr) { - // Run destructors for value types. Let the GC reclaim the memory. + // Run destructors for structs. Let the GC reclaim the memory. static if (is(T == struct) && __traits(compiles, T.__dtor)) (cast(T*)ptr).__dtor; } @@ -63,16 +68,14 @@ { void save(QDataStream ds, const void* data) { - writeln("Saving ", ds.__nativeId, " ", data); } void load(QDataStream ds, void* data) { - writeln("Loading ", ds.__nativeId, " ", data); } } -// TODO: only GNU C++ is supported +// TODO: only GNU C++ x86 is supported private template typeOpShim(alias op) { extern(C) void typeOpShim() @@ -97,13 +100,14 @@ if (!name.length) name = typeid(T).toString; //TODO: use compile time full name - return qtd_registerType(toStringz(name), &typeOpShim!(ops!T.destroy), &typeOpShim!(ops!T.construct)); + return qtd_QMetaType_registerType(toStringz(name), &typeOpShim!(ops!T.destroy), &typeOpShim!(ops!T.construct)); } version (QtdUnittest) { unittest { + /+ static class A { int x; @@ -189,6 +193,7 @@ assert(paa2 !is &aa); assert(*paa2 == aa); QMetaType.destroy(aaId, paa); + +/ } } @@ -223,25 +228,22 @@ static void save(void* ds, const void* data) { - scope dataStream = new QDataStream(ds, QtdObjectFlags.nativeOwnership); + scope dataStream = new QDataStream(ds, QtdObjectInitFlags.onStack); ops!T.save(dataStream, data); } static void load(void* ds, void* data) { - scope dataStream = new QDataStream(ds, QtdObjectFlags.nativeOwnership); + scope dataStream = new QDataStream(ds, QtdObjectInitFlags.onStack); ops!T.load(dataStream, data); } - qtd_registerStreamOperators(toStringz(name), &streamOpShim!save, &streamOpShim!load); + qtd_QMetaType_registerStreamOperators(toStringz(name), &streamOpShim!save, &streamOpShim!load); } -/** - */ -private extern(C) +extern(C) { - void qtd_registerStreamOperators(in char *typeName, VoidFunc saveOp, VoidFunc loadOp); - int qtd_registerType(in char* namePtr, VoidFunc ctor, VoidFunc dtor); + void qtd_QMetaType_registerStreamOperators(in char *typeName, VoidFunc saveOp, VoidFunc loadOp); + int qtd_QMetaType_registerType(in char* namePtr, VoidFunc ctor, VoidFunc dtor); int qtd_QMetaType_type_nativepointerchar(in char* typeName0); } -