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