IVGCVSW-6712 Move SubgraphView to backends include folder

 * Make subgraphview a public interface for backends.

Change-Id: I615a29ffec41e947215c3d29c2d7d214e327fb90
Signed-off-by: Francis Murtagh <francis.murtagh@arm.com>
diff --git a/include/armnn/backends/IBackendInternal.hpp b/include/armnn/backends/IBackendInternal.hpp
index 0756fdd..c64150a 100644
--- a/include/armnn/backends/IBackendInternal.hpp
+++ b/include/armnn/backends/IBackendInternal.hpp
@@ -10,12 +10,12 @@
 #include <armnn/Deprecated.hpp>
 
 #include <ISubgraphViewConverter.hpp>
-#include <SubgraphView.hpp>
 
 #include <armnn/backends/IBackendContext.hpp>
 #include <armnn/backends/IMemoryManager.hpp>
 #include <armnn/backends/ITensorHandleFactory.hpp>
 #include <armnn/backends/OptimizationViews.hpp>
+#include <armnn/backends/SubgraphView.hpp>
 #include <armnn/backends/profiling/IBackendProfiling.hpp>
 #include <armnn/backends/profiling/IBackendProfilingContext.hpp>
 
diff --git a/include/armnn/backends/OptimizationViews.hpp b/include/armnn/backends/OptimizationViews.hpp
index f3479fe..3146dd7 100644
--- a/include/armnn/backends/OptimizationViews.hpp
+++ b/include/armnn/backends/OptimizationViews.hpp
@@ -5,7 +5,7 @@
 
 #pragma once
 
