// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include #include #include namespace armnn { BackendRegistry& BackendRegistryInstance() { static BackendRegistry instance; return instance; } void BackendRegistry::Register(const BackendId& id, BackendRegistry::FactoryFunction factory) { if (m_Factories.find(id) != m_Factories.end()) { throw InvalidArgumentException( std::string(id) + " already registered as IBackend factory", CHECK_LOCATION()); } m_Factories[id] = factory; if (m_ProfilingService.has_value()) { if (m_ProfilingService.has_value() && m_ProfilingService.value().IsProfilingEnabled()) { m_ProfilingService.value().IncrementCounterValue(armnn::profiling::REGISTERED_BACKENDS); } } } void BackendRegistry::Deregister(const BackendId& id) { m_Factories.erase(id); if (m_ProfilingService.has_value() && m_ProfilingService.value().IsProfilingEnabled()) { m_ProfilingService.value().IncrementCounterValue(armnn::profiling::UNREGISTERED_BACKENDS); } } bool BackendRegistry::IsBackendRegistered(const BackendId& id) const { return (m_Factories.find(id) != m_Factories.end()); } BackendRegistry::FactoryFunction BackendRegistry::GetFactory(const BackendId& id) const { auto it = m_Factories.find(id); if (it == m_Factories.end()) { throw InvalidArgumentException( std::string(id) + " has no IBackend factory registered", CHECK_LOCATION()); } return it->second; } size_t BackendRegistry::Size() const { return m_Factories.size(); } BackendIdSet BackendRegistry::GetBackendIds() const { BackendIdSet result; for (const auto& it : m_Factories) { result.insert(it.first); } return result; } std::string BackendRegistry::GetBackendIdsAsString() const { static const std::string delimitator = ", "; std::stringstream output; for (auto& backendId : GetBackendIds()) { if (output.tellp() != std::streampos(0)) { output << delimitator; } output << backendId; } return output.str(); } void BackendRegistry::Swap(BackendRegistry& instance, BackendRegistry::FactoryStorage& other) { std::swap(instance.m_Factories, other); } void BackendRegistry::SetProfilingService(armnn::Optional profilingService) { m_ProfilingService = profilingService; } } // namespace armnn