Skip to content

Commit bfb3a0f

Browse files
committed
Added stream-related aggregators
1 parent 56ba652 commit bfb3a0f

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# fpgen
22
*Functional programming in C++ using C++20 coroutines*
3-
![](https://img.shields.io/badge/test_coverage-96.5%25-brightgreen)
3+
![](https://img.shields.io/badge/test_coverage-96.9%25-brightgreen)
44

55

66
## Aim

inc/aggregators.hpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "generator.hpp"
55
#include <forward_list>
6+
#include <ostream>
67
#include <tuple>
78
#include <type_traits>
89

@@ -200,6 +201,44 @@ template <typename T, typename Fun> void foreach (generator<T> gen, Fun func) {
200201
func(gen());
201202
}
202203
}
204+
205+
template <typename T>
206+
std::ostream &to_stream(generator<T> gen, std::ostream &stream) {
207+
while (gen) {
208+
stream << gen();
209+
}
210+
return stream;
211+
}
212+
213+
template <typename T, typename T2>
214+
std::ostream &to_stream(generator<T> gen, std::ostream &stream, T2 separator) {
215+
if (gen) {
216+
stream << gen();
217+
}
218+
while (gen) {
219+
stream << separator << gen();
220+
}
221+
return stream;
222+
}
223+
224+
template <typename T>
225+
std::ostream &to_lines(generator<T> gen, std::ostream &stream) {
226+
while (gen) {
227+
stream << gen() << std::endl;
228+
}
229+
return stream;
230+
}
231+
232+
template <typename T>
233+
std::ostream &to_lines_no_trail(generator<T> gen, std::ostream &stream) {
234+
if (gen) {
235+
stream << gen();
236+
}
237+
while (gen) {
238+
stream << std::endl << gen();
239+
}
240+
return stream;
241+
}
203242
} // namespace fpgen
204243

205244
#endif

test/src/test_aggreg.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "gtest/gtest.h"
77

88
#include <map>
9+
#include <sstream>
910
#include <vector>
1011

1112
fpgen::generator<size_t> a_empty() { co_return; }
@@ -170,3 +171,40 @@ TEST(foreach, normal) {
170171
fpgen::foreach (gen, [&res](size_t val) { res += val; });
171172
EXPECT_EQ(res, fpgen::sum(gen2));
172173
}
174+
175+
TEST(stream, nosep) {
176+
std::vector<int> vals = {1, 2, 3, 4, 5, 6};
177+
auto gen = fpgen::from(vals);
178+
std::stringstream strm;
179+
fpgen::to_stream(gen, strm);
180+
EXPECT_EQ(strm.str(), "123456");
181+
}
182+
183+
TEST(stream, sep) {
184+
std::vector<int> vals = {1, 2, 3, 4, 5, 6, 7};
185+
auto gen = fpgen::from(vals);
186+
std::stringstream strm;
187+
fpgen::to_stream(gen, strm, " ");
188+
EXPECT_EQ(strm.str(), "1 2 3 4 5 6 7");
189+
}
190+
191+
TEST(stream, lines_trail) {
192+
std::vector<int> vals = {1, 2, 3, 4};
193+
auto gen = fpgen::from(vals);
194+
std::stringstream strm;
195+
std::stringstream expect;
196+
for (auto v : vals)
197+
expect << v << std::endl;
198+
fpgen::to_lines(gen, strm);
199+
EXPECT_EQ(strm.str(), expect.str());
200+
}
201+
202+
TEST(stream, lines_no_trail) {
203+
std::vector<int> vals = {1, 2, 3, 4};
204+
auto gen = fpgen::from(vals);
205+
std::stringstream strm;
206+
std::stringstream expect;
207+
expect << 1 << std::endl << 2 << std::endl << 3 << std::endl << 4;
208+
fpgen::to_lines_no_trail(gen, strm);
209+
EXPECT_EQ(strm.str(), expect.str());
210+
}

0 commit comments

Comments
 (0)