COMPMID-1405: Create our own gemm_native kernel / function.

Change-Id: Ie0a80bd6b4eb5632cac63ccf54bcb07d4309da19
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/140305
Tested-by: Jenkins <bsgcomp@arm.com>
Reviewed-by: Giorgio Arena <giorgio.arena@arm.com>
Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com>
diff --git a/arm_compute/core/WindowIterator.h b/arm_compute/core/WindowIterator.h
index 13e9973..13cb9cf 100644
--- a/arm_compute/core/WindowIterator.h
+++ b/arm_compute/core/WindowIterator.h
@@ -24,6 +24,7 @@
 #ifndef __ARM_COMPUTE_WINDOW_ITERATOR_H__
 #define __ARM_COMPUTE_WINDOW_ITERATOR_H__
 #include "arm_compute/core/Coordinates.h"
+#include "arm_compute/core/Error.h"
 #include "arm_compute/core/ITensor.h"
 #include "arm_compute/core/Window.h"
 
@@ -71,9 +72,20 @@
      */
     inline size_t stride(size_t dim) const
     {
+        ARM_COMPUTE_ERROR_ON(_strides[dim] % sizeof(T) != 0);
         return _strides[dim] / sizeof(T);
     }
 
+    /** Manually set the stride of a dimension
+     *
+     * @param[in] dim  Dimension of the stride to set.
+     * @param[in] size Value to set the stride to (in bytes).
+     */
+    void set_stride(size_t dim, size_t size)
+    {
+        _strides[dim] = size;
+    }
+
     /** Returns a pointer to the element at coordinates (x,y,z,w)
      *
      * @param[in] x X coordinates
@@ -99,8 +111,8 @@
     }
 
 private:
-    uint8_t       *_first;   /**< Pointer to the first element of the tensor.*/
-    const Strides &_strides; /**< Strides in bytes of the tensor */
+    uint8_t *_first;   /**< Pointer to the first element of the tensor.*/
+    Strides  _strides; /**< Strides in bytes of the tensor */
 };
 
 /** Iterate over a portion of a Window */