COMPMID-443: Collapse higher dimensions for activation layer

Change-Id: I5943235aff1bb6440e3ab08e818d53aa5d94143a
Reviewed-on: http://mpd-gerrit.cambridge.arm.com/80349
Tested-by: Kaizen <jeremy.johnson+kaizengerrit@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 75428a1..c33613f 100644
--- a/arm_compute/core/Window.inl
+++ b/arm_compute/core/Window.inl
@@ -43,6 +43,35 @@
     _dims[dimension] = dim;
 }
 
+inline Window Window::collapse_if_possible(const Window &full_window, size_t first) const
+{
+    bool   is_collapsable = false;
+    Window collapsed;
+    for(size_t d = 0; d < Coordinates::num_max_dimensions; ++d)
+    {
+        if(is_collapsable)
+        {
+            collapsed.set(first, Window::Dimension(collapsed[first].end() * _dims[d].start(), collapsed[first].end() * _dims[d].end()));
+        }
+        else
+        {
+            collapsed.set(d, _dims[d]);
+        }
+
+        if(is_collapsable || d == first) // Try to start collapsing from this dimension
+        {
+            // The _dims's dimension must match the full _dims dimension to be collapsable:
+            is_collapsable = _dims[d].start() == 0 && _dims[d].start() == full_window[d].start()
+                             && full_window[d].end() == _dims[d].end();
+        }
+        else
+        {
+            is_collapsable = false;
+        }
+    }
+    return collapsed;
+}
+
 inline void Window::shift(const size_t dimension, const int shift_value)
 {
     ARM_COMPUTE_ERROR_ON(dimension >= Coordinates::num_max_dimensions);