-#include <SubgraphView.hpp>
+#include <armnn/backends/SubgraphView.hpp>
 
 namespace armnn
 {
diff --git a/include/armnn/backends/SubgraphView.hpp b/include/armnn/backends/SubgraphView.hpp
new file mode 100644
index 0000000..b5a74ba
--- /dev/null
+++ b/include/armnn/backends/SubgraphView.hpp
@@ -0,0 +1,172 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include <Layer.hpp>
+#include <Graph.hpp>
+
+#include <vector>
+#include <list>
+
+namespace armnn
+{
+
+///
+/// The SubgraphView class represents a subgraph of a Graph.
+/// The data it holds, points to data held by layers of the Graph, so the
+/// the contents of the SubgraphView become invalid when the Layers are destroyed
+/// or changed.
+///
+class SubgraphView final
+{
+public:
+    template <typename Func>
+    void ForEachLayer(Func func) const
+    {
+        for (auto it = m_Layers.begin(); it != m_Layers.end(); )
+        {
+             auto next = std::next(it);
+             func(*it);
+             it = next;
+        }
+    }
+
+    template <typename Func>
+    void ForEachIConnectableLayer(Func func) const
+    {
+        for (auto it = m_IConnectableLayers.begin(); it != m_IConnectableLayers.end(); )
+        {
+             auto next = std::next(it);
+             func(*it);
+             it = next;
+        }
+    }
+
+    using SubgraphViewPtr = std::unique_ptr<SubgraphView>;
+    using InputSlots = std::vector<InputSlot*>;
+    using IInputSlots = std::vector<IInputSlot*>;
+    using OutputSlots = std::vector<OutputSlot*>;
+    using IOutputSlots = std::vector<IOutputSlot*>;
+    using Layers = std::list<Layer*>;
+    using IConnectableLayers = std::list<IConnectableLayer*>;
+    using Iterator = Layers::iterator;
+    using IConnectableLayerIterator = IConnectableLayers::iterator;
+    using ConstIterator = Layers::const_iterator;
+    using ConstIConnectableIterator = IConnectableLayers::const_iterator;
+
+    /// Constructs a sub-graph from the entire given graph.
+    explicit SubgraphView(Graph& graph);
+
+    /// Constructs a sub-graph with the given arguments.
+    ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use constructor with arguments: "
+                                      "IConnectableLayers, IInputSlots and IOutputSlots", "22.08")
+    SubgraphView(InputSlots&& inputs, OutputSlots&& outputs, Layers&& layers);
+
+    /// Constructs a sub-graph with the given arguments.
+    SubgraphView(IConnectableLayers&& layers, IInputSlots&& inputs, IOutputSlots&& outputs);
+
+    /// Copy-constructor.
+    SubgraphView(const SubgraphView& subgraph);
+
+    /// Move-constructor.
+    SubgraphView(SubgraphView&& subgraph);
+
+    /// Constructs a sub-graph with only the given layer.
+    SubgraphView(IConnectableLayer* layer);
+
+    /// Move-assignment operator.
+    SubgraphView& operator=(SubgraphView&& other);
+
+    ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIInputSlots() returning"
+                                      " public IInputSlots", "22.08")
+    const InputSlots& GetInputSlots() const;
+    const IInputSlots& GetIInputSlots() const;
+
+    ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIOutputSlots() returning"
+                                      " public IOutputSlots", "22.08")
+    const OutputSlots& GetOutputSlots() const;
+    const IOutputSlots& GetIOutputSlots() const;
+
+    ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIConnectableLayers() "
+                                      "returning public IConnectableLayers", "22.08")
+    const Layers& GetLayers() const;
+    const IConnectableLayers& GetIConnectableLayers() const;
+
+    ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIInputSlot() returning public "
+                                      "IInputSlot", "22.08")
+    const InputSlot* GetInputSlot(unsigned int index) const;
+    const IInputSlot* GetIInputSlot(unsigned int index) const;
+    ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIInputSlot() returning public "
+                                      "IInputSlot", "22.08")
+    InputSlot* GetInputSlot(unsigned int index);
+    IInputSlot* GetIInputSlot(unsigned int index);
+
+    ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIOutputSlot() returning"
+                                      " public IOutputSlot", "22.08")
+    const OutputSlot* GetOutputSlot(unsigned int index) const;
+    const IOutputSlot* GetIOutputSlot(unsigned int index) const;
+    ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIOutputSlot() returning"
+                                      " public IOutputSlot", "22.08")
+    OutputSlot* GetOutputSlot(unsigned int index);
+    IOutputSlot* GetIOutputSlot(unsigned int index);
+
+    unsigned int GetNumInputSlots() const;
+    unsigned int GetNumOutputSlots() const;
+
+    ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an "
+                                     "IConnectableLayerIterator, until that occurs in 23.02; please use "
+                                     "beginIConnectable() returning public IConnectableLayerIterator", "23.02")
+    Iterator begin();
+    IConnectableLayerIterator beginIConnectable();
+    ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an "
+                                     "IConnectableLayerIterator, until that occurs in 23.02; please use "
+                                     "endIConnectable() returning public IConnectableLayerIterator", "23.02")
+    Iterator end();
+    IConnectableLayerIterator endIConnectable();
+
+    ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an "
+                                     "ConstIConnectableIterator, until that occurs in 23.02; please use "
+                                     "beginIConnectable() returning public ConstIConnectableIterator", "23.02")
+    ConstIterator begin() const;
+    ConstIConnectableIterator beginIConnectable() const;
+    ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an "
+                                     "ConstIConnectableIterator, until that occurs in 23.02; please use "
+                                     "endIConnectable() returning public ConstIConnectableIterator", "23.02")
+    ConstIterator end() const;
+    ConstIConnectableIterator endIConnectable() const;
+
+    ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an "
+                                     "ConstIConnectableIterator, until that occurs in 23.02; please use "
+                                     "cbeginIConnectable() returning public ConstIConnectableIterator", "23.02")
+    ConstIterator cbegin() const;
+    ConstIConnectableIterator cbeginIConnectable() const;
+    ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an "
+                                     "ConstIConnectableIterator, until that occurs in 23.02; please use "
+                                     "cendIConnectable() returning public ConstIConnectableIterator", "23.02")
+    ConstIterator cend() const;
+    ConstIConnectableIterator cendIConnectable() const;
+
+    void Clear();
+
+private:
+    void CheckSubgraph();
+
+    /// Arrange the order of layers topologically so that nodes can be visited in valid order
+    void ArrangeBySortOrder();
+
+    /// The list of pointers to the input slots of the parent graph.
+    InputSlots m_InputSlots;
+    IInputSlots m_IInputSlots;
+
+    /// The list of pointers to the output slots of the parent graph.
+    OutputSlots m_OutputSlots;
+    IOutputSlots m_IOutputSlots;
+
+    /// The list of pointers to the layers of the parent graph.
+    Layers m_Layers;
+    IConnectableLayers m_IConnectableLayers;
+};
+} // namespace armnn