Add util::array iterators over range of indices
This commit is contained in:
parent
4bb287eb70
commit
e520b464e4
1 changed files with 73 additions and 0 deletions
|
|
@ -96,6 +96,10 @@ namespace psemek::util
|
||||||
|
|
||||||
void fill(T const & value);
|
void fill(T const & value);
|
||||||
|
|
||||||
|
auto index_begin() const;
|
||||||
|
auto index_end() const;
|
||||||
|
auto indices() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<T[]> data_;
|
std::unique_ptr<T[]> data_;
|
||||||
std::array<std::size_t, N> dims_;
|
std::array<std::size_t, N> dims_;
|
||||||
|
|
@ -148,6 +152,75 @@ namespace psemek::util
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <std::size_t N>
|
||||||
|
struct array_index_iterator
|
||||||
|
{
|
||||||
|
std::array<std::size_t, N> idx;
|
||||||
|
std::array<std::size_t, N> dims;
|
||||||
|
|
||||||
|
bool end;
|
||||||
|
|
||||||
|
std::array<std::size_t, N> const & operator*() const { return idx; }
|
||||||
|
|
||||||
|
array_index_iterator & operator ++()
|
||||||
|
{
|
||||||
|
end = next(idx, dims);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct array_index_iterator_sentinel
|
||||||
|
{};
|
||||||
|
|
||||||
|
template <std::size_t N>
|
||||||
|
bool operator == (array_index_iterator<N> const & it, array_index_iterator_sentinel)
|
||||||
|
{
|
||||||
|
return it.end;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <std::size_t N>
|
||||||
|
bool operator != (array_index_iterator<N> const & it, array_index_iterator_sentinel)
|
||||||
|
{
|
||||||
|
return !it.end;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <std::size_t N>
|
||||||
|
struct array_index_range
|
||||||
|
{
|
||||||
|
std::array<std::size_t, N> dims;
|
||||||
|
|
||||||
|
array_index_iterator<N> begin() const
|
||||||
|
{
|
||||||
|
std::array<std::size_t, N> idx;
|
||||||
|
for (std::size_t i = 0; i < N; ++i)
|
||||||
|
idx[i] = 0;
|
||||||
|
return {idx, dims, false};
|
||||||
|
}
|
||||||
|
|
||||||
|
array_index_iterator_sentinel end() const
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
auto array<T, N>::index_begin() const
|
||||||
|
{
|
||||||
|
return indices().begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
auto array<T, N>::index_end() const
|
||||||
|
{
|
||||||
|
return indices().end();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
auto array<T, N>::indices() const
|
||||||
|
{
|
||||||
|
return detail::array_index_range<N>{dims_};
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, std::size_t N>
|
template <typename T, std::size_t N>
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue