blob: fe6451cde00f9ee5d4ff006eb375ab870d4cb25b [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>
Finn Williams45a73622020-05-15 18:41:05 +01009#include <armnn/Optional.hpp>
David Beck111b5d92018-11-12 14:59:37 +000010
11#include <memory>
12#include <unordered_map>
jimfly0107bb5212018-11-14 14:52:40 +000013#include <functional>
David Beck32cbb0c2018-10-09 15:46:08 +010014
15namespace armnn
16{
David Beck111b5d92018-11-12 14:59:37 +000017
Finn Williams45a73622020-05-15 18:41:05 +010018namespace profiling
19{
20 class ProfilingService;
21}
David Beck1b61be52018-11-08 09:19:14 +000022class IBackendInternal;
23using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
David Beck111b5d92018-11-12 14:59:37 +000024
25class BackendRegistry
26{
27public:
28 using PointerType = IBackendInternalUniquePtr;
29 using FactoryFunction = std::function<PointerType()>;
30
31 void Register(const BackendId& id, FactoryFunction factory);
32 bool IsBackendRegistered(const BackendId& id) const;
33 FactoryFunction GetFactory(const BackendId& id) const;
34 size_t Size() const;
35 BackendIdSet GetBackendIds() const;
36 std::string GetBackendIdsAsString() const;
Finn Williams45a73622020-05-15 18:41:05 +010037 void SetProfilingService(armnn::Optional<profiling::ProfilingService&> profilingService);
David Beck111b5d92018-11-12 14:59:37 +000038
39 BackendRegistry() {}
40 virtual ~BackendRegistry() {}
41
42 struct StaticRegistryInitializer
43 {
44 StaticRegistryInitializer(BackendRegistry& instance,
45 const BackendId& id,
46 FactoryFunction factory)
47 {
48 instance.Register(id, factory);
49 }
50 };
51
Narumol Prangnawarat60a20fb2019-12-09 17:24:41 +000052 void Deregister(const BackendId& id);
53
David Beck111b5d92018-11-12 14:59:37 +000054protected:
55 using FactoryStorage = std::unordered_map<BackendId, FactoryFunction>;
56
Ryan OShea2bbfaa72020-02-12 16:15:27 +000057 /// For testing only
David Beck111b5d92018-11-12 14:59:37 +000058 static void Swap(BackendRegistry& instance, FactoryStorage& other);
59
60private:
61 BackendRegistry(const BackendRegistry&) = delete;
62 BackendRegistry& operator=(const BackendRegistry&) = delete;
63
64 FactoryStorage m_Factories;
Finn Williams45a73622020-05-15 18:41:05 +010065 armnn::Optional<profiling::ProfilingService&> m_ProfilingService;
David Beck111b5d92018-11-12 14:59:37 +000066};
David Beck32cbb0c2018-10-09 15:46:08 +010067
David Beck3e9e1152018-10-17 14:17:50 +010068BackendRegistry& BackendRegistryInstance();
69
jimfly0107bb5212018-11-14 14:52:40 +000070} // namespace armnn