IVGCVSW-1989 : implement backend creation and registry for Ref,Cl and Neon

!armnn:152557

Change-Id: Ic6b99cddee1597c85de76034d9332fe1bf3aceb1
diff --git a/src/backends/IBackendInternal.hpp b/src/backends/IBackendInternal.hpp
index 1ccf88e..a441abd 100644
--- a/src/backends/IBackendInternal.hpp
+++ b/src/backends/IBackendInternal.hpp
@@ -13,8 +13,8 @@
 class IBackendInternal : public IBackend
 {
 protected:
-    IBackendInternal() {}
-    virtual ~IBackendInternal() {}
+    IBackendInternal() = default;
+    ~IBackendInternal() override = default;
 
 public:
     virtual std::unique_ptr<IWorkloadFactory> CreateWorkloadFactory() const = 0;
diff --git a/src/backends/cl/ClBackend.cpp b/src/backends/cl/ClBackend.cpp
index 5de9d31..d185c15 100644
--- a/src/backends/cl/ClBackend.cpp
+++ b/src/backends/cl/ClBackend.cpp
@@ -4,11 +4,25 @@
 //
 
 #include "ClBackend.hpp"
+#include <backends/BackendRegistry.hpp>
+#include <boost/cast.hpp>
 
 namespace armnn
 {
 
-const std::string ClBackend::s_Id = "arm_compute_cl";
+namespace
+{
+static const std::string s_Id = "GpuAcc";
+
+static BackendRegistry::Helper g_RegisterHelper{
+    s_Id,
+    []()
+    {
+        return IBackendUniquePtr(new ClBackend, &ClBackend::Destroy);
+    }
+};
+
+}
 
 const std::string& ClBackend::GetId() const
 {
@@ -22,8 +36,12 @@
 
 std::unique_ptr<IWorkloadFactory> ClBackend::CreateWorkloadFactory() const
 {
-    // TODO implement
     return nullptr;
 }
 
+void ClBackend::Destroy(IBackend* backend)
+{
+    delete boost::polymorphic_downcast<ClBackend*>(backend);
+}
+
 } // namespace armnn
\ No newline at end of file
diff --git a/src/backends/cl/ClBackend.hpp b/src/backends/cl/ClBackend.hpp
index 7e67f5e..c43b6a6 100644
--- a/src/backends/cl/ClBackend.hpp
+++ b/src/backends/cl/ClBackend.hpp
@@ -4,8 +4,7 @@
 //
 #pragma once
 
-#include "backends/IBackendInternal.hpp"
-
+#include <backends/IBackendInternal.hpp>
 #include "ClLayerSupport.hpp"
 
 namespace armnn
@@ -23,10 +22,9 @@
 
     std::unique_ptr<IWorkloadFactory> CreateWorkloadFactory() const override;
 
-private:
-    static const std::string s_Id;
+    static void Destroy(IBackend* backend);
 
-    // TODO initialize
+private:
     ClLayerSupport m_LayerSupport;
 };
 
diff --git a/src/backends/neon/NeonBackend.cpp b/src/backends/neon/NeonBackend.cpp
index 1137145..b4f1897 100644
--- a/src/backends/neon/NeonBackend.cpp
+++ b/src/backends/neon/NeonBackend.cpp
@@ -4,11 +4,26 @@
 //
 
 #include "NeonBackend.hpp"
+#include <backends/BackendRegistry.hpp>
+#include <boost/cast.hpp>
 
 namespace armnn
 {
 
-const std::string NeonBackend::s_Id = "arm_compute_neon";
+namespace
+{
+
+static const std::string s_Id = "CpuAcc";
+
+static BackendRegistry::Helper g_RegisterHelper{
+    s_Id,
+    []()
+    {
+        return IBackendUniquePtr(new NeonBackend, &NeonBackend::Destroy);
+    }
+};
+
+}
 
 const std::string& NeonBackend::GetId() const
 {
@@ -22,8 +37,12 @@
 
 std::unique_ptr<IWorkloadFactory> NeonBackend::CreateWorkloadFactory() const
 {
-    // TODO implement
     return nullptr;
 }
 
+void NeonBackend::Destroy(IBackend* backend)
+{
+    delete boost::polymorphic_downcast<NeonBackend*>(backend);
+}
+
 } // namespace armnn
\ No newline at end of file
diff --git a/src/backends/neon/NeonBackend.hpp b/src/backends/neon/NeonBackend.hpp
index 86fccf0..5d4bd5d 100644
--- a/src/backends/neon/NeonBackend.hpp
+++ b/src/backends/neon/NeonBackend.hpp
@@ -4,8 +4,7 @@
 //
 #pragma once
 
-#include "backends/IBackendInternal.hpp"
-
+#include <backends/IBackendInternal.hpp>
 #include "NeonLayerSupport.hpp"
 
 namespace armnn
@@ -23,10 +22,9 @@
 
     std::unique_ptr<IWorkloadFactory> CreateWorkloadFactory() const override;
 
-private:
-    static const std::string s_Id;
+    static void Destroy(IBackend* backend);
 
-    // TODO initialize
+private:
     NeonLayerSupport m_LayerSupport;
 };
 
diff --git a/src/backends/reference/RefBackend.cpp b/src/backends/reference/RefBackend.cpp
index 1799abf..b671e8b 100644
--- a/src/backends/reference/RefBackend.cpp
+++ b/src/backends/reference/RefBackend.cpp
@@ -4,11 +4,25 @@
 //
 
 #include "RefBackend.hpp"
+#include <backends/BackendRegistry.hpp>
+#include <boost/cast.hpp>
 
 namespace armnn
 {
 
-const std::string RefBackend::s_Id = "arm_reference";
+namespace
+{
+const std::string s_Id = "CpuRef";
+
+static BackendRegistry::Helper s_RegisterHelper{
+    s_Id,
+    []()
+    {
+        return IBackendUniquePtr(new RefBackend, &RefBackend::Destroy);
+    }
+};
+
+}
 
 const std::string& RefBackend::GetId() const
 {
@@ -22,8 +36,12 @@
 
 std::unique_ptr<IWorkloadFactory> RefBackend::CreateWorkloadFactory() const
 {
-    // TODO implement
     return nullptr;
 }
 
+void RefBackend::Destroy(IBackend* backend)
+{
+    delete boost::polymorphic_downcast<RefBackend*>(backend);
+}
+
 } // namespace armnn
\ No newline at end of file
diff --git a/src/backends/reference/RefBackend.hpp b/src/backends/reference/RefBackend.hpp
index c379715..e4a11f1 100644
--- a/src/backends/reference/RefBackend.hpp
+++ b/src/backends/reference/RefBackend.hpp
@@ -4,8 +4,7 @@
 //
 #pragma once
 
-#include "backends/IBackendInternal.hpp"
-
+#include <backends/IBackendInternal.hpp>
 #include "RefLayerSupport.hpp"
 
 namespace armnn
@@ -23,10 +22,9 @@
 
     std::unique_ptr<IWorkloadFactory> CreateWorkloadFactory() const override;
 
-private:
-    static const std::string s_Id;
+    static void Destroy(IBackend* backend);
 
-    // TODO initialize
+private:
     RefLayerSupport m_LayerSupport;
 };