File tree Expand file tree Collapse file tree 2 files changed +69
-0
lines changed Expand file tree Collapse file tree 2 files changed +69
-0
lines changed Original file line number Diff line number Diff line change @@ -78,6 +78,24 @@ generator<T> filter(generator<T> gen, Pred p) {
7878 }
7979 co_return ;
8080}
81+
82+ template <typename T> generator<T> drop (generator<T> gen, size_t count) {
83+ for (size_t i = 0 ; i < count && gen; i++) {
84+ gen ();
85+ }
86+
87+ while (gen) {
88+ co_yield gen ();
89+ }
90+ co_return ;
91+ }
92+
93+ template <typename T> generator<T> take (generator<T> gen, size_t count) {
94+ for (size_t i = 0 ; i < count && gen; i++) {
95+ co_yield gen ();
96+ }
97+ co_return ;
98+ }
8199} // namespace fpgen
82100
83101#endif
Original file line number Diff line number Diff line change @@ -133,3 +133,54 @@ TEST(manipulators, filter_normal) {
133133 i += 2 ;
134134 }
135135}
136+
137+ TEST (manipulators, drop_empty) {
138+ auto gen = drop (manip_empty (), 5 );
139+ for (auto v : gen) {
140+ FAIL () << " should not return a value" ;
141+ }
142+ SUCCEED ();
143+ }
144+
145+ TEST (manipulators, drop_normal) {
146+ auto gen = drop (until12 (), 5 );
147+ size_t exp = 5 ;
148+ for (auto v : gen) {
149+ EXPECT_EQ (v, exp);
150+ EXPECT_TRUE (exp <= 12 );
151+ exp++;
152+ }
153+ EXPECT_EQ (exp, 13 );
154+ }
155+
156+ TEST (manipulators, take_empty) {
157+ auto gen = take (manip_empty (), 4 );
158+ for (auto v : gen) {
159+ FAIL () << " should not return a value" ;
160+ }
161+ SUCCEED ();
162+ }
163+
164+ TEST (manipulators, take_normal) {
165+ auto gen = take (fpgen::inc ((size_t )0 ), 8 );
166+ size_t exp = 0 ;
167+ for (auto v : gen) {
168+ EXPECT_EQ (v, exp);
169+ EXPECT_TRUE (exp <= 8 );
170+ exp++;
171+ }
172+ EXPECT_EQ (exp, 8 );
173+ }
174+
175+ TEST (manipulators, drop_take) {
176+ auto gen = take (drop (fpgen::inc ((size_t )0 ), 4 ), 9 );
177+ for (size_t exp = 4 ; exp < 13 ; exp++) {
178+ EXPECT_TRUE (static_cast <bool >(gen));
179+ EXPECT_EQ (exp, gen ());
180+ }
181+
182+ for (auto v : gen) {
183+ FAIL () << " should not return a value" ;
184+ }
185+ SUCCEED ();
186+ }
You can’t perform that action at this time.
0 commit comments