Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e2cfe2b

Browse files
authored
Fix generator<T> to satisfy the range concept
* Iterator type needed to support equality comparisons both it == sentinel and sentinel == it. * difference_type needed to be a signed integer (it was an unsigned size_t)
1 parent 1d5a4d9 commit e2cfe2b

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

include/cppcoro/generator.hpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ namespace cppcoro
9393

9494
using iterator_category = std::input_iterator_tag;
9595
// What type should we use for counting elements of a potentially infinite sequence?
96-
using difference_type = std::size_t;
96+
using difference_type = std::ptrdiff_t;
9797
using value_type = typename generator_promise<T>::value_type;
9898
using reference = typename generator_promise<T>::reference_type;
9999
using pointer = typename generator_promise<T>::pointer_type;
@@ -107,25 +107,25 @@ namespace cppcoro
107107
: m_coroutine(coroutine)
108108
{}
109109

110-
bool operator==(const generator_iterator& other) const noexcept
110+
friend bool operator==(const generator_iterator& it, generator_sentinel) noexcept
111111
{
112-
return m_coroutine == other.m_coroutine;
112+
return !it.m_coroutine || it.m_coroutine.done();
113113
}
114114

115-
bool operator==(generator_sentinel) const noexcept
116-
{
117-
return !m_coroutine || m_coroutine.done();
118-
}
119-
120-
bool operator!=(const generator_iterator& other) const noexcept
115+
friend bool operator!=(const generator_iterator& it, generator_sentinel) noexcept
121116
{
122117
return !(*this == other);
123118
}
124119

125-
bool operator!=(generator_sentinel other) const noexcept
126-
{
127-
return !operator==(other);
128-
}
120+
friend bool operator==(generator_sentinel s, const generator_iterator& it) noexcept
121+
{
122+
return (it == s);
123+
}
124+
125+
friend bool operator!=(generator_sentinel s, const generator_iterator& it) noexcept
126+
{
127+
return it != s;
128+
}
129129

130130
generator_iterator& operator++()
131131
{
@@ -201,11 +201,11 @@ namespace cppcoro
201201
m_coroutine.resume();
202202
if (m_coroutine.done())
203203
{
204-
m_coroutine.promise().rethrow_if_exception();
204+
m_coroutine.promise().rethrow_if_exception();
205205
}
206206
}
207207

208-
return iterator{ m_coroutine };
208+
return iterator{ m_coroutine };
209209
}
210210

211211
detail::generator_sentinel end() noexcept

0 commit comments

Comments
 (0)