Removed switch duplicated code with a recursive template

This commit is contained in:
Filippo Cucchetto 2016-01-26 23:59:16 +01:00
parent 0506920c4b
commit 4c2570fc42
2 changed files with 36 additions and 28 deletions

View File

@ -655,5 +655,7 @@ void dos_qdeclarative_qmlregistertype(const char *uri, int major, int minor,
DeleteDObject deleteDObject)
{
auto holder = static_cast<DosIQMetaObjectHolder*>(staticMetaObject);
dosQmlRegisterType(uri, major, minor, qml, *(holder->data()->metaObject()), createDObject, deleteDObject);
*result = dosQmlRegisterType(uri, major, minor, qml,
*(holder->data()->metaObject()),
std::move(createDObject), std::move(deleteDObject));
}

View File

@ -2,7 +2,7 @@
#include "DOtherSide/DosIQObjectImpl.h"
#include "DOtherSide/DosQObject.h"
#include <QDebug>
#include <QtQml>
#include <QtQml/qqml.h>
namespace DOS {
@ -105,38 +105,44 @@ int dosQmlRegisterType(const char *uri, int major, int minor,
return qmlRegisterType<DosQObjectWrapper<N>>(uri, major, minor, qmlName);
}
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)
{
if (i == N)
return dosQmlRegisterType<N>(uri, major, minor, qmlName, staticMetaObject, std::move(createDObject), std::move(deleteDObject));
else
return DosQmlRegisterHelper<N-1>::Register(i, uri, major, minor, qmlName, staticMetaObject, std::move(createDObject), std::move(deleteDObject));
}
};
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)
{
if (i == 0)
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,
const char *qmlName, const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
{
static int i = 0;
switch (i++)
{
case 0: return dosQmlRegisterType<0>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 1: return dosQmlRegisterType<1>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 2: return dosQmlRegisterType<2>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 3: return dosQmlRegisterType<3>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 4: return dosQmlRegisterType<4>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 5: return dosQmlRegisterType<5>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 6: return dosQmlRegisterType<6>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 7: return dosQmlRegisterType<7>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 8: return dosQmlRegisterType<8>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 9: return dosQmlRegisterType<9>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 10: return dosQmlRegisterType<10>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 11: return dosQmlRegisterType<11>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 12: return dosQmlRegisterType<12>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 13: return dosQmlRegisterType<13>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 14: return dosQmlRegisterType<14>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 15: return dosQmlRegisterType<15>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 16: return dosQmlRegisterType<16>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 17: return dosQmlRegisterType<17>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 18: return dosQmlRegisterType<18>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 19: return dosQmlRegisterType<19>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 20: return dosQmlRegisterType<20>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
default: return -1;
}
DosQmlRegisterHelper<50>::Register(i++, uri, major, minor, qmlName, staticMetaObject, std::move(createDObject), std::move(deleteDObject));
}