Refactoring by using a struct for the qmlRegisterType args

This commit is contained in:
Filippo Cucchetto 2016-01-27 20:08:12 +01:00
parent 4c2570fc42
commit 94353c1045
6 changed files with 51 additions and 47 deletions

View File

@ -167,11 +167,7 @@ DOS_API void dos_qurl_delete(void* vptr);
DOS_API void dos_qurl_to_string(void* vptr, char** result);
// QDeclarative
DOS_API void dos_qdeclarative_qmlregistertype(const char* uri, int major, int minor,
const char* qmlName, int* result,
void* staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject);
DOS_API void dos_qdeclarative_qmlregistertype(QmlRegisterType qmlRegisterType, int* result);
#ifdef __cplusplus
}

View File

@ -33,6 +33,16 @@ typedef void(*HeaderDataCallback) (void* model, int section, int orientation, in
typedef void(*CreateDObject)(void**, void**);
typedef void(*DeleteDObject)(void*);
struct QmlRegisterType
{
int major;
int minor;
const char *uri;
const char *qml;
void *staticMetaObject;
CreateDObject createDObject;
DeleteDObject deleteDObject;
};
struct SignalDefinition
{

View File

@ -12,6 +12,17 @@
namespace DOS
{
struct QmlRegisterType
{
int major;
int minor;
const char *uri;
const char *qml;
const QMetaObject* staticMetaObject;
CreateDObject createDObject;
DeleteDObject deleteDObject;
};
struct SignalDefinition
{
SignalDefinition(QString n,

View File

@ -5,9 +5,5 @@
#include <QtCore/QObject>
namespace DOS {
int dosQmlRegisterType(const char* uri, int major, int minor,
const char* qmlName,
const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject);
int dosQmlRegisterType(QmlRegisterType args);
}

View File

@ -648,14 +648,18 @@ void dos_qabstractlistmodel_dataChanged(void *vptr,
model->publicDataChanged(*topLeft, *bottomRight, roles);
}
void dos_qdeclarative_qmlregistertype(const char *uri, int major, int minor,
const char *qml, int *result,
void *staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
void dos_qdeclarative_qmlregistertype(::QmlRegisterType cArgs, int* result)
{
auto holder = static_cast<DosIQMetaObjectHolder*>(staticMetaObject);
*result = dosQmlRegisterType(uri, major, minor, qml,
*(holder->data()->metaObject()),
std::move(createDObject), std::move(deleteDObject));
auto holder = static_cast<DosIQMetaObjectHolder*>(cArgs.staticMetaObject);
DOS::QmlRegisterType args;
args.major = cArgs.major;
args.minor = cArgs.minor;
args.uri = cArgs.uri;
args.qml = cArgs.qml;
args.staticMetaObject = holder->data()->metaObject();
args.createDObject = cArgs.createDObject;
args.deleteDObject = cArgs.deleteDObject;
*result = dosQmlRegisterType(std::move(args));
}

View File

@ -94,55 +94,42 @@ void DosQObjectWrapper<N>::setStaticMetaObject(const QMetaObject &metaObject)
}
template<int N>
int dosQmlRegisterType(const char *uri, int major, int minor,
const char *qmlName, const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
int dosQmlRegisterType(QmlRegisterType args)
{
DosQObjectWrapper<N>::setCreateDObject(std::move(createDObject));
DosQObjectWrapper<N>::setDeleteDObject(std::move(deleteDObject));
DosQObjectWrapper<N>::setStaticMetaObject(staticMetaObject);
return qmlRegisterType<DosQObjectWrapper<N>>(uri, major, minor, qmlName);
DosQObjectWrapper<N>::setCreateDObject(args.createDObject);
DosQObjectWrapper<N>::setDeleteDObject(args.deleteDObject);
DosQObjectWrapper<N>::setStaticMetaObject(*args.staticMetaObject);
return qmlRegisterType<DosQObjectWrapper<N>>(args.uri, args.major, args.minor, args.qml);
}
template<int N>
struct DosQmlRegisterHelper
{
static int Register(int i, const char *uri, int major, int minor,
const char *qmlName, const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
static int Register(int i, QmlRegisterType args)
{
if (i == N)
return dosQmlRegisterType<N>(uri, major, minor, qmlName, staticMetaObject, std::move(createDObject), std::move(deleteDObject));
if (i > N)
return -1;
else if (i == N)
return dosQmlRegisterType<N>(std::move(args));
else
return DosQmlRegisterHelper<N-1>::Register(i, uri, major, minor, qmlName, staticMetaObject, std::move(createDObject), std::move(deleteDObject));
return DosQmlRegisterHelper<N-1>::Register(i, std::move(args));
}
};
template<>
struct DosQmlRegisterHelper<0>
{
static int Register(int i, const char *uri, int major, int minor,
const char *qmlName, const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
static int Register(int i, QmlRegisterType args)
{
if (i == 0)
return dosQmlRegisterType<0>(uri, major, minor, qmlName, staticMetaObject, std::move(createDObject), std::move(deleteDObject));
else
return -1;
return i == 0 ? dosQmlRegisterType<0>(std::move(args)) : -1;
}
};
int dosQmlRegisterType(const char *uri, int major, int minor,
const char *qmlName, const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
int dosQmlRegisterType(QmlRegisterType args)
{
static int i = 0;
DosQmlRegisterHelper<50>::Register(i++, uri, major, minor, qmlName, staticMetaObject, std::move(createDObject), std::move(deleteDObject));
DosQmlRegisterHelper<35>::Register(i++, std::move(args));
}