diff --git a/src/blackmisc/simulation/aircraftmodel.cpp b/src/blackmisc/simulation/aircraftmodel.cpp index 079d56b2a..7aaef3506 100644 --- a/src/blackmisc/simulation/aircraftmodel.cpp +++ b/src/blackmisc/simulation/aircraftmodel.cpp @@ -109,6 +109,28 @@ namespace BlackMisc return QJsonDocument(this->toDatabaseJson()).toJson(format); } + QJsonObject CAircraftModel::toMemoizedJson(MemoHelper::CMemoizer &helper) const + { + QJsonObject json; + auto meta = introspect().without(MetaFlags()); + meta.forEachMemberName(*this, [ & ](const auto & member, CExplicitLatin1String name) + { + auto &&maybeMemo = helper.maybeMemoize(member); + json << std::make_pair(name.toJsonKey(), std::cref(maybeMemo)); + }); + return json; + } + + void CAircraftModel::convertFromMemoizedJson(const QJsonObject &json, const MemoHelper::CUnmemoizer &helper) + { + auto meta = introspect().without(MetaFlags()); + meta.forEachMemberName(*this, [ & ](auto & member, CExplicitLatin1String name) + { + auto it = json.find(name); + if (it != json.end()) { it.value() >> helper.maybeUnmemoize(member).get(); } + }); + } + QString CAircraftModel::asHtmlSummary() const { const QString html = "Model: %1
Aircraft ICAO: %2
Livery: %3"; diff --git a/src/blackmisc/simulation/aircraftmodel.h b/src/blackmisc/simulation/aircraftmodel.h index 603db2a17..541ae7dad 100644 --- a/src/blackmisc/simulation/aircraftmodel.h +++ b/src/blackmisc/simulation/aircraftmodel.h @@ -19,6 +19,7 @@ #include "blackmisc/blackmiscexport.h" #include "blackmisc/db/datastore.h" #include "blackmisc/dictionary.h" +#include "blackmisc/memotable.h" #include "blackmisc/metaclass.h" #include "blackmisc/metaclassprivate.h" #include "blackmisc/orderable.h" @@ -340,6 +341,15 @@ namespace BlackMisc //! Validate BlackMisc::CStatusMessageList validate(bool withNestedObjects) const; + //! Helper class used by implementation. + using MemoHelper = CMemoHelper; + + //! To JSON with memoized members (used by CAircraftModelList) + QJsonObject toMemoizedJson(MemoHelper::CMemoizer &) const; + + //! From JSON with memoized members (used by CAircraftModelList) + void convertFromMemoizedJson(const QJsonObject &json, const MemoHelper::CUnmemoizer &); + //! To database JSON QJsonObject toDatabaseJson() const; diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index 7fb4688fe..59a3a1064 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -13,7 +13,6 @@ #include "blackmisc/aviation/livery.h" #include "blackmisc/compare.h" #include "blackmisc/iterator.h" -#include "blackmisc/metaclassprivate.h" #include "blackmisc/range.h" #include "blackmisc/statusmessage.h" @@ -614,6 +613,38 @@ namespace BlackMisc return msgs; } + QJsonObject CAircraftModelList::toMemoizedJson() const + { + CAircraftModel::MemoHelper::CMemoizer helper; + QJsonArray array; + for (auto it = cbegin(); it != cend(); ++it) + { + array << it->toMemoizedJson(helper); + } + QJsonObject json; + json.insert("containerbase", array); + json.insert("aircraftIcaos", helper.getTable().toJson()); + json.insert("liveries", helper.getTable().toJson()); + json.insert("distributors", helper.getTable().toJson()); + return json; + } + + void CAircraftModelList::convertFromMemoizedJson(const QJsonObject &json) + { + clear(); + QJsonArray array = json.value("containerbase").toArray(); + CAircraftModel::MemoHelper::CUnmemoizer helper; + helper.getTable().convertFromJson(json.value("aircraftIcaos").toObject()); + helper.getTable().convertFromJson(json.value("liveries").toObject()); + helper.getTable().convertFromJson(json.value("distributors").toObject()); + for (auto i = array.begin(); i != array.end(); ++i) + { + CAircraftModel value; + value.convertFromMemoizedJson(i->toObject(), helper); + insert(value); + } + } + QJsonArray CAircraftModelList::toDatabaseJson() const { QJsonArray array; diff --git a/src/blackmisc/simulation/aircraftmodellist.h b/src/blackmisc/simulation/aircraftmodellist.h index ea3f49a58..245a6959e 100644 --- a/src/blackmisc/simulation/aircraftmodellist.h +++ b/src/blackmisc/simulation/aircraftmodellist.h @@ -216,6 +216,12 @@ namespace BlackMisc //! Validate distributors CStatusMessageList validateDistributors(const BlackMisc::Simulation::CDistributorList &distributors, CAircraftModelList &validModels, CAircraftModelList &invalidModels) const; + //! To compact JSON format + QJsonObject toMemoizedJson() const; + + //! From compact JSON format + void convertFromMemoizedJson(const QJsonObject &json); + //! To database JSON QJsonArray toDatabaseJson() const;