From d5e488d6574f3cba56bc80604f4fe47dea7341c5 Mon Sep 17 00:00:00 2001
From: namark <namark@disroot.org>
Date: Fri, 20 Mar 2020 03:00:32 +0400
Subject: [PATCH] Range version of the multidimensional loop.

---
 source/simple/geom/algorithm.h   | 18 ++++++++++++++++++
 source/simple/geom/algorithm.hpp | 26 ++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/source/simple/geom/algorithm.h b/source/simple/geom/algorithm.h
index a7a3d5a..93825b9 100644
--- a/source/simple/geom/algorithm.h
+++ b/source/simple/geom/algorithm.h
@@ -1,6 +1,7 @@
 #ifndef SIMPLE_GEOM_ALGORITHM_H
 #define SIMPLE_GEOM_ALGORITHM_H
 #include "vector.hpp"
+#include "simple/support/range.hpp"
 
 namespace simple::geom
 {
@@ -23,6 +24,23 @@ namespace simple::geom
 		Function&& callback
 	);
 
+	template <typename Coordinate, size_t Dimensions, typename Order, typename Function, size_t LoopDimesntions = Dimensions>
+	constexpr void loop_on
+	(
+		vector<Coordinate, Dimensions, Order>& index,
+		const support::range<vector<Coordinate, Dimensions, Order>>&,
+		const vector<Coordinate, Dimensions, Order>& step,
+		Function&& callback
+	);
+
+	template <typename Coordinate, size_t Dimensions, typename Order, typename Function>
+	constexpr void loop
+	(
+		const support::range<vector<Coordinate, Dimensions, Order>>&,
+		const vector<Coordinate, Dimensions, Order>& step,
+		Function&& callback
+	);
+
 	template <typename Coordinate,
 		size_t Rows, size_t Columns,
 		typename RowOrder, typename ColumnOrder
diff --git a/source/simple/geom/algorithm.hpp b/source/simple/geom/algorithm.hpp
index aedad9c..dea4d7e 100644
--- a/source/simple/geom/algorithm.hpp
+++ b/source/simple/geom/algorithm.hpp
@@ -52,6 +52,32 @@ namespace simple::geom
 			 std::forward<Function>(callback));
 	}
 
+	template <typename Coordinate, size_t Dimensions, typename Order, typename Function, size_t LoopDimesntions = Dimensions>
+	constexpr void loop_on
+	(
+		vector<Coordinate, Dimensions, Order>& index,
+		const support::range<vector<Coordinate, Dimensions, Order>>& bounds,
+		const vector<Coordinate, Dimensions, Order>& step,
+		Function&& callback
+	)
+	{
+		loop_on(index, bounds.lower(), bounds.upper(), step,
+			 std::forward<Function>(callback));
+	}
+
+	template <typename Coordinate, size_t Dimensions, typename Order, typename Function>
+	constexpr void loop
+	(
+		const support::range<vector<Coordinate, Dimensions, Order>>& bounds,
+		const vector<Coordinate, Dimensions, Order>& step,
+		Function&& callback
+	)
+	{
+		vector<Coordinate, Dimensions, Order> index{};
+		loop_on(index, bounds, step,
+			 std::forward<Function>(callback));
+	}
+
 	template <typename Coordinate,
 		size_t Rows, size_t Columns,
 		typename RowOrder, typename ColumnOrder
-- 
GitLab