29 #include <initializer_list>
33 template <
unsigned int D>
37 std::array<unsigned int, D> m_sizes{};
38 std::array<unsigned int, D> m_totalsizes{};
44 unsigned int m_pos = 0;
45 unsigned int m_end = 0;
48 NDRangeIterator(
const NDRange &p,
unsigned int s,
unsigned int e) : m_parent(p), m_pos(s), m_end(e)
54 return (m_pos >= m_end);
57 unsigned int dim(
unsigned int d)
const
59 unsigned int r = m_pos;
63 r %= m_parent.m_totalsizes[d];
68 r /= m_parent.m_totalsizes[d - 1];
83 m_pos += m_parent.m_sizes[0] - dim(0);
88 unsigned int dim0_max()
const
90 unsigned int offset = std::min(m_end - m_pos, m_parent.m_sizes[0] - dim(0));
100 for (
unsigned int i = 0; i < D; i++)
117 template <
typename... T>
123 NDRange(
const std::array<unsigned int, D> &n) : m_sizes(n)
128 NDRangeIterator
iterator(
unsigned int start,
unsigned int end)
const
130 return NDRangeIterator(*
this, start,
end);
135 return m_totalsizes[D - 1];
147 template <
unsigned int N>
150 using int_t =
unsigned int;
153 std::array<int_t, N> m_positions{};
158 NDCoordinate(
const std::initializer_list<std::pair<int_t, int_t>> &list)
160 std::array<int_t, N> sizes{};
165 m_positions[i] = p.first;
166 sizes[i++] = p.second;
177 return m_positions[d];