Fixed bugs in PreCompiledLayer

 * Fixed PreCompiledObject type (was const void** instead of void*)
 * Fixed bug where a new shared_ptr was being created instead of allowing
   std::move to convert the unique_ptr into a shared_ptr.
 * Improved tests to ensure that the original pointer is maintained.

Signed-off-by: Mike Kelly <mike.kelly@arm.com>
Change-Id: I3f50d51775ee0180c894c2843ed7bc990a771dea
diff --git a/src/armnn/layers/PreCompiledLayer.cpp b/src/armnn/layers/PreCompiledLayer.cpp
index 0cc9c5a..67c1db4 100644
--- a/src/armnn/layers/PreCompiledLayer.cpp
+++ b/src/armnn/layers/PreCompiledLayer.cpp
@@ -46,7 +46,7 @@
 
 void PreCompiledLayer::SetPreCompiledObject(PreCompiledObjectPtr preCompiledObject)
 {
-    m_PreCompiledObject = std::make_shared<const void*>(preCompiledObject.release());
+    m_PreCompiledObject = std::move(preCompiledObject);
 }
 
 void PreCompiledLayer::Accept(ILayerVisitor& visitor) const
diff --git a/src/armnn/layers/PreCompiledLayer.hpp b/src/armnn/layers/PreCompiledLayer.hpp
index 6a8ac68..0db1472 100644
--- a/src/armnn/layers/PreCompiledLayer.hpp
+++ b/src/armnn/layers/PreCompiledLayer.hpp
@@ -41,7 +41,7 @@
     PreCompiledLayer(const PreCompiledLayer& other) = delete;
     PreCompiledLayer& operator=(const PreCompiledLayer& other) = delete;
 
-    std::shared_ptr<const void*> m_PreCompiledObject;
+    std::shared_ptr<void> m_PreCompiledObject;
 };
 
 } // namespace armnn
diff --git a/src/armnn/test/CloneTests.cpp b/src/armnn/test/CloneTests.cpp
index 2ee2cda..b59e8a4 100644
--- a/src/armnn/test/CloneTests.cpp
+++ b/src/armnn/test/CloneTests.cpp
@@ -25,12 +25,18 @@
     return s_Id;
 }
 
+template <typename T>
+void DeleteAsType(const void* const blob)
+{
+    delete static_cast<const T*>(blob);
+}
+
 class TestWorkloadFactory : public armnn::WorkloadFactoryBase
 {
 public:
 
-    TestWorkloadFactory()
-        : m_Ptr(nullptr)
+    TestWorkloadFactory(void* ptr)
+        : m_Ptr(ptr)
     {}
 
     const armnn::BackendId& GetBackendId() const override
@@ -41,14 +47,7 @@
     std::unique_ptr<armnn::IWorkload> CreatePreCompiled(const armnn::PreCompiledQueueDescriptor& descriptor,
                                                         const armnn::WorkloadInfo&) const override
     {
-        if (m_Ptr)
-        {
-            CHECK(descriptor.m_PreCompiledObject == m_Ptr);
-        }
-        else
-        {
-            m_Ptr = descriptor.m_PreCompiledObject;
-        }
+        CHECK(descriptor.m_PreCompiledObject == m_Ptr);
         return nullptr;
     }
 
@@ -67,9 +66,10 @@
 
     armnn::Layer* const preCompiledLayer = graph1.AddLayer<armnn::PreCompiledLayer>(descriptor, "preCompiled");
     armnn::PreCompiledLayer* layer = armnn::PolymorphicDowncast<armnn::PreCompiledLayer*>(preCompiledLayer);
+    std::unique_ptr<std::string> payload = std::make_unique<std::string>("Hello");
 
-    armnn::PreCompiledObjectPtr payloadObject;
-    TestWorkloadFactory factory;
+    armnn::PreCompiledObjectPtr payloadObject(payload.release(), DeleteAsType<std::string>);
+    TestWorkloadFactory factory(payloadObject.get());
 
     layer->SetPreCompiledObject(std::move(payloadObject));
     layer->CreateWorkload(factory);
@@ -90,7 +90,7 @@
     armnn::Layer* const preCompiledLayer = graph1.AddLayer<armnn::PreCompiledLayer>(descriptor, "preCompiled");
     armnn::PreCompiledLayer* layer = armnn::PolymorphicDowncast<armnn::PreCompiledLayer*>(preCompiledLayer);
 
-    TestWorkloadFactory factory;
+    TestWorkloadFactory factory(nullptr);
     layer->CreateWorkload(factory);
 
     armnn::PreCompiledLayer* clone = layer->Clone(graph2);