blob: a0cfee939117e34d13870928a8d451cab363afa0 [file] [log] [blame]
David Beck32cbb0c2018-10-09 15:46:08 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5#pragma once
6
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00007#include <armnn/Types.hpp>
David Beck111b5d92018-11-12 14:59:37 +00008#include <armnn/BackendId.hpp>
9
10#include <memory>
11#include <unordered_map>
jimfly0107bb5212018-11-14 14:52:40 +000012#include <functional>
David Beck32cbb0c2018-10-09 15:46:08 +010013
14namespace armnn
15{
David Beck111b5d92018-11-12 14:59:37 +000016
David Beck1b61be52018-11-08 09:19:14 +000017class IBackendInternal;
18using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
David Beck111b5d92018-11-12 14:59:37 +000019
20class BackendRegistry
21{
22public:
23 using PointerType = IBackendInternalUniquePtr;
24 using FactoryFunction = std::function<PointerType()>;
25
26 void Register(const BackendId& id, FactoryFunction factory);
27 bool IsBackendRegistered(const BackendId& id) const;
28 FactoryFunction GetFactory(const BackendId& id) const;
29 size_t Size() const;
30 BackendIdSet GetBackendIds() const;
31 std::string GetBackendIdsAsString() const;
32
33 BackendRegistry() {}
34 virtual ~BackendRegistry() {}
35
36 struct StaticRegistryInitializer
37 {
38 StaticRegistryInitializer(BackendRegistry& instance,
39 const BackendId& id,
40 FactoryFunction factory)
41 {
42 instance.Register(id, factory);
43 }
44 };
45
Narumol Prangnawarat60a20fb2019-12-09 17:24:41 +000046 void Deregister(const BackendId& id);
47
David Beck111b5d92018-11-12 14:59:37 +000048protected:
49 using FactoryStorage = std::unordered_map<BackendId, FactoryFunction>;
50
51 // For testing only
52 static void Swap(BackendRegistry& instance, FactoryStorage& other);
53
54private:
55 BackendRegistry(const BackendRegistry&) = delete;
56 BackendRegistry& operator=(const BackendRegistry&) = delete;
57
58 FactoryStorage m_Factories;
59};
David Beck32cbb0c2018-10-09 15:46:08 +010060
David Beck3e9e1152018-10-17 14:17:50 +010061BackendRegistry& BackendRegistryInstance();
62
jimfly0107bb5212018-11-14 14:52:40 +000063} // namespace armnn