COMPMID-838 Implement CLPermute

Change-Id: I6d97b649f1ebc289c9e6f8949e67740a6b3cbcb2
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/116636
Tested-by: Jenkins <bsgcomp@arm.com>
Reviewed-by: Pablo Tello <pablo.tello@arm.com>
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
diff --git a/arm_compute/core/Window.inl b/arm_compute/core/Window.inl
index e46a0ec..1b21820 100644
--- a/arm_compute/core/Window.inl
+++ b/arm_compute/core/Window.inl
@@ -72,6 +72,22 @@
     return collapsed;
 }
 
+inline Window Window::collapse(const Window &full_window, size_t first) const
+{
+    Window collapsed = collapse_if_possible(full_window, first);
+    // Make sure that the window has collapsed
+    int end   = _dims[first].end();
+    int start = 0;
+    ARM_COMPUTE_UNUSED(start);
+    for(size_t d = first + 1; d < Coordinates::num_max_dimensions; ++d)
+    {
+        start = end * _dims[d].start();
+        end *= _dims[d].end();
+    }
+    ARM_COMPUTE_ERROR_ON((collapsed[first].end() != end) || (collapsed[first].start() != start));
+    return collapsed;
+}
+
 inline void Window::shift(size_t dimension, int shift_value)
 {
     ARM_COMPUTE_ERROR_ON(dimension >= Coordinates::num_max_dimensions);