IVGCVSW-2125 : Consolidate backend registries into one

Change-Id: I56da4780f8f5fcef7ff01d232d5d61bf299364bf
diff --git a/src/backends/backendsCommon/BackendRegistry.hpp b/src/backends/backendsCommon/BackendRegistry.hpp
index 4b20cac..2a52e24 100644
--- a/src/backends/backendsCommon/BackendRegistry.hpp
+++ b/src/backends/backendsCommon/BackendRegistry.hpp
@@ -4,21 +4,57 @@
 //
 #pragma once
 
-#include "RegistryCommon.hpp"
 #include <armnn/Types.hpp>
+#include <armnn/BackendId.hpp>
+
+#include <memory>
+#include <unordered_map>
 
 namespace armnn
 {
+
 class IBackendInternal;
 using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
-using BackendRegistry = RegistryCommon<IBackendInternal, IBackendInternalUniquePtr>;
+
+class BackendRegistry
+{
+public:
+    using PointerType = IBackendInternalUniquePtr;
+    using FactoryFunction = std::function<PointerType()>;
+
+    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;
+
+    BackendRegistry() {}
+    virtual ~BackendRegistry() {}
+
+    struct StaticRegistryInitializer
+    {
+        StaticRegistryInitializer(BackendRegistry& instance,
+                                  const BackendId& id,
+                                  FactoryFunction factory)
+        {
+            instance.Register(id, factory);
+        }
+    };
+
+protected:
+    using FactoryStorage = std::unordered_map<BackendId, FactoryFunction>;
+
+    // For testing only
+    static void Swap(BackendRegistry& instance, FactoryStorage& other);
+
+private:
+    BackendRegistry(const BackendRegistry&) = delete;
+    BackendRegistry& operator=(const BackendRegistry&) = delete;
+
+    FactoryStorage m_Factories;
+};
 
 BackendRegistry& BackendRegistryInstance();
 
-template <>
-struct RegisteredTypeName<IBackend>
-{
-    static const char * Name() { return "IBackend"; }
-};
-
 } // namespace armnn
\ No newline at end of file