Skip to content

Commit 525d817

Browse files
committed
Aggregate to containers, including tests
1 parent e00e1e1 commit 525d817

File tree

3 files changed

+103
-1
lines changed

3 files changed

+103
-1
lines changed

inc/aggregators.hpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#ifndef _FPGEN_AGGREGATORS
2+
#define _FPGEN_AGGREGATORS
3+
4+
#include "generator.hpp"
5+
#include <forward_list>
6+
#include <tuple>
7+
#include <type_traits>
8+
9+
namespace fpgen {
10+
template <typename T, typename... Args,
11+
template <typename...> typename Container>
12+
Container<T, Args...> &aggregate_to(generator<T> &gen,
13+
Container<T, Args...> &out) {
14+
while (gen) {
15+
out.push_back(gen());
16+
}
17+
return out;
18+
}
19+
20+
template <typename TKey, typename TVal, typename... Args,
21+
template <typename...> typename Container>
22+
Container<TKey, TVal, Args...> &
23+
tup_aggregate_to(generator<std::tuple<TKey, TVal>> &gen,
24+
Container<TKey, TVal, Args...> &out) {
25+
while (gen) {
26+
std::tuple<TKey, TVal> tup = gen();
27+
out[std::get<0>(tup)] = std::get<1>(tup);
28+
}
29+
return out;
30+
}
31+
} // namespace fpgen
32+
33+
#endif

test/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
SOURCES=$(shell find $(SRCD) -name '*.cpp')
22
DEPS=$(SOURCES:$(SRCD)/%.cpp=$(OBJD)/%.d)
3-
TESTS=generator sources manip
3+
TESTS=generator sources manip aggreg
44
TESTOBJ=$(TESTS:%=$(OBJD)/test_%.o)
55

66
CONAN_PKG_OVERRIDE=gtest

test/src/test_aggreg.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include "aggregators.hpp"
2+
#include "generator.hpp"
3+
#include "manipulators.hpp"
4+
#include "gmock/gmock.h"
5+
#include "gtest/gtest.h"
6+
7+
#include <map>
8+
#include <vector>
9+
10+
fpgen::generator<size_t> a_empty() { co_return 0; }
11+
12+
fpgen::generator<size_t> values() {
13+
size_t i = 0;
14+
size_t j = 1;
15+
co_yield 0;
16+
co_yield 1;
17+
18+
while (j < 21) {
19+
size_t tmp = i + j;
20+
co_yield tmp;
21+
i = j;
22+
j = tmp;
23+
}
24+
25+
co_return i + j;
26+
}
27+
28+
TEST(aggregate, empty) {
29+
auto gen = a_empty();
30+
gen();
31+
std::vector<size_t> res;
32+
EXPECT_EQ(0, fpgen::aggregate_to(gen, res).size());
33+
}
34+
35+
TEST(aggregate, vector) {
36+
auto gen = values();
37+
std::vector<size_t> res;
38+
fpgen::aggregate_to(gen, res);
39+
40+
EXPECT_EQ(0, res[0]);
41+
EXPECT_EQ(1, res[1]);
42+
EXPECT_EQ(1, res[2]);
43+
EXPECT_EQ(2, res[3]);
44+
EXPECT_EQ(3, res[4]);
45+
EXPECT_EQ(5, res[5]);
46+
EXPECT_EQ(8, res[6]);
47+
EXPECT_EQ(13, res[7]);
48+
EXPECT_EQ(21, res[8]);
49+
EXPECT_EQ(34, res[9]);
50+
EXPECT_EQ(res.size(), 10);
51+
}
52+
53+
TEST(aggregate, map) {
54+
fpgen::generator<size_t> sources[2] = {values(), values()};
55+
auto gen = fpgen::zip(sources[0], sources[1]);
56+
std::map<size_t, size_t> res;
57+
fpgen::tup_aggregate_to(gen, res);
58+
59+
EXPECT_EQ(0, res[0]);
60+
EXPECT_EQ(1, res[1]);
61+
EXPECT_EQ(2, res[2]);
62+
EXPECT_EQ(3, res[3]);
63+
EXPECT_EQ(5, res[5]);
64+
EXPECT_EQ(8, res[8]);
65+
EXPECT_EQ(13, res[13]);
66+
EXPECT_EQ(21, res[21]);
67+
EXPECT_EQ(34, res[34]);
68+
EXPECT_EQ(res.size(), 9);
69+
}

0 commit comments

Comments
 (0)