Summary:
It was previously breaking any time a generator included a comma, which
is pretty stupid. Now, it's modelled after `ScopeGuard`, using a little operator
overloading to get rid of the trailing `)` and sidestepping preprocessor issues.
Test Plan: Unit tests
Reviewed By: tudorb@fb.com
FB internal diff:
D646825
return Composed(std::move(left.self()), std::move(right.self()));
}
+template<class Value,
+ class Source,
+ class Yield = detail::Yield<Value, Source>>
+Yield operator+(const detail::GeneratorBuilder<Value>&,
+ Source&& source) {
+ return Yield(std::forward<Source>(source));
+}
+
/**
* GenImpl - Core abstraction of a generator, an object which produces values by
* passing them to a given handler lambda. All generator implementations must
template<class Collection>
class Append;
+template<class Value>
+class GeneratorBuilder {};
+
}
/**
return Yield(std::forward<Source>(source));
}
-#define GENERATOR(type, body) \
- ::folly::gen::generator<type>( \
- [=](const std::function<void(type)>& yield) \
- { body })
+/*
+ * Create inline generator, used like:
+ *
+ * auto gen = GENERATOR(int) { yield(1); yield(2); };
+ */
+#define GENERATOR(TYPE) \
+ ::folly::gen::detail::GeneratorBuilder<TYPE>() + \
+ [=](const std::function<void(TYPE)>& yield)
/*
* Operator Factories
}
TEST(Gen, Yielders) {
- auto gen = GENERATOR(int, {
+ auto gen = GENERATOR(int) {
for (int i = 1; i <= 5; ++i) {
yield(i);
}
for (int i = 3; ; ++i) {
yield(i * i);
}
- });
+ };
vector<int> expected {
1, 2, 3, 4, 5, 7, 9, 16, 25
};
}
TEST(Gen, NestedYield) {
- auto nums = GENERATOR(int, {
+ auto nums = GENERATOR(int) {
for (int i = 1; ; ++i) {
yield(i);
}
- });
- auto gen = GENERATOR(int, {
+ };
+ auto gen = GENERATOR(int) {
nums | take(10) | yield;
seq(1, 5) | [&](int i) {
yield(i);
};
- });
+ };
EXPECT_EQ(70, gen | sum);
}
TEST(Gen, MapYielders) {
auto gen = seq(1, 5)
| map([](int n) {
- return GENERATOR(int, {
+ return GENERATOR(int) {
int i;
for (i = 1; i < n; ++i)
yield(i);
for (; i >= 1; --i)
yield(i);
- });
+ };
})
| concat;
vector<int> expected {