Skip to content

Commit c4a0800

Browse files
authored
Merge pull request #16 from sjinks/remove-cbegin
fix: `cbegin`/`cend` are provided by `std::ranges::view_interface`
2 parents 701cc67 + c3d0f61 commit c4a0800

File tree

2 files changed

+22
-56
lines changed

2 files changed

+22
-56
lines changed

src/generator.h

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -446,27 +446,6 @@ class [[nodiscard]] generator : public std::ranges::view_interface<generator<Res
446446
*/
447447
[[nodiscard]] constexpr iterator end() const noexcept { return iterator(nullptr); }
448448

449-
/**
450-
* @brief Returns a constant iterator to the **current** item of the generator.
451-
*
452-
* Alias for `begin() const`.
453-
*
454-
* @return Constant iterator.
455-
* @overload
456-
*/
457-
[[nodiscard]] iterator cbegin() const { return this->begin(); }
458-
459-
/**
460-
* @brief Returns a cinstant sentinel iterator.
461-
*
462-
* Alias for `end() const`.
463-
*
464-
* @return Constant sentinel iterator.
465-
* @internal
466-
* @test @a GeneratorTest.SumIterator
467-
*/
468-
[[nodiscard]] iterator cend() const noexcept { return this->end(); }
469-
470449
private:
471450
/** @brief Coroutine handle. */
472451
std::coroutine_handle<promise_type> m_coroutine;

test/generator.cpp

Lines changed: 22 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ generator<T> first_n(T n)
4545
{
4646
T v{0};
4747
while (v < n) {
48-
co_yield v++;
48+
co_yield v++; // NOSONAR
4949
}
5050
}
5151

@@ -54,7 +54,7 @@ requires(std::is_arithmetic_v<T>)
5454
generator<T> iota(T n = T{0})
5555
{
5656
while (true) {
57-
co_yield n++;
57+
co_yield n++; // NOSONAR
5858
}
5959
}
6060

@@ -67,25 +67,25 @@ generator<T> value(T v)
6767
/**
6868
* The original version was buggy because it did not handle the case where the last line did not end with a newline.
6969
*/
70-
generator<std::vector<std::string>> split_by_lines_and_whitespace(std::string_view sv)
70+
generator<std::vector<std::string>> split_by_lines_and_whitespace(std::string s)
7171
{
7272
std::vector<std::string> res;
7373
std::string_view::size_type start = 0;
74-
const std::string_view::size_type end = sv.size();
74+
const std::string_view::size_type end = s.size();
7575

7676
while (start < end) {
77-
auto pos = sv.find_first_of(" \n", start);
77+
auto pos = s.find_first_of(" \n", start);
7878

7979
if (pos != std::string_view::npos) {
80-
res.emplace_back(sv.substr(start, pos - start));
80+
res.emplace_back(s.substr(start, pos - start));
8181
start = pos + 1;
8282
}
8383
else {
84-
res.emplace_back(sv.substr(start));
84+
res.emplace_back(s.substr(start));
8585
start = end;
8686
}
8787

88-
if (pos == std::string_view::npos || sv[pos] == '\n') {
88+
if (pos == std::string_view::npos || s[pos] == '\n') {
8989
co_yield res;
9090
res.clear();
9191
}
@@ -108,6 +108,10 @@ generator<std::pair<std::size_t, std::ranges::range_reference_t<Range>>> enumera
108108
}
109109
}
110110

111+
class test_error : public std::runtime_error {
112+
using std::runtime_error::runtime_error;
113+
};
114+
111115
} // namespace
112116

113117
TEST(GeneratorTest, Fibonacci)
@@ -139,23 +143,6 @@ TEST(GeneratorTest, Sum)
139143
EXPECT_EQ(actual, expected);
140144
}
141145

142-
TEST(GeneratorTest, SumIterator)
143-
{
144-
using value_type = unsigned int;
145-
constexpr value_type count = 10U;
146-
147-
auto&& generator = first_n(count + 1);
148-
149-
constexpr value_type expected = 55U;
150-
value_type actual = 0U;
151-
// NOLINTNEXTLINE(modernize-loop-convert) -- we want to test cbegin()/cend()
152-
for (auto it = generator.cbegin(); it != generator.cend(); ++it) {
153-
actual += *it;
154-
}
155-
156-
EXPECT_EQ(actual, expected);
157-
}
158-
159146
TEST(GeneratorTest, AdvanceWithBegin)
160147
{
161148
using value_type = unsigned int;
@@ -188,7 +175,8 @@ TEST(GeneratorTest, MoveConstruct)
188175
{
189176
auto nat = [](std::size_t n) -> generator<std::size_t> {
190177
while (true) {
191-
co_yield ++n;
178+
++n;
179+
co_yield n;
192180
}
193181
}(0);
194182

@@ -249,7 +237,7 @@ TEST(GeneratorTest, MoveAssignSelf)
249237
g = std::move(g);
250238
#pragma clang diagnostic pop
251239

252-
EXPECT_EQ(*g.cbegin(), 1);
240+
EXPECT_EQ(*g.begin(), 1);
253241
}
254242

255243
TEST(GeneratorTest, View)
@@ -267,7 +255,7 @@ TEST(GeneratorTest, View)
267255

268256
value_type actual_count = 0U;
269257
value_type actual_sum = 0U;
270-
for (auto&& n : iota<value_type>(1) | std::views::take(5)) {
258+
for (const auto& n : iota<value_type>(1) | std::views::take(5)) {
271259
++actual_count;
272260
actual_sum += n;
273261
}
@@ -279,26 +267,26 @@ TEST(GeneratorTest, View)
279267
TEST(GeneratorTest, ExceptionBeforeYield)
280268
{
281269
auto gen = []() -> generator<int> {
282-
throw std::runtime_error("Goodbye");
270+
throw test_error("Goodbye");
283271
#pragma clang diagnostic push
284272
#pragma clang diagnostic ignored "-Wunreachable-code"
285273
co_yield 1;
286274
#pragma clang diagnostic pop
287275
}();
288276

289-
EXPECT_THROW(static_cast<void>(gen.begin()), std::runtime_error);
277+
EXPECT_THROW(static_cast<void>(gen.begin()), test_error);
290278
}
291279

292280
TEST(GeneratorTest, ExceptionAfterYield)
293281
{
294282
auto gen = []() -> generator<int> {
295283
co_yield 1;
296-
throw std::runtime_error("Goodbye");
284+
throw test_error("Goodbye");
297285
}();
298286

299287
auto it = gen.begin();
300288
EXPECT_EQ(*it, 1);
301-
EXPECT_THROW(++it, std::runtime_error);
289+
EXPECT_THROW(++it, test_error);
302290
EXPECT_EQ(it, gen.end());
303291
}
304292

@@ -309,7 +297,7 @@ TEST(GeneratorTest, IteratorUB)
309297
// Two begin() calls, therefore, will get the second value of the sequence
310298
// Because the value is shared among all iterators, *it1 == *it2
311299
auto it1 = generator.begin();
312-
auto it2 = generator.cbegin();
300+
auto it2 = generator.begin();
313301

314302
EXPECT_EQ(*it1, 2);
315303
EXPECT_EQ(*it2, 2);
@@ -375,7 +363,6 @@ TEST(GeneratorIteratorTest, AccessEndIterator)
375363
++it;
376364

377365
EXPECT_EQ(it, g.end());
378-
EXPECT_EQ(it, g.cend());
379366

380367
EXPECT_THROW(*it, bad_result_access);
381368
EXPECT_THROW(*g.end(), bad_result_access);
@@ -483,7 +470,7 @@ TEST(TLGeneratorTest, split)
483470
auto&& gen = split_by_lines_and_whitespace(input);
484471

485472
std::size_t cnt = 0;
486-
for (auto&& [i, val] : enumerate(gen)) {
473+
for (const auto& [i, val] : enumerate(gen)) {
487474
EXPECT_EQ(val, expected.at(i));
488475
++cnt;
489476
}

0 commit comments

Comments
 (0)