From: Jason Rahman Date: Tue, 28 Jul 2015 06:48:48 +0000 (-0700) Subject: Allow for mutable lambdas with Future::ensure() X-Git-Tag: v0.53.0~51 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=9ca0389d8d29d27aceef3f86e21d75af6737cbd5;p=folly.git Allow for mutable lambdas with Future::ensure() Summary: Update the internal lambda to mutable to support mutable lambdas as parameters to Future::ensure() Reviewed By: @yfeldblum Differential Revision: D2286097 --- diff --git a/folly/futures/Future-inl.h b/folly/futures/Future-inl.h index 0756fd34..d4614fce 100644 --- a/folly/futures/Future-inl.h +++ b/folly/futures/Future-inl.h @@ -301,7 +301,7 @@ template template Future Future::ensure(F func) { MoveWrapper funcw(std::move(func)); - return this->then([funcw](Try&& t) { + return this->then([funcw](Try&& t) mutable { (*funcw)(); return makeFuture(std::move(t)); }); diff --git a/folly/futures/test/EnsureTest.cpp b/folly/futures/test/EnsureTest.cpp index b3fa6b0c..99ed4602 100644 --- a/folly/futures/test/EnsureTest.cpp +++ b/folly/futures/test/EnsureTest.cpp @@ -14,15 +14,19 @@ * limitations under the License. */ +#include +#include + #include +#include #include using namespace folly; TEST(Ensure, basic) { size_t count = 0; - auto cob = [&]{ count++; }; + auto cob = [&] { count++; }; auto f = makeFuture(42) .ensure(cob) .then([](int) { throw std::runtime_error("ensure"); }) @@ -31,3 +35,16 @@ TEST(Ensure, basic) { EXPECT_THROW(f.get(), std::runtime_error); EXPECT_EQ(2, count); } + +TEST(Ensure, mutableLambda) { + auto set = std::make_shared>(); + set->insert(1); + set->insert(2); + + auto f = makeFuture(4) + .ensure([set]() mutable { set->clear(); }) + .then([]() { throw std::runtime_error("ensure"); }); + + EXPECT_EQ(0, set->size()); + EXPECT_THROW(f.get(), std::runtime_error); +}