22 template<
typename T_
idxType>
25 using index_type = T_idxType;
29 static_assert(std::forward_iterator<MdForwardIterEnd>);
34 : m_extentSlowDim{mdSpan.getExtents()[0]}
40 return m_extentSlowDim;
45 return (m_extentSlowDim == other.m_extentSlowDim);
50 return !(*
this == other);
54 index_type m_extentSlowDim;
57 template<alpaka::concepts::IMdSpan T_MdSpan>
60 template<alpaka::concepts::IMdSpan T_MdSpan>
63 using index_type =
typename T_MdSpan::index_type;
67 static constexpr uint32_t iterDim = T_MdSpan::dim();
72 static_assert(std::forward_iterator<MdForwardIter>);
73 static_assert(std::input_or_output_iterator<MdForwardIter>);
77 constexpr MdForwardIter(T_MdSpan
const& mdSpan) : m_mdSpan(mdSpan), m_current{IterIdxVecType::fill(0u)}
80 for(uint32_t idx = 0; idx < iterDim; ++idx)
82 if(m_mdSpan.getExtents()[idx] == index_type{0u})
84 m_current[0] = m_mdSpan.getExtents()[0];
95 constexpr decltype(
auto)
operator*()
const
97 return m_mdSpan[m_current];
100 constexpr decltype(
auto)
operator*()
102 return m_mdSpan[m_current];
108 for(uint32_t d = 0; d < iterDim; ++d)
110 uint32_t
const idx = iterDim - 1u - d;
111 m_current[idx] += index_type{1u};
112 if constexpr(iterDim != 1u)
114 if(idx >= 1u && m_current[idx] >= m_mdSpan.getExtents()[idx])
116 m_current[idx] = index_type{0u};
135 return (m_current == other.m_current);
140 return !(*
this == other);
145 IterIdxVecType m_current;
148 template<
typename T_MdSpan>
156 template<
typename T_MdSpan>
161 return !(mdIteratorEnd == mdIter);
164 template<
typename T_MdSpan>
172 template<
typename T_MdSpan>
177 return !(mdIteratorEnd == mdIter);
special implementation to define the end
constexpr bool operator!=(MdForwardIterEnd const &other) const
constexpr auto operator*() const
constexpr bool operator==(MdForwardIterEnd const &other) const
constexpr MdForwardIterEnd(alpaka::concepts::IMdSpan auto const &mdSpan)
ALPAKA_FN_ACC constexpr index_type slowCurrent() const
ALPAKA_FN_ACC MdForwardIter operator++(int)
ALPAKA_FN_ACC MdForwardIter & operator++()
constexpr bool operator!=(MdForwardIter const &other) const
constexpr bool operator==(MdForwardIter const &other) const
constexpr MdForwardIter(T_MdSpan const &mdSpan)
#define ALPAKA_FN_ACC
All functions that can be used on an accelerator have to be attributed with ALPAKA_FN_ACC or ALPAKA_F...
#define ALPAKA_FN_HOST_ACC
All functions that can be used on an accelerator have to be attributed with ALPAKA_FN_ACC or ALPAKA_F...
Interface concept for objects describing multidimensional memory access.
ALPAKA_FN_HOST_ACC MdForwardIterEnd(T_MdSpan const &) -> MdForwardIterEnd< typename T_MdSpan::index_type >
constexpr bool operator!=(concepts::Executor auto lhs, concepts::Executor auto rhs)
constexpr bool operator==(concepts::Executor auto lhs, concepts::Executor auto rhs)