Skip to content

Commit f7a0033

Browse files
committed
Added drop/take
1 parent 2573ab8 commit f7a0033

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

inc/manipulators.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff 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

test/src/test_manip.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
}

0 commit comments

Comments
 (0)