IVGCVSW-6114 Create multiple LoadedNetworks from one OptimizedNetwork

 * Added IOptimizedNetwork constructor that takes another
   IOptimizedNetwork and a ModelOptions.
 * Changed PreCompiledLayer to use shared_ptr rather than unique_ptr
   to store the PreCompiledObject (no interface changes).
 * Added unit tests to ensure that PreCompiledLayer::Clone() clones
   the pointer to the PreCompiledObject correctly.

Signed-off-by: Mike Kelly <mike.kelly@arm.com>
Change-Id: I3ef56055e0d189ffce9e651882d34da16c70a240
diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp
index 71f1931..74c195f 100644
--- a/src/armnn/Network.cpp
+++ b/src/armnn/Network.cpp
@@ -543,6 +543,8 @@
     delete network;
 }
 
+IOptimizedNetwork::IOptimizedNetwork(const IOptimizedNetwork& other, const ModelOptions& modelOptions)
+    : pOptimizedNetworkImpl(new OptimizedNetworkImpl(*other.pOptimizedNetworkImpl.get(), modelOptions)) {}
 
 IOptimizedNetwork::IOptimizedNetwork(std::unique_ptr<Graph> graph)
     : pOptimizedNetworkImpl(new OptimizedNetworkImpl(std::move(graph))) {}
@@ -2621,6 +2623,13 @@
     };
 }
 
+OptimizedNetworkImpl::OptimizedNetworkImpl(const OptimizedNetworkImpl& other, const ModelOptions& modelOptions)
+    : m_Graph(new Graph(*other.m_Graph.get()))
+    , m_Guid(profiling::ProfilingService::GetNextGuid())
+    , m_ModelOptions(modelOptions)
+{
+}
+
 OptimizedNetworkImpl::OptimizedNetworkImpl(std::unique_ptr<Graph> graph)
     : m_Graph(std::move(graph)), m_Guid(profiling::ProfilingService::GetNextGuid())
 {