// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #include #include #include #include #include #include #include #include namespace armnn { namespace profiling { class ProfilingService; } class IBackendInternal; using IBackendInternalUniquePtr = std::unique_ptr; using MemoryOptimizerStrategiesMapRef = std::unordered_map>; class BackendRegistry { public: using PointerType = IBackendInternalUniquePtr; using FactoryFunction = std::function; void Register(const BackendId& id, FactoryFunction factory); bool IsBackendRegistered(const BackendId& id) const; FactoryFunction GetFactory(const BackendId& id) const; size_t Size() const; BackendIdSet GetBackendIds() const; std::string GetBackendIdsAsString() const; void SetProfilingService(armnn::Optional profilingService); void RegisterAllocator(const BackendId& id, std::shared_ptr alloc); std::unordered_map> GetAllocators(); void RegisterMemoryOptimizerStrategy(const BackendId& id, std::shared_ptr strategy); MemoryOptimizerStrategiesMapRef GetMemoryOptimizerStrategies(); BackendRegistry() {} virtual ~BackendRegistry() {} struct StaticRegistryInitializer { StaticRegistryInitializer(BackendRegistry& instance, const BackendId& id, FactoryFunction factory) { instance.Register(id, factory); } }; void Deregister(const BackendId& id); void DeregisterAllocator(const BackendId &id); void DeregisterMemoryOptimizerStrategy(const BackendId &id); protected: using FactoryStorage = std::unordered_map; /// For testing only static void Swap(BackendRegistry& instance, FactoryStorage& other); private: BackendRegistry(const BackendRegistry&) = delete; BackendRegistry& operator=(const BackendRegistry&) = delete; FactoryStorage m_Factories; armnn::Optional m_ProfilingService; std::unordered_map> m_CustomMemoryAllocatorMap; std::unordered_map> m_MemoryOptimizerStrategyMap; }; BackendRegistry& BackendRegistryInstance(); } // namespace armnn