17 template<
typename TIndex,
typename TExtentVec,
typename TFnObj>
18 constexpr void ndLoopImpl(std::index_sequence<>, TIndex& idx, TExtentVec
const&, TFnObj
const& f)
23 template<std::size_t Tdim0, std::size_t... Tdims,
typename TIndex,
typename TExtentVec,
typename TFnObj>
25 std::index_sequence<Tdim0, Tdims...>,
27 TExtentVec
const& extent,
30 static_assert(TIndex::dim() > 0u,
"The dimension given to ndLoop has to be larger than zero!");
32 TIndex::dim() == TExtentVec::dim(),
33 "The dimensions of the iteration vector and the extent vector have to be identical!");
34 static_assert(TIndex::dim() > Tdim0,
"The current dimension has to be in the range [0,dim-1]!");
36 for(idx[Tdim0] = 0u; idx[Tdim0] < extent[Tdim0]; ++idx[Tdim0])
38 ndLoopImpl(std::index_sequence<Tdims...>{}, idx, extent, f);
50 template<
typename TExtentVec,
typename TFnObj, std::size_t... Tdims>
52 [[maybe_unused]] std::index_sequence<Tdims...> indexSequence,
54 TExtentVec
const& extent,
55 TFnObj
const& f) ->
void
59 "The values in the index_sequence have to be in the range [0,dim-1]!");
62 "The values in the index_sequence have to be unique!");
72 template<
typename TExtentVec,
typename TFnObj>
73 auto ndLoopIncIdx(TExtentVec& idx, TExtentVec
const& extent, TFnObj
const& f) ->
void
75 idx = TExtentVec::fill(0);
76 ndLoop(std::make_index_sequence<TExtentVec::dim()>(), idx, extent, f);
79 template<
typename TExtentVec,
typename TFnObj>
80 auto ndLoopIncIdx(TExtentVec
const& extent, TFnObj
const& f) ->
void
83 using IndexVector =
typename TExtentVec::UniVec;
84 auto idx = IndexVector::fill(0);
86 ndLoop(std::make_index_sequence<TExtentVec::dim()>(), idx, IndexVector{extent}, f);