blob: 82e59d970b23ac77dbfcbfbdc4b72889e978b4d0 [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
46protected:
47 using FactoryStorage = std::unordered_map<BackendId, FactoryFunction>;
48
49 // For testing only
50 static void Swap(BackendRegistry& instance, FactoryStorage& other);
51
52private:
53 BackendRegistry(const BackendRegistry&) = delete;
54 BackendRegistry& operator=(const BackendRegistry&) = delete;
55
56 FactoryStorage m_Factories;
57};
David Beck32cbb0c2018-10-09 15:46:08 +010058
David Beck3e9e1152018-10-17 14:17:50 +010059BackendRegistry& BackendRegistryInstance();
60
jimfly0107bb5212018-11-14 14:52:40 +000061} // namespace armnn