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