IVGCVSW-6687 Implement ICLTensorProxy

 * Implement ICLTensorProxy and unit tests
 * Remove IClImportTensorHandle and use IClTensorHandle to access ICLTensor

Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com>
Change-Id: I791d0f2c6f8bad841a56e39e196baf0e533c7124
diff --git a/src/backends/cl/ICLTensorProxy.hpp b/src/backends/cl/ICLTensorProxy.hpp
new file mode 100644
index 0000000..fff9c53
--- /dev/null
+++ b/src/backends/cl/ICLTensorProxy.hpp
@@ -0,0 +1,78 @@
+//
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#pragma once
+
+#include <arm_compute/core/CL/ICLTensor.h>
+#include <arm_compute/core/ITensorInfo.h>
+
+namespace armnn
+{
+
+class ICLTensorProxy : public arm_compute::ICLTensor
+{
+public:
+    ICLTensorProxy(arm_compute::ICLTensor* iclTensor) : m_DelegateTensor(iclTensor) {}
+    ICLTensorProxy(const ICLTensorProxy&) = delete;
+    ICLTensorProxy& operator=(const ICLTensorProxy&) = delete;
+    ICLTensorProxy(ICLTensorProxy&&) = default;
+    ICLTensorProxy& operator=(ICLTensorProxy&&) = default;
+
+    void set(arm_compute::ICLTensor* iclTensor)
+    {
+        if(iclTensor != nullptr)
+        {
+            m_DelegateTensor = iclTensor;
+        }
+    }
+
+    // Inherited methods overridden:
+    arm_compute::ITensorInfo* info() const
+    {
+        ARM_COMPUTE_ERROR_ON(m_DelegateTensor == nullptr);
+        return m_DelegateTensor->info();
+    }
+
+    arm_compute::ITensorInfo* info()
+    {
+        ARM_COMPUTE_ERROR_ON(m_DelegateTensor == nullptr);
+        return m_DelegateTensor->info();
+    }
+
+    uint8_t* buffer() const
+    {
+        ARM_COMPUTE_ERROR_ON(m_DelegateTensor == nullptr);
+        return m_DelegateTensor->buffer();
+    }
+
+    arm_compute::CLQuantization quantization() const
+    {
+        ARM_COMPUTE_ERROR_ON(m_DelegateTensor == nullptr);
+        return m_DelegateTensor->quantization();
+    }
+
+    const cl::Buffer& cl_buffer() const
+    {
+        ARM_COMPUTE_ERROR_ON(m_DelegateTensor == nullptr);
+        return m_DelegateTensor->cl_buffer();
+    }
+
+protected:
+    uint8_t* do_map(cl::CommandQueue& q, bool blocking)
+    {
+        ARM_COMPUTE_ERROR_ON(m_DelegateTensor == nullptr);
+        m_DelegateTensor->map(q, blocking);
+        return m_DelegateTensor->buffer();
+    }
+    void do_unmap(cl::CommandQueue& q)
+    {
+        ARM_COMPUTE_ERROR_ON(m_DelegateTensor == nullptr);
+        return m_DelegateTensor->unmap(q);
+    }
+
+private:
+    arm_compute::ICLTensor* m_DelegateTensor{ nullptr };
+};
+
+} //namespace armnn
\ No newline at end of file