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); DOS_API void dos_qurl_to_string(void* vptr, char** result);
// QDeclarative // QDeclarative
DOS_API void dos_qdeclarative_qmlregistertype(const char* uri, int major, int minor, DOS_API void dos_qdeclarative_qmlregistertype(QmlRegisterType qmlRegisterType, int* result);
const char* qmlName, int* result,
void* staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject);
#ifdef __cplusplus #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(*CreateDObject)(void**, void**);
typedef void(*DeleteDObject)(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 struct SignalDefinition
{ {

View File

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

View File

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

View File

@ -648,14 +648,18 @@ void dos_qabstractlistmodel_dataChanged(void *vptr,
model->publicDataChanged(*topLeft, *bottomRight, roles); model->publicDataChanged(*topLeft, *bottomRight, roles);
} }
void dos_qdeclarative_qmlregistertype(const char *uri, int major, int minor, void dos_qdeclarative_qmlregistertype(::QmlRegisterType cArgs, int* result)
const char *qml, int *result,
void *staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
{ {
auto holder = static_cast<DosIQMetaObjectHolder*>(staticMetaObject); auto holder = static_cast<DosIQMetaObjectHolder*>(cArgs.staticMetaObject);
*result = dosQmlRegisterType(uri, major, minor, qml,
*(holder->data()->metaObject()), DOS::QmlRegisterType args;
std::move(createDObject), std::move(deleteDObject)); 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> template<int N>
int dosQmlRegisterType(const char *uri, int major, int minor, int dosQmlRegisterType(QmlRegisterType args)
const char *qmlName, const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
{ {
DosQObjectWrapper<N>::setCreateDObject(std::move(createDObject)); DosQObjectWrapper<N>::setCreateDObject(args.createDObject);
DosQObjectWrapper<N>::setDeleteDObject(std::move(deleteDObject)); DosQObjectWrapper<N>::setDeleteDObject(args.deleteDObject);
DosQObjectWrapper<N>::setStaticMetaObject(staticMetaObject); DosQObjectWrapper<N>::setStaticMetaObject(*args.staticMetaObject);
return qmlRegisterType<DosQObjectWrapper<N>>(uri, major, minor, qmlName); return qmlRegisterType<DosQObjectWrapper<N>>(args.uri, args.major, args.minor, args.qml);
} }
template<int N> template<int N>
struct DosQmlRegisterHelper struct DosQmlRegisterHelper
{ {
static int Register(int i, const char *uri, int major, int minor, static int Register(int i, QmlRegisterType args)
const char *qmlName, const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
{ {
if (i == N) if (i > N)
return dosQmlRegisterType<N>(uri, major, minor, qmlName, staticMetaObject, std::move(createDObject), std::move(deleteDObject)); return -1;
else if (i == N)
return dosQmlRegisterType<N>(std::move(args));
else 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<> template<>
struct DosQmlRegisterHelper<0> struct DosQmlRegisterHelper<0>
{ {
static int Register(int i, const char *uri, int major, int minor, static int Register(int i, QmlRegisterType args)
const char *qmlName, const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
{ {
if (i == 0) return i == 0 ? dosQmlRegisterType<0>(std::move(args)) : -1;
return dosQmlRegisterType<0>(uri, major, minor, qmlName, staticMetaObject, std::move(createDObject), std::move(deleteDObject));
else
return -1;
} }
}; };
int dosQmlRegisterType(const char *uri, int major, int minor, int dosQmlRegisterType(QmlRegisterType args)
const char *qmlName, const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
{ {
static int i = 0; 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));
} }