diff options
6 files changed, 99 insertions, 11 deletions
diff --git a/src/tools/ivigenerator/templates_control_panel/module.cpp.tpl b/src/tools/ivigenerator/templates_control_panel/module.cpp.tpl index 66978f9..6659acb 100644 --- a/src/tools/ivigenerator/templates_control_panel/module.cpp.tpl +++ b/src/tools/ivigenerator/templates_control_panel/module.cpp.tpl @@ -68,6 +68,24 @@ QObject* {{class|lower}}_singletontype_provider(QQmlEngine*, QJSEngine*) { } +{% for enum in module.enums %} +{{class}}::{{enum}} {{class}}::to{{enum}}(quint8 v, bool *ok) { + if (ok) { + *ok = true; + } + switch (v) { +{% for member in enum.members %} + case {{member.value}}: return {{member.name}}; +{% endfor %} + default: + if (ok) { + *ok = false; + } + return {{enum.members|first}}; + } +} +{% endfor %} + /*! \internal */ void {{class}}::registerTypes() { @@ -109,14 +127,18 @@ QSimulatorServer *{{class}}::simulationServer() {% for enum in module.enums %} QDataStream &operator<<(QDataStream &out, {{class}}::{{enum|flag_type}} var) { - out << (int)var; + out << (quint8)var; return out; } QDataStream &operator>>(QDataStream &in, {{class}}::{{enum|flag_type}} &var) { - int temp; - in >> temp; - var = ({{class}}::{{enum|flag_type}})temp; + bool ok; + quint8 val; + in >> val; + var = {{class}}::to{{enum}}(val, &ok); + if (!ok) { + qWarning() << "Received an invalid enum value for type {{class}}::{{enum|flag_type}}, value =" << var; + } return in; } {% endfor %} diff --git a/src/tools/ivigenerator/templates_control_panel/module.h.tpl b/src/tools/ivigenerator/templates_control_panel/module.h.tpl index bd23ccc..15f81f2 100644 --- a/src/tools/ivigenerator/templates_control_panel/module.h.tpl +++ b/src/tools/ivigenerator/templates_control_panel/module.h.tpl @@ -68,7 +68,7 @@ public: {% else %} Q_ENUM({{enum}}) {% endif %} - + static {{enum}} to{{enum}}(quint8 v, bool *ok); {% endfor %} static void registerTypes(); diff --git a/src/tools/ivigenerator/templates_frontend/module.cpp.tpl b/src/tools/ivigenerator/templates_frontend/module.cpp.tpl index 2ce7b9b..2a2d7b9 100644 --- a/src/tools/ivigenerator/templates_frontend/module.cpp.tpl +++ b/src/tools/ivigenerator/templates_frontend/module.cpp.tpl @@ -46,6 +46,7 @@ #include "{{interface|lower}}.h" {% endfor %} #include <QQmlEngine> +#include <QDebug> #include <QDataStream> QT_BEGIN_NAMESPACE @@ -79,6 +80,24 @@ QObject* {{class|lower}}_singletontype_provider(QQmlEngine*, QJSEngine*) { } +{% for enum in module.enums %} +{{class}}::{{enum}} {{class}}::to{{enum}}(quint8 v, bool *ok) { + if (ok) { + *ok = true; + } + switch (v) { +{% for member in enum.members %} + case {{member.value}}: return {{member.name}}; +{% endfor %} + default: + if (ok) { + *ok = false; + } + return {{enum.members|first}}; + } +} + +{% endfor %} /*! \internal */ void {{class}}::registerTypes() { @@ -88,6 +107,7 @@ void {{class}}::registerTypes() {% endfor %} {% for struct in module.structs %} qRegisterMetaType<{{struct}}>(); + qRegisterMetaTypeStreamOperators<{{struct}}>(); {% endfor %} } @@ -101,18 +121,23 @@ void {{class}}::registerQmlTypes(const QString& uri, int majorVersion, int minor {{interface}}::registerQmlTypes(uri, majorVersion, minorVersion); {% endfor %} } - {% for enum in module.enums %} + QDataStream &operator<<(QDataStream &out, {{class}}::{{enum|flag_type}} var) { - out << (int)var; + out << (quint8)var; return out; } + QDataStream &operator>>(QDataStream &in, {{class}}::{{enum|flag_type}} &var) { - int temp; - in >> temp; - var = ({{class}}::{{enum|flag_type}})temp; + bool ok; + quint8 val; + in >> val; + var = {{class}}::to{{enum}}(val, &ok); + if (!ok) { + qWarning() << "Received an invalid enum value for type {{class}}::{{enum|flag_type}}, value =" << var; + } return in; } {% endfor %} diff --git a/src/tools/ivigenerator/templates_frontend/module.h.tpl b/src/tools/ivigenerator/templates_frontend/module.h.tpl index 6520091..7869ea5 100644 --- a/src/tools/ivigenerator/templates_frontend/module.h.tpl +++ b/src/tools/ivigenerator/templates_frontend/module.h.tpl @@ -71,7 +71,7 @@ public: {% else %} Q_ENUM({{enum}}) {% endif %} - + static {{enum}} to{{enum}}(quint8 v, bool *ok); {% endfor %} static void registerTypes(); diff --git a/src/tools/ivigenerator/templates_frontend/struct.cpp.tpl b/src/tools/ivigenerator/templates_frontend/struct.cpp.tpl index d1134a4..ca0c7f8 100644 --- a/src/tools/ivigenerator/templates_frontend/struct.cpp.tpl +++ b/src/tools/ivigenerator/templates_frontend/struct.cpp.tpl @@ -93,4 +93,35 @@ void {{class}}::set{{field|upperfirst}}({{ field|parameter_type }}) {% endfor %} +bool operator==(const {{class}} &left, const {{class}} &right) Q_DECL_NOTHROW +{ + return ( +{% for field in struct.fields %} + left.{{field}}() == right.{{field}}() {% if not loop.last %}&&{% endif %} + +{% endfor %} + ); +} + +bool operator!=(const {{class}} &left, const {{class}} &right) Q_DECL_NOTHROW +{ + return !(left == right); +} + +QDataStream &operator<<(QDataStream &stream, const {{class}} &obj) +{ +{% for field in struct.fields %} + stream << obj.{{field}}(); +{% endfor %} + return stream; +} + +QDataStream &operator>>(QDataStream &stream, {{class}} &obj) +{ +{% for field in struct.fields %} + stream >> obj.m_{{field}}; +{% endfor %} + return stream; +} + QT_END_NAMESPACE diff --git a/src/tools/ivigenerator/templates_frontend/struct.h.tpl b/src/tools/ivigenerator/templates_frontend/struct.h.tpl index 84b8c4f..0438a87 100644 --- a/src/tools/ivigenerator/templates_frontend/struct.h.tpl +++ b/src/tools/ivigenerator/templates_frontend/struct.h.tpl @@ -47,6 +47,7 @@ #include "{{module.module_name|lower}}module.h" #include <QObject> +#include <QDataStream> QT_BEGIN_NAMESPACE @@ -69,12 +70,21 @@ public: {% endif %} {% endfor %} + private: {% for field in struct.fields %} {{field|return_type}} m_{{field}}; {% endfor %} + + friend QDataStream &operator>>(QDataStream &stream, {{class}} &obj); }; +bool operator==(const {{class}} &left, const {{class}} &right) Q_DECL_NOTHROW; +bool operator!=(const {{class}} &left, const {{class}} &right) Q_DECL_NOTHROW; + +QDataStream &operator<<(QDataStream &stream, const {{class}} &obj); +QDataStream &operator>>(QDataStream &stream, {{class}} &obj); + QT_END_NAMESPACE Q_DECLARE_METATYPE({{class}}) |