From 62cbd21f597ed7b54507c802c141f9fcca3ba769 Mon Sep 17 00:00:00 2001 From: Tom Jackson Date: Mon, 3 Dec 2012 17:07:59 -0800 Subject: [PATCH] Simplifying GENERATOR to be like ScopeGuard 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 --- folly/experimental/Gen-inl.h | 8 ++++++++ folly/experimental/Gen.h | 15 +++++++++++---- folly/experimental/test/GenTest.cpp | 16 ++++++++-------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/folly/experimental/Gen-inl.h b/folly/experimental/Gen-inl.h index 414ac66e..2721a639 100644 --- a/folly/experimental/Gen-inl.h +++ b/folly/experimental/Gen-inl.h @@ -135,6 +135,14 @@ Composed operator|(Operator&& left, return Composed(std::move(left.self()), std::move(right.self())); } +template> +Yield operator+(const detail::GeneratorBuilder&, + Source&& source) { + return Yield(std::forward(source)); +} + /** * GenImpl - Core abstraction of a generator, an object which produces values by * passing them to a given handler lambda. All generator implementations must diff --git a/folly/experimental/Gen.h b/folly/experimental/Gen.h index 457c6e5c..c02fee28 100644 --- a/folly/experimental/Gen.h +++ b/folly/experimental/Gen.h @@ -242,6 +242,9 @@ class CollectTemplate; template class Append; +template +class GeneratorBuilder {}; + } /** @@ -310,10 +313,14 @@ Yield generator(Source&& source) { return Yield(std::forward(source)); } -#define GENERATOR(type, body) \ - ::folly::gen::generator( \ - [=](const std::function& yield) \ - { body }) +/* + * Create inline generator, used like: + * + * auto gen = GENERATOR(int) { yield(1); yield(2); }; + */ +#define GENERATOR(TYPE) \ + ::folly::gen::detail::GeneratorBuilder() + \ + [=](const std::function& yield) /* * Operator Factories diff --git a/folly/experimental/test/GenTest.cpp b/folly/experimental/test/GenTest.cpp index 142678fa..284a2c09 100644 --- a/folly/experimental/test/GenTest.cpp +++ b/folly/experimental/test/GenTest.cpp @@ -403,7 +403,7 @@ TEST(Gen, Any) { } TEST(Gen, Yielders) { - auto gen = GENERATOR(int, { + auto gen = GENERATOR(int) { for (int i = 1; i <= 5; ++i) { yield(i); } @@ -411,7 +411,7 @@ TEST(Gen, Yielders) { for (int i = 3; ; ++i) { yield(i * i); } - }); + }; vector expected { 1, 2, 3, 4, 5, 7, 9, 16, 25 }; @@ -419,30 +419,30 @@ TEST(Gen, Yielders) { } 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 expected { -- 2.34.1