diff --git a/src/utils/dependencymanager.h b/src/utils/dependencymanager.h index 5b5691d8..5b7aa52a 100644 --- a/src/utils/dependencymanager.h +++ b/src/utils/dependencymanager.h @@ -1,559 +1,559 @@ /* This file is part of Zanshin Copyright 2014 Kevin Ottens This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License or (at your option) version 3 or any later version accepted by the membership of KDE e.V. (or its successor approved by the membership of KDE e.V.), which shall act as a proxy defined in Section 14 of version 3 of the license. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef UTILS_DEPENDENCYMANAGER_H #define UTILS_DEPENDENCYMANAGER_H #include -#include +#include #include #include #ifdef Q_COMPILER_LAMBDA #include #endif namespace Utils { class DependencyManager; namespace Internal { template class Provider { public: #ifdef Q_COMPILER_LAMBDA typedef std::function FactoryType; typedef std::function(FactoryType, DependencyManager*)> PolicyType; #else typedef Iface *(*FactoryType)(DependencyManager*); typedef QSharedPointer (*PolicyType)(FactoryType, DependencyManager*); #endif Provider() : m_factory(Q_NULLPTR), m_policy(Q_NULLPTR) { } Provider(FactoryType factory, PolicyType policy) : m_factory(factory), m_policy(policy) { } Provider(const Provider &other) : m_factory(other.m_factory), m_policy(other.m_policy) { } ~Provider() { } Provider &operator=(const Provider &other) { Provider tmp(other); std::swap(m_factory, tmp.m_factory); std::swap(m_policy, tmp.m_policy); return *this; } QSharedPointer operator()(DependencyManager *deps) const { Q_ASSERT(m_factory != Q_NULLPTR); return m_policy(m_factory, deps); } private: FactoryType m_factory; PolicyType m_policy; }; template class Supplier { public: static void setProvider(DependencyManager *manager, const Provider &provider) { s_providers.insert(manager, provider); } static QSharedPointer create(DependencyManager *manager) { return s_providers.value(manager)(manager); } static int providersCount() { return s_providers.size(); } static void removeProvider(DependencyManager *manager) { s_providers.remove(manager); } private: Supplier(); - static QMap< DependencyManager*, Provider > s_providers; + static QHash< DependencyManager*, Provider > s_providers; }; template - QMap< DependencyManager*, Provider > Supplier::s_providers; + QHash< DependencyManager*, Provider > Supplier::s_providers; struct MultipleInstancesPolicy { template static typename Provider::PolicyType function(Iface *) { return create; } template static QSharedPointer create(typename Provider::FactoryType factory, DependencyManager *deps) { return QSharedPointer(factory(deps)); } }; struct UniqueInstancePolicy { template static typename Provider::PolicyType function(Iface *) { return create; } template static QSharedPointer create(typename Provider::FactoryType factory, DependencyManager *deps) { static QWeakPointer weakRef; QSharedPointer instance = weakRef.toStrongRef(); if (!instance) { instance = QSharedPointer(factory(deps)); weakRef = instance; } return instance; } }; } class DependencyManager { public: typedef Internal::MultipleInstancesPolicy MultipleInstances; typedef Internal::UniqueInstancePolicy UniqueInstance; static DependencyManager &globalInstance(); DependencyManager(); DependencyManager(const DependencyManager &other); ~DependencyManager(); DependencyManager &operator=(const DependencyManager &other); template void add(const typename Internal::Provider::FactoryType &factory) { Iface * const val = Q_NULLPTR; Internal::Provider provider(factory, InstancePolicy::function(val)); Internal::Supplier::setProvider(this, provider); m_cleanupFunctions << Internal::Supplier::removeProvider; } template void add(const typename Internal::Provider::FactoryType &factory) { add(factory); } template void add() { add(DependencyManager::FactoryHelper::create); } template void add() { add(); } template QSharedPointer create() { return Internal::Supplier::create(this); } private: QList m_cleanupFunctions; template class FactoryHelper { public: static Iface *create(DependencyManager *) { return new Impl; } }; #ifdef Q_COMPILER_VARIADIC_TEMPLATES template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl((manager->create())...); } }; #else template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create()); } }; template class FactoryHelper { public: static Iface *create(DependencyManager *manager) { return new Impl(manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create(), manager->create()); } }; #endif }; } #endif // UTILS_DEPENDENCYMANAGER_H