Make enumerate() iterator suitable for use with std::ranges

std::ranges algorithms include requires() clauses that:
- rejected enumerated_sentinel: not default-constructible
- rejected enumerated_sentinel: not assignable due to `const` member
- rejected enumerated_iterator: no postfix operator++

None of these need to be satisfied for enumerate to work properly, but
this commit satisfies and models these requirements, so that future use
of std::ranges algorithms will work.
This commit is contained in:
Kp 2023-01-14 19:05:37 +00:00
parent 9188c72b34
commit 34046216a2

View file

@ -60,7 +60,8 @@ template <typename sentinel_type>
class enumerated_sentinel
{
public:
const sentinel_type m_sentinel;
sentinel_type m_sentinel;
constexpr enumerated_sentinel() = default;
constexpr enumerated_sentinel(sentinel_type &&iter) :
m_sentinel(std::move(iter))
{
@ -106,6 +107,12 @@ public:
++ m_idx;
return *this;
}
enumerated_iterator operator++(int)
{
auto result = *this;
++ * this;
return result;
}
constexpr bool operator==(const enumerated_sentinel<sentinel_type> &i) const
{
return m_iter == i.m_sentinel;