From: Jason Rahman <jprahman@fb.com> 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 <class T> template <class F> Future<T> Future<T>::ensure(F func) { MoveWrapper<F> funcw(std::move(func)); - return this->then([funcw](Try<T>&& t) { + return this->then([funcw](Try<T>&& 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 <memory> +#include <unordered_set> + #include <gtest/gtest.h> +#include <folly/MoveWrapper.h> #include <folly/futures/Future.h> 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<std::unordered_set<int>>(); + 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); +}