From 9ca0389d8d29d27aceef3f86e21d75af6737cbd5 Mon Sep 17 00:00:00 2001 From: Jason Rahman Date: Mon, 27 Jul 2015 23:48:48 -0700 Subject: [PATCH] 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 --- folly/futures/Future-inl.h | 2 +- folly/futures/test/EnsureTest.cpp | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) 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); +} -- 2.34.1