/* Copyright (C) 2023 The Qt Company Ltd. * * SPDX-License-Identifier: GPL-3.0-only WITH Qt-GPL-exception-1.0 */ #pragma once #include namespace QLicenseService { template class AbstractFactory { public: virtual ~AbstractFactory() {} using FactoryMethod = TBase *(*)(TArgs...); template void registerProduct(const TId &id) { m_products.insert(std::make_pair (id, &AbstractFactory::create)); } void registerProduct(const TId &id, FactoryMethod func) { m_products.insert(std::make_pair(id, func)); } bool containsProduct(const TId &id) const { auto it = m_products.find(id); return !m_products.cend(); } TBase *create(const TId &id, TArgs... args) const { auto it = m_products.find(id); if (it == m_products.cend()) return nullptr; return (it->second)(std::forward(args)...); } protected: AbstractFactory() = default; private: template static TBase *create(TArgs... args) { return new TDerived(std::forward(args)...); } AbstractFactory(const AbstractFactory &) = delete; AbstractFactory &operator=(const AbstractFactory &) = delete; private: std::unordered_map m_products; }; } // namespace QLicenseService