diff --git a/src/blackmisc/simulation/data/modelcaches.cpp b/src/blackmisc/simulation/data/modelcaches.cpp index dbd7771e0..38badfe6e 100644 --- a/src/blackmisc/simulation/data/modelcaches.cpp +++ b/src/blackmisc/simulation/data/modelcaches.cpp @@ -492,60 +492,6 @@ namespace BlackMisc break; } } - - CCentralMultiSimulatorModelCachesProvider &CCentralMultiSimulatorModelCachesProvider::modelCachesInstance() - { - static CCentralMultiSimulatorModelCachesProvider c; - return c; - } - - CAircraftModelList CCentralMultiSimulatorModelCachesProvider::getCachedModels(const CSimulatorInfo &simulator) const - { - return instanceCaches().getCachedModels(simulator); - } - - CStatusMessage CCentralMultiSimulatorModelCachesProvider::setCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator) - { - return instanceCaches().setCachedModels(models, simulator); - } - - QDateTime CCentralMultiSimulatorModelCachesProvider::getCacheTimestamp(const CSimulatorInfo &simulator) const - { - return instanceCaches().getCacheTimestamp(simulator); - } - - CStatusMessage CCentralMultiSimulatorModelCachesProvider::setCacheTimestamp(const QDateTime &ts, const CSimulatorInfo &simulator) - { - return instanceCaches().setCacheTimestamp(ts, simulator); - } - - void CCentralMultiSimulatorModelCachesProvider::synchronizeCache(const CSimulatorInfo &simulator) - { - return instanceCaches().synchronizeCache(simulator); - } - - void CCentralMultiSimulatorModelCachesProvider::admitCache(const CSimulatorInfo &simulator) - { - return instanceCaches().admitCache(simulator); - } - - QString CCentralMultiSimulatorModelCachesProvider::getFilename(const CSimulatorInfo &simulator) const - { - return instanceCaches().getFilename(simulator); - } - - bool CCentralMultiSimulatorModelCachesProvider::isSaved(const CSimulatorInfo &simulator) const - { - return instanceCaches().isSaved(simulator); - } - - QString CCentralMultiSimulatorModelCachesProvider::getDescription() const - { - return instanceCaches().getDescription(); - } - - CCentralMultiSimulatorModelCachesProvider::CCentralMultiSimulatorModelCachesProvider(QObject *parent) : IMultiSimulatorModelCaches(parent) - { } } // ns } // ns } // ns diff --git a/src/blackmisc/simulation/data/modelcaches.h b/src/blackmisc/simulation/data/modelcaches.h index 16506126d..856d4fba4 100644 --- a/src/blackmisc/simulation/data/modelcaches.h +++ b/src/blackmisc/simulation/data/modelcaches.h @@ -157,6 +157,12 @@ namespace BlackMisc Q_INTERFACES(BlackMisc::Simulation::IModelsForSimulatorUpdatable) public: + //! \copydoc IModelsForSimulatorSetable::setModelsForSimulator + virtual void setModelsForSimulator(const CAircraftModelList &models, const CSimulatorInfo &simulator) override; + + //! \copydoc IModelsForSimulatorUpdatable::updateModelsForSimulator + virtual int updateModelsForSimulator(const CAircraftModelList &models, const CSimulatorInfo &simulator) override; + //! Models for simulator //! \threadsafe virtual CAircraftModelList getCachedModels(const CSimulatorInfo &simulator) const = 0; @@ -187,6 +193,7 @@ namespace BlackMisc virtual QDateTime getCacheTimestamp(const CSimulatorInfo &simulator) const = 0; //! Set cache timestamp + //! \threadsafe virtual CStatusMessage setCacheTimestamp(const QDateTime &ts, const CSimulatorInfo &simulator) = 0; //! Cache saved? @@ -198,6 +205,7 @@ namespace BlackMisc CSimulatorInfo simulatorsWithInitializedCache() const; //! Timestamp + //! \threadsafe QDateTime getSynchronizedTimestamp(const CSimulatorInfo &simulator); //! Set cached models @@ -209,18 +217,13 @@ namespace BlackMisc virtual CStatusMessage clearCachedModels(const CSimulatorInfo &simulator); //! Synchronize for given simulator + //! \threadsafe virtual void synchronizeCache(const CSimulatorInfo &simulator) = 0; //! Admit the cache for given simulator //! \threadsafe virtual void admitCache(const CSimulatorInfo &simulator) = 0; - //! \copydoc IModelsForSimulatorSetable::setModels - virtual void setModelsForSimulator(const CAircraftModelList &models, const CSimulatorInfo &simulator) override; - - //! \copydoc IModelsForSimulatorUpdatable::updateModels - virtual int updateModelsForSimulator(const CAircraftModelList &models, const CSimulatorInfo &simulator) override; - //! Info string about models in cache QString getInfoString() const; @@ -284,10 +287,10 @@ namespace BlackMisc //! @} private: - CData m_modelCacheFsx {this, &CModelCaches::changedFsx }; //!< FSX cache - CData m_modelCacheFs9 {this, &CModelCaches::changedFs9 }; //!< FS9 cache - CData m_modelCacheP3D {this, &CModelCaches::changedP3D }; //!< P3D cache - CData m_modelCacheXP {this, &CModelCaches::changedXP }; //!< XP cache + CData m_modelCacheFsx { this, &CModelCaches::changedFsx }; //!< FSX cache + CData m_modelCacheFs9 { this, &CModelCaches::changedFs9 }; //!< FS9 cache + CData m_modelCacheP3D { this, &CModelCaches::changedP3D }; //!< P3D cache + CData m_modelCacheXP { this, &CModelCaches::changedXP }; //!< XP cache //! Non virtual version (can be used in ctor) void synchronizeCacheImpl(const CSimulatorInfo &simulator); @@ -324,10 +327,10 @@ namespace BlackMisc //! @} private: - CData m_modelCacheFsx {this, &CModelSetCaches::changedFsx }; //!< FSX cache - CData m_modelCacheFs9 {this, &CModelSetCaches::changedFs9}; //!< FS9 cache - CData m_modelCacheP3D {this, &CModelSetCaches::changedP3D }; //!< P3D cache - CData m_modelCacheXP {this, &CModelSetCaches::changedXP }; //!< XP cache + CData m_modelCacheFsx { this, &CModelSetCaches::changedFsx }; //!< FSX cache + CData m_modelCacheFs9 { this, &CModelSetCaches::changedFs9}; //!< FS9 cache + CData m_modelCacheP3D { this, &CModelSetCaches::changedP3D }; //!< P3D cache + CData m_modelCacheXP { this, &CModelSetCaches::changedXP }; //!< XP cache //! Non virtual version (can be used in ctor) void synchronizeCacheImpl(const CSimulatorInfo &simulator); @@ -337,8 +340,42 @@ namespace BlackMisc void admitCacheImpl(const CSimulatorInfo &simulator); }; - //! One central instance of the caches - class BLACKMISC_EXPORT CCentralMultiSimulatorModelCachesProvider : public IMultiSimulatorModelCaches + //! One central instance of the caches base class + template class CCentralMultiSimulatorModelCachesProviderBase : public IMultiSimulatorModelCaches + { + public: + //! \name Interface implementations + //! @{ + virtual CAircraftModelList getCachedModels(const CSimulatorInfo &simulator) const override { return instanceCaches().getCachedModels(simulator); } + virtual CStatusMessage setCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator) override { return instanceCaches().setCachedModels(models, simulator); } + virtual QDateTime getCacheTimestamp(const CSimulatorInfo &simulator) const override { return instanceCaches().getCacheTimestamp(simulator); } + virtual CStatusMessage setCacheTimestamp(const QDateTime &ts, const CSimulatorInfo &simulator) override { return instanceCaches().setCacheTimestamp(ts, simulator); } + virtual void synchronizeCache(const CSimulatorInfo &simulator) override { return instanceCaches().synchronizeCache(simulator); } + virtual void admitCache(const CSimulatorInfo &simulator) override { return instanceCaches().admitCache(simulator); } + virtual QString getFilename(const CSimulatorInfo &simulator) const override { return instanceCaches().getFilename(simulator); } + virtual bool isSaved(const CSimulatorInfo &simulator) const override { return instanceCaches().isSaved(simulator); } + virtual QString getDescription() const override { return instanceCaches().getDescription(); } + //! @} + + protected: + //! Ctor + CCentralMultiSimulatorModelCachesProviderBase(QObject *parent = nullptr) : IMultiSimulatorModelCaches(parent) { } + + private: + TCaches m_caches { false, this }; //!< used caches + + //! Singleton caches + TCaches &instanceCaches() { return this->isInstance() ? m_caches : Derived::modelCachesInstance().m_caches; } + + //! Singleton caches + const TCaches &instanceCaches() const { return this->isInstance() ? m_caches : Derived::modelCachesInstance().m_caches; } + + //! Is this object the central instance? + bool isInstance() const { return this == &Derived::modelCachesInstance(); } + }; + + //! One central instance of the model caches + class BLACKMISC_EXPORT CCentralMultiSimulatorModelCachesProvider : public CCentralMultiSimulatorModelCachesProviderBase { Q_OBJECT Q_INTERFACES(BlackMisc::Simulation::IModelsForSimulatorSetable) @@ -346,37 +383,64 @@ namespace BlackMisc public: //! Central instance - static CCentralMultiSimulatorModelCachesProvider &modelCachesInstance(); - - //! \name Interface implementations - //! @{ - virtual CAircraftModelList getCachedModels(const CSimulatorInfo &simulator) const override; - virtual CStatusMessage setCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator) override; - virtual QDateTime getCacheTimestamp(const CSimulatorInfo &simulator) const override; - virtual CStatusMessage setCacheTimestamp(const QDateTime &ts, const CSimulatorInfo &simulator) override; - virtual void synchronizeCache(const CSimulatorInfo &simulator) override; - virtual void admitCache(const CSimulatorInfo &simulator) override; - virtual QString getFilename(const CSimulatorInfo &simulator) const override; - virtual bool isSaved(const CSimulatorInfo &simulator) const override; - virtual QString getDescription() const override; - //! @} + static CCentralMultiSimulatorModelCachesProvider &modelCachesInstance() + { + static CCentralMultiSimulatorModelCachesProvider c; + return c; + } protected: //! Ctor - CCentralMultiSimulatorModelCachesProvider(QObject *parent = nullptr); - - private: - CModelCaches m_caches { this }; //!< the caches - - //! Singleton caches - CModelCaches &instanceCaches() { return this->isInstance() ? m_caches : modelCachesInstance().m_caches; } - - //! Singleton caches - const CModelCaches &instanceCaches() const { return this->isInstance() ? m_caches : modelCachesInstance().m_caches; } - - //! Is this object the central instance? - bool isInstance() const { return this == &modelCachesInstance(); } + CCentralMultiSimulatorModelCachesProvider(QObject *parent = nullptr) : CCentralMultiSimulatorModelCachesProviderBase(parent) {} }; + + //! One central instance of the model set caches + class BLACKMISC_EXPORT CCentralMultiSimulatorModelSetCachesProvider : public CCentralMultiSimulatorModelCachesProviderBase + { + Q_OBJECT + Q_INTERFACES(BlackMisc::Simulation::IModelsForSimulatorSetable) + Q_INTERFACES(BlackMisc::Simulation::IModelsForSimulatorUpdatable) + + public: + //! Central instance + static CCentralMultiSimulatorModelSetCachesProvider &modelCachesInstance() + { + static CCentralMultiSimulatorModelSetCachesProvider c; + return c; + } + + protected: + //! Ctor + CCentralMultiSimulatorModelSetCachesProvider(QObject *parent = nullptr) : CCentralMultiSimulatorModelCachesProviderBase(parent) {} + }; + + //! Basically a QObject free (delegate based) version of CCentralMultiSimulatorModelSetCachesProvider + class BLACKMISC_EXPORT CCentralMultiSimulatorModelSetCachesAware: + public IModelsForSimulatorSetable, + public IModelsForSimulatorUpdatable + { + public: + //! \name Look like IMultiSimulatorModelCaches interface + //! @{ + CAircraftModelList getCachedModels(const CSimulatorInfo &simulator) const { return CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().getCachedModels(simulator); } + int getCachedModelsCount(const CSimulatorInfo &simulator) const { return CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().getCachedModelsCount(simulator); } + CStatusMessage setCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator) { return CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().setCachedModels(models, simulator); } + QDateTime getCacheTimestamp(const CSimulatorInfo &simulator) const { return CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().getCacheTimestamp(simulator); } + CStatusMessage setCacheTimestamp(const QDateTime &ts, const CSimulatorInfo &simulator) { return CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().setCacheTimestamp(ts, simulator); } + void synchronizeCache(const CSimulatorInfo &simulator) { return CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().synchronizeCache(simulator); } + void admitCache(const CSimulatorInfo &simulator) { return CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().admitCache(simulator); } + QString getFilename(const CSimulatorInfo &simulator) const { return CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().getFilename(simulator); } + bool isSaved(const CSimulatorInfo &simulator) const { return CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().isSaved(simulator); } + QString getDescription() const { return CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().getDescription(); } + //! @} + + //! \copydoc IModelsForSimulatorSetable::setModelsForSimulator + virtual void setModelsForSimulator(const CAircraftModelList &models, const CSimulatorInfo &simulator) override { CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().setModelsForSimulator(models, simulator); } + + //! \copydoc IModelsForSimulatorUpdatable::updateModelsForSimulator + virtual int updateModelsForSimulator(const CAircraftModelList &models, const CSimulatorInfo &simulator) override { return CCentralMultiSimulatorModelSetCachesProvider::modelCachesInstance().updateModelsForSimulator(models, simulator); } + }; + } // ns } // ns } // ns