Mercurial > projects > qtd
diff d2/qt/core/QVariant.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 | 96a75b1e5b26 |
children | a032df77b6ab |
line wrap: on
line diff
--- a/d2/qt/core/QVariant.d Thu Jun 03 10:12:29 2010 +0300 +++ b/d2/qt/core/QVariant.d Wed Jun 09 11:08:56 2010 +0300 @@ -90,45 +90,51 @@ // Functions - private template getMetaId() + private int getMetaId(T)(string name) { - const char[] getMetaId = " - int i = qtd_MetatypeId(toStringz(name)); - if(i <= 0) - i = qRegisterMetaType!(T)(name);"; + static shared int sharedId; + static int id; + if (id == 0) + { + synchronized(qtdMoLock) + { + if (sharedId == 0) + sharedId = qRegisterMetaType!T(name); + } + id = sharedId; + } + return id; } static public QVariant fromValue(T)(T obj) { - QVariant var; - static if (is(T == class) || is(T == interface)) - { - string name = obj.classinfo.name; - mixin(getMetaId!()); - var = new QVariant(i, cast(void*)(obj)); - } - else static if (isDynamicArrayType!(T) || isStaticArrayType!(T) ) - { - string name = typeid(ElementTypeOfArray!(T)).toString ~ "[]"; - mixin(getMetaId!()); - auto darray = new DArrayToC; - darray.array = obj.dup; - var = new QVariant(i, cast(void*)(darray)); - } - else - { - string name = typeid(T).toString; - mixin(getMetaId!()); - auto data = new T; - *data = obj; - var = new QVariant(i, cast(void*)(data)); - } - return var; + QVariant var; + static if (is(T == class) || is(T == interface)) + { + string name = obj.classinfo.name; + // TODO: Still hacky. No need to pass name to id getter. + var = new QVariant(getMetaId!T(name), cast(void*)(obj)); + } + else static if (isDynamicArrayType!(T) || isStaticArrayType!(T) ) + { + string name = typeid(ElementTypeOfArray!(T)).toString ~ "[]"; + auto darray = new DArrayToC; + darray.array = obj.dup; + var = new QVariant(getMetaId!T(name), cast(void*)(darray)); + } + else + { + string name = typeid(T).toString; + auto data = new T; + *data = obj; + var = new QVariant(getMetaId!T(name), cast(void*)(data)); + } + return var; } static public QVariant opCall(T)(T obj) { - return fromValue(obj); + return fromValue(obj); } public this() { @@ -304,85 +310,87 @@ super(__qt_return_value); } + // TODO: No need for run time name. Reimplement. private final bool canConvertImpl(string name) { - int i = qtd_MetatypeId(toStringz(name)); - assert(i > 0); - return qtd_QVariant_canConvert(__nativeId, i); + int i = QMetaType.type(toStringz(name)); + assert(i > 0); + return qtd_QVariant_canConvert(__nativeId, i); } + // TODO: reimplement public final bool canConvert(Type)() { - static if ( is(Type == QBitArray) ) - return canConvertImpl("QBitArray"); - else static if ( is(Type == bool) ) - return canConvertImpl("bool"); - else static if ( is(Type == QByteArray) ) - return canConvertImpl("QByteArray"); - else static if ( is(Type == QDate) ) - return canConvertImpl("QDate"); - else static if ( is(Type == QDateTime) ) - return canConvertImpl("QDateTime"); - else static if ( is(Type == double) ) - return canConvertImpl("double"); - else static if ( is(Type == int) ) - return canConvertImpl("int"); - else static if ( is(Type == QLine) ) - return canConvertImpl("QLine"); - else static if ( is(Type == QLineF) ) - return canConvertImpl("QLineF"); - else static if ( is(Type == QLocale) ) - return canConvertImpl("QLocale"); - else static if ( is(Type == long) ) - return canConvertImpl("long"); - else static if ( is(Type == QPoint) ) - return canConvertImpl("QPoint"); - else static if ( is(Type == QPointF) ) - return canConvertImpl("QPointF"); - else static if ( is(Type == QRect) ) - return canConvertImpl("QRect"); - else static if ( is(Type == QRectF) ) - return canConvertImpl("QRectF"); - else static if ( is(Type == QRegExp) ) - return canConvertImpl("QRegExp"); - else static if ( is(Type == QSize) ) - return canConvertImpl("QSize"); - else static if ( is(Type == QSizeF) ) - return canConvertImpl("QSizeF"); - else static if ( is(Type == string) ) - return canConvertImpl("QString"); - else static if ( is(Type == QTime) ) - return canConvertImpl("QTime"); - else static if ( is(Type == uint) ) - return canConvertImpl("unsigned int"); // TODO: - else static if ( is(Type == ulong) ) - return canConvertImpl("unsigned long long"); // TODO: - else static if ( is(Type == QUrl) ) - return canConvertImpl("QUrl"); - else - { - static if( is( Type == class ) || is( Type == interface ) ) - { - Object object = cast(Object)qtd_QVariant_data(__nativeId); - if(object) - return cast(Type)(object) !is null; - return false; - } - else static if (isDynamicArrayType!(Type) || isStaticArrayType!(Type) ) - { - auto array = cast(DArrayToC*)qtd_QVariant_data(__nativeId); - return cast(Type)(array.array) !is null; - } - else - { - int i = qtd_MetatypeId(toStringz(typeid(Type).toString)); - return qtd_QVariant_canConvert(__nativeId, i); - } - } + static if ( is(Type == QBitArray) ) + return canConvertImpl("QBitArray"); + else static if ( is(Type == bool) ) + return canConvertImpl("bool"); + else static if ( is(Type == QByteArray) ) + return canConvertImpl("QByteArray"); + else static if ( is(Type == QDate) ) + return canConvertImpl("QDate"); + else static if ( is(Type == QDateTime) ) + return canConvertImpl("QDateTime"); + else static if ( is(Type == double) ) + return canConvertImpl("double"); + else static if ( is(Type == int) ) + return canConvertImpl("int"); + else static if ( is(Type == QLine) ) + return canConvertImpl("QLine"); + else static if ( is(Type == QLineF) ) + return canConvertImpl("QLineF"); + else static if ( is(Type == QLocale) ) + return canConvertImpl("QLocale"); + else static if ( is(Type == long) ) + return canConvertImpl("long"); + else static if ( is(Type == QPoint) ) + return canConvertImpl("QPoint"); + else static if ( is(Type == QPointF) ) + return canConvertImpl("QPointF"); + else static if ( is(Type == QRect) ) + return canConvertImpl("QRect"); + else static if ( is(Type == QRectF) ) + return canConvertImpl("QRectF"); + else static if ( is(Type == QRegExp) ) + return canConvertImpl("QRegExp"); + else static if ( is(Type == QSize) ) + return canConvertImpl("QSize"); + else static if ( is(Type == QSizeF) ) + return canConvertImpl("QSizeF"); + else static if ( is(Type == string) ) + return canConvertImpl("QString"); + else static if ( is(Type == QTime) ) + return canConvertImpl("QTime"); + else static if ( is(Type == uint) ) + return canConvertImpl("unsigned int"); // TODO: + else static if ( is(Type == ulong) ) + return canConvertImpl("unsigned long long"); // TODO: + else static if ( is(Type == QUrl) ) + return canConvertImpl("QUrl"); + else + { + static if( is( Type == class ) || is( Type == interface ) ) + { + Object object = cast(Object)qtd_QVariant_data(__nativeId); + if(object) + return cast(Type)(object) !is null; + return false; + } + else static if (isDynamicArrayType!(Type) || isStaticArrayType!(Type) ) + { + auto array = cast(DArrayToC*)qtd_QVariant_data(__nativeId); + return cast(Type)(array.array) !is null; + } + else + { + int i = QMetaType.type(toStringz(typeid(Type).toString)); + return qtd_QVariant_canConvert(__nativeId, i); + } + } } public final Type value(Type)() { static if ( is(Type == QBitArray) ) - return toBitArra; + return toBitArray; else static if ( is(Type == bool) ) return toBool; else static if ( is(Type == QByteArray) ) @@ -612,11 +620,11 @@ protected override void __deleteNative() { qtd_QVariant_destructor(__nativeId); } - + public alias void __isValueType; public alias void __isQtType_QVariant; - + struct QTypeInfo { enum bool isComplex = true; @@ -625,7 +633,7 @@ enum bool isPointer = false; enum bool isDummy = false; } - + static void* __constructNativeCopy(const void* orig) { return qtd_QVariant_QVariant_QVariant(cast(void*)orig); } @@ -633,11 +641,11 @@ static void* __constructPlacedNativeCopy(const void* orig, void* place) { return qtd_QVariant_placed_copy(orig, place); } - + public static void __deleteNativeObject(void* ptr) { qtd_QVariant_destructor(ptr); } - + public static void __callNativeDestructor(void* ptr) { qtd_QVariant_call_destructor(ptr); }