// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #include #include #include #include namespace armnn { template struct RegisteredTypeName { static const char * Name() { return "UNKNOWN"; } }; template class RegistryCommon { public: using FactoryFunction = std::function; void Register(const BackendId& id, FactoryFunction factory) { if (m_Factories.count(id) > 0) { throw InvalidArgumentException( std::string(id) + " already registered as " + RegisteredTypeName::Name() + " factory", CHECK_LOCATION()); } m_Factories[id] = factory; } FactoryFunction GetFactory(const BackendId& id) const { auto it = m_Factories.find(id); if (it == m_Factories.end()) { throw InvalidArgumentException( std::string(id) + " has no " + RegisteredTypeName::Name() + " factory registered", CHECK_LOCATION()); } return it->second; } size_t Size() const { return m_Factories.size(); } BackendIdSet GetBackendIds() const { BackendIdSet result; for (const auto& it : m_Factories) { result.insert(it.first); } return result; } RegistryCommon() {} virtual ~RegistryCommon() {} protected: using FactoryStorage = std::unordered_map; // For testing only static void Swap(RegistryCommon& instance, FactoryStorage& other) { std::swap(instance.m_Factories, other); } private: RegistryCommon(const RegistryCommon&) = delete; RegistryCommon& operator=(const RegistryCommon&) = delete; FactoryStorage m_Factories; }; template struct StaticRegistryInitializer { using FactoryFunction = typename RegistryType::FactoryFunction; StaticRegistryInitializer(RegistryType& instance, const BackendId& id, FactoryFunction factory) { instance.Register(id, factory); } }; } // namespace armnn