@@ -45,7 +45,7 @@ generator<T> first_n(T n)
45
45
{
46
46
T v{0 };
47
47
while (v < n) {
48
- co_yield v++;
48
+ co_yield v++; // NOSONAR
49
49
}
50
50
}
51
51
@@ -54,7 +54,7 @@ requires(std::is_arithmetic_v<T>)
54
54
generator<T> iota (T n = T{0 })
55
55
{
56
56
while (true ) {
57
- co_yield n++;
57
+ co_yield n++; // NOSONAR
58
58
}
59
59
}
60
60
@@ -67,25 +67,25 @@ generator<T> value(T v)
67
67
/* *
68
68
* The original version was buggy because it did not handle the case where the last line did not end with a newline.
69
69
*/
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 )
71
71
{
72
72
std::vector<std::string> res;
73
73
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 ();
75
75
76
76
while (start < end) {
77
- auto pos = sv .find_first_of (" \n " , start);
77
+ auto pos = s .find_first_of (" \n " , start);
78
78
79
79
if (pos != std::string_view::npos) {
80
- res.emplace_back (sv .substr (start, pos - start));
80
+ res.emplace_back (s .substr (start, pos - start));
81
81
start = pos + 1 ;
82
82
}
83
83
else {
84
- res.emplace_back (sv .substr (start));
84
+ res.emplace_back (s .substr (start));
85
85
start = end;
86
86
}
87
87
88
- if (pos == std::string_view::npos || sv [pos] == ' \n ' ) {
88
+ if (pos == std::string_view::npos || s [pos] == ' \n ' ) {
89
89
co_yield res;
90
90
res.clear ();
91
91
}
@@ -108,6 +108,10 @@ generator<std::pair<std::size_t, std::ranges::range_reference_t<Range>>> enumera
108
108
}
109
109
}
110
110
111
+ class test_error : public std ::runtime_error {
112
+ using std::runtime_error::runtime_error;
113
+ };
114
+
111
115
} // namespace
112
116
113
117
TEST (GeneratorTest, Fibonacci)
@@ -139,23 +143,6 @@ TEST(GeneratorTest, Sum)
139
143
EXPECT_EQ (actual, expected);
140
144
}
141
145
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
-
159
146
TEST (GeneratorTest, AdvanceWithBegin)
160
147
{
161
148
using value_type = unsigned int ;
@@ -188,7 +175,8 @@ TEST(GeneratorTest, MoveConstruct)
188
175
{
189
176
auto nat = [](std::size_t n) -> generator<std::size_t > {
190
177
while (true ) {
191
- co_yield ++n;
178
+ ++n;
179
+ co_yield n;
192
180
}
193
181
}(0 );
194
182
@@ -249,7 +237,7 @@ TEST(GeneratorTest, MoveAssignSelf)
249
237
g = std::move (g);
250
238
#pragma clang diagnostic pop
251
239
252
- EXPECT_EQ (*g.cbegin (), 1 );
240
+ EXPECT_EQ (*g.begin (), 1 );
253
241
}
254
242
255
243
TEST (GeneratorTest, View)
@@ -267,7 +255,7 @@ TEST(GeneratorTest, View)
267
255
268
256
value_type actual_count = 0U ;
269
257
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 )) {
271
259
++actual_count;
272
260
actual_sum += n;
273
261
}
@@ -279,26 +267,26 @@ TEST(GeneratorTest, View)
279
267
TEST (GeneratorTest, ExceptionBeforeYield)
280
268
{
281
269
auto gen = []() -> generator<int > {
282
- throw std::runtime_error (" Goodbye" );
270
+ throw test_error (" Goodbye" );
283
271
#pragma clang diagnostic push
284
272
#pragma clang diagnostic ignored "-Wunreachable-code"
285
273
co_yield 1 ;
286
274
#pragma clang diagnostic pop
287
275
}();
288
276
289
- EXPECT_THROW (static_cast <void >(gen.begin ()), std::runtime_error );
277
+ EXPECT_THROW (static_cast <void >(gen.begin ()), test_error );
290
278
}
291
279
292
280
TEST (GeneratorTest, ExceptionAfterYield)
293
281
{
294
282
auto gen = []() -> generator<int > {
295
283
co_yield 1 ;
296
- throw std::runtime_error (" Goodbye" );
284
+ throw test_error (" Goodbye" );
297
285
}();
298
286
299
287
auto it = gen.begin ();
300
288
EXPECT_EQ (*it, 1 );
301
- EXPECT_THROW (++it, std::runtime_error );
289
+ EXPECT_THROW (++it, test_error );
302
290
EXPECT_EQ (it, gen.end ());
303
291
}
304
292
@@ -309,7 +297,7 @@ TEST(GeneratorTest, IteratorUB)
309
297
// Two begin() calls, therefore, will get the second value of the sequence
310
298
// Because the value is shared among all iterators, *it1 == *it2
311
299
auto it1 = generator.begin ();
312
- auto it2 = generator.cbegin ();
300
+ auto it2 = generator.begin ();
313
301
314
302
EXPECT_EQ (*it1, 2 );
315
303
EXPECT_EQ (*it2, 2 );
@@ -375,7 +363,6 @@ TEST(GeneratorIteratorTest, AccessEndIterator)
375
363
++it;
376
364
377
365
EXPECT_EQ (it, g.end ());
378
- EXPECT_EQ (it, g.cend ());
379
366
380
367
EXPECT_THROW (*it, bad_result_access);
381
368
EXPECT_THROW (*g.end (), bad_result_access);
@@ -483,7 +470,7 @@ TEST(TLGeneratorTest, split)
483
470
auto && gen = split_by_lines_and_whitespace (input);
484
471
485
472
std::size_t cnt = 0 ;
486
- for (auto & & [i, val] : enumerate(gen)) {
473
+ for (const auto & [i, val] : enumerate(gen)) {
487
474
EXPECT_EQ (val, expected.at (i));
488
475
++cnt;
489
476
}
0 commit comments