New Pipes + a Video Tutorial to Make More Pipes
The pipes library got 4 more pipes: take
, take_while
, drop
and drop_while
. We’re going to see what those new pipes do, and then a video of how I implemented them that can serve as a guide to implement more.
take
and take_while
The take
and take_while
pipes are equivalent to their range adaptor counterparts: they let through the first values they receive pass, and ignore the values after a certain point.
take
and take_while
have different ways of determining that point. take
lets through a fixed number of values:
auto const input = std::vector<int>{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; auto result = std::vector<int>{}; input >>= pipes::take(6) >>= pipes::push_back(result); // result contains {1, 2, 3, 4, 5, 6}
And take_while
lets values through until one doesn’t satisfy a predicate:
auto const input = std::vector<int>{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; auto result = std::vector<int>{}; input >>= pipes::take_while([](int i){ return i != 7; }) >>= pipes::push_back(result); // result contains {1, 2, 3, 4, 5, 6}
drop
and drop_while
drop
is the complementary operation of take
: it starts letting values through after a certain point. drop
determines that point as a number of incoming values:
auto const input = std::vector<int>{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; auto result = std::vector<int>{}; input >>= pipes::drop(6) >>= pipes::push_back(result); // result contains { 7, 8, 9, 10 }
And drop_while
starts letting values through when one of them satisfies a predicate:
auto const input = std::vector<int>{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; auto result = std::vector<int>{}; input >>= pipes::drop_while([](int i){ return i != 7; }) >>= pipes::push_back(result); // result contains { 7, 8, 9, 10 }
A video tutorial
Implementing those pipes is pretty straightforward, and you can see how to do it in this video:
This video shows how to implement drop
and drop_while
, which are good examples of how to implement a pipe. In the video, we write the unit tests and then the code for the two pipes, while commenting on the library’s design.
If you’d like to submit a new pipe to the pipes library, this video can help guide you in its implementation.
You will also like
- Composite Pipes, part 1: Decoupling Operators From Classes
- Composite Pipes, part 2: Implementing Composite Pipes
- Introduction to the C++ Ranges Library
Share this post!