#pragma once #include #include #include namespace AMDiS { namespace Ranges { template constexpr void forVariadic(Functor&& f, Args&&... args) { (f(FWD(args)),...); } template constexpr void forEach(std::index_sequence, Tuple&& tuple, Functor&& f) { using std::get; (f(get(tuple)),...); } template constexpr void forEach(Tuple&& tuple, Functor&& f) { Ranges::forEach(std::make_index_sequence>{}, FWD(tuple), FWD(f)); } template constexpr void forEach(std::array const& a, Functor&& f) { for (auto const& ai : a) f(ai); } template constexpr void forEach(std::vector const& v, Functor&& f) { for (auto const& vi : v) f(vi); } template constexpr void forIndices(std::index_sequence, Functor&& f) { (f(index_t{}),...); } template constexpr void forIndices(index_t, index_t, Functor&& f) { Ranges::forIndices(std::make_index_sequence{}, FWD(f)); } template constexpr void forIndices(index_t, Functor&& f) { Ranges::forIndices(std::make_index_sequence{}, FWD(f)); } template constexpr void forIndices(Functor&& f) { Ranges::forIndices(std::make_index_sequence{}, FWD(f)); } template constexpr void forIndices(Functor&& f) { Ranges::forIndices<0>(std::make_index_sequence{}, FWD(f)); } } // end namespace Ranges } // end namespace AMDiS