#pragma once // qt #include #include #include #include #include #define INIT_ARRAY_FIELD_FROM_JSON(field) m_##field(json[#field].toArray()) template /*! * \brief The SerializableList class - (de)serializable (from)to json QList * \warning only use this class with basic types or basic G_Object-classes. * don't use pointers as T */ class SerializableList : public QList { public: SerializableList() = default; SerializableList(const QJsonArray& json) : QList() { *this = json; } SerializableList(const QList& other) : QList(other) { } SerializableList(const QJsonObject& json) : SerializableList(QJsonValue(json).toArray()) { } SerializableList(const QJsonValue& json) : SerializableList(json.toArray()) { } SerializableList(std::initializer_list l) : QList(l) { } public: SerializableList& operator=(const QJsonArray& json) { for (const auto& item : json) { // *this << item.toVariant().value(); *this << T(item); } return *this; } SerializableList& operator=(const QJsonObject& json) { return *this = QJsonValue(json); } SerializableList& operator=(const QJsonValue& json) { return *this = json.toArray(); } virtual operator QJsonArray() const { QJsonArray array; for (const auto& item : *this) { array << item; } return array; } virtual operator QJsonValue() const { return QJsonValue(QJsonArray(*this)); } virtual operator QJsonObject() const { return *this; } }; template class SerializableVectorBasic : public QVector { public: SerializableVectorBasic() = default; SerializableVectorBasic(const QJsonArray& json) : QVector() { *this = json; } SerializableVectorBasic(const QVector& other) : QVector(other) { } SerializableVectorBasic(const QJsonObject& json) : SerializableVectorBasic(QJsonValue(json).toArray()) { } SerializableVectorBasic(const QJsonValue& json) : SerializableVectorBasic(json.toArray()) { } SerializableVectorBasic(std::initializer_list l) : QVector(l) { } public: SerializableVectorBasic& operator=(const QJsonArray& json) { for (const auto& item : json) { *this << item.toVariant().value(); // *this << T(item); } return *this; } SerializableVectorBasic& operator=(const QJsonObject& json) { return *this = QJsonValue(json); } SerializableVectorBasic& operator=(const QJsonValue& json) { return *this = json.toArray(); } virtual operator QJsonArray() const { QJsonArray array; for (const auto& item : *this) { // auto v = QJsonValue::fromVariant(item); // array << QJsonValue(item); array << QJsonValue::fromVariant(item); } return array; } virtual operator QJsonValue() const { return QJsonValue(QJsonArray(*this)); } virtual operator QJsonObject() const { return *this; } }; template class SerializableVector : public QVector { public: SerializableVector() = default; SerializableVector(const QJsonArray& json) : QVector() { *this = json; } SerializableVector(const QVector& other) : QVector(other) { } SerializableVector(const QJsonObject& json) : SerializableVector(QJsonValue(json).toArray()) { } SerializableVector(const QJsonValue& json) : SerializableVector(json.toArray()) { } SerializableVector(const QVariant& variant) : SerializableVector(variant.toJsonArray()) { } SerializableVector(std::initializer_list l) : QVector(l) { } public: SerializableVector& operator=(const QJsonArray& json) { for (const auto& item : json) { // *this << item.toVariant().value(); *this << T(item); } return *this; } SerializableVector& operator=(const QJsonObject& json) { return *this = QJsonValue(json); } SerializableVector& operator=(const QJsonValue& json) { return *this = json.toArray(); } virtual operator QJsonArray() const { QJsonArray array; for (const auto& item : *this) { // auto v = QJsonValue::fromVariant(item); array << item; // array << QJsonValue::fromVariant(item); qt_noop(); } return array; } virtual operator QJsonValue() const { return QJsonValue(QJsonArray(*this)); } virtual operator QJsonObject() const { return *this; } virtual operator QVariant() const { return QVariant(QJsonArray(*this)); } };