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);
+}