COMPMID-1379: Created WindowIterator and TensorAccessor

- WindowIterator: used to iterate over arbitrary positions of a window. (More flexible than execute_window_loop which only can iterate over entire dimensions)
- TensorAccessor: RSH's code uses pointers to specialised types and strides in element sizes, this helps interfacing with their code.

Change-Id: I8ded8758d345668804873409f949b8cec694d289
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/139082
Tested-by: Jenkins <bsgcomp@arm.com>
Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com>
diff --git a/arm_compute/core/Window.inl b/arm_compute/core/Window.inl
index 8401227..c6fc884 100644
--- a/arm_compute/core/Window.inl
+++ b/arm_compute/core/Window.inl
@@ -247,4 +247,24 @@
         set(n, Window::Dimension(0, std::max(shape[n], static_cast<size_t>(1))));
     }
 }
+
+inline TensorShape Window::shape() const
+{
+    TensorShape shape;
+    for(size_t d = 0; d < TensorShape::num_max_dimensions; ++d)
+    {
+        shape.set(d, (_dims[d].end() - _dims[d].start()) / _dims[d].step());
+    }
+    return shape;
+}
+
+inline size_t Window::num_iterations_total() const
+{
+    size_t total = 1;
+    for(size_t d = 0; d < Coordinates::num_max_dimensions; ++d)
+    {
+        total *= num_iterations(d);
+    }
+    return total;
+}
 }