IVGCVSW-3606 Support memory import for Reference backend

Signed-off-by: Ferran Balaguer <ferran.balaguer@arm.com>
Change-Id: I94bd191f88e0911ad4e4727610e81cd7afa95512
diff --git a/src/backends/reference/RefTensorHandle.cpp b/src/backends/reference/RefTensorHandle.cpp
index fe9310f..59ccec6 100644
--- a/src/backends/reference/RefTensorHandle.cpp
+++ b/src/backends/reference/RefTensorHandle.cpp
@@ -11,7 +11,21 @@
     m_TensorInfo(tensorInfo),
     m_MemoryManager(memoryManager),
     m_Pool(nullptr),
-    m_UnmanagedMemory(nullptr)
+    m_UnmanagedMemory(nullptr),
+    m_ImportFlags(static_cast<MemorySourceFlags>(MemorySource::Undefined)),
+    m_Imported(false)
+{
+
+}
+
+RefTensorHandle::RefTensorHandle(const TensorInfo& tensorInfo, std::shared_ptr<RefMemoryManager> &memoryManager,
+                                 MemorySourceFlags importFlags)
+                                 : m_TensorInfo(tensorInfo),
+                                   m_MemoryManager(memoryManager),
+                                   m_Pool(nullptr),
+                                   m_UnmanagedMemory(nullptr),
+                                   m_ImportFlags(importFlags),
+                                   m_Imported(false)
 {
 
 }
@@ -86,4 +100,43 @@
     memcpy(dest, src, m_TensorInfo.GetNumBytes());
 }
 
+bool RefTensorHandle::Import(void* memory, MemorySource source)
+{
+
+    if (m_ImportFlags & static_cast<MemorySourceFlags>(source))
+    {
+        if (source == MemorySource::Malloc)
+        {
+            // Checks the 16 byte memory alignment.
+            if (reinterpret_cast<uint64_t>(memory) % 16)
+            {
+                return false;
+            }
+
+            // m_UnmanagedMemory not yet allocated.
+            if (!m_Imported && !m_UnmanagedMemory)
+            {
+                m_UnmanagedMemory = memory;
+                m_Imported = true;
+                return true;
+            }
+
+            // m_UnmanagedMemory initially allocated with Allocate().
+            if (!m_Imported && m_UnmanagedMemory)
+            {
+                return false;
+            }
+
+            // m_UnmanagedMemory previously imported.
+            if (m_Imported)
+            {
+                m_UnmanagedMemory = memory;
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
 }