Commit 9ca0389d authored by Jason Rahman's avatar Jason Rahman Committed by facebook-github-bot-4

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
parent c23b7977
...@@ -301,7 +301,7 @@ template <class T> ...@@ -301,7 +301,7 @@ template <class T>
template <class F> template <class F>
Future<T> Future<T>::ensure(F func) { Future<T> Future<T>::ensure(F func) {
MoveWrapper<F> funcw(std::move(func)); MoveWrapper<F> funcw(std::move(func));
return this->then([funcw](Try<T>&& t) { return this->then([funcw](Try<T>&& t) mutable {
(*funcw)(); (*funcw)();
return makeFuture(std::move(t)); return makeFuture(std::move(t));
}); });
......
...@@ -14,15 +14,19 @@ ...@@ -14,15 +14,19 @@
* limitations under the License. * limitations under the License.
*/ */
#include <memory>
#include <unordered_set>
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <folly/MoveWrapper.h>
#include <folly/futures/Future.h> #include <folly/futures/Future.h>
using namespace folly; using namespace folly;
TEST(Ensure, basic) { TEST(Ensure, basic) {
size_t count = 0; size_t count = 0;
auto cob = [&]{ count++; }; auto cob = [&] { count++; };
auto f = makeFuture(42) auto f = makeFuture(42)
.ensure(cob) .ensure(cob)
.then([](int) { throw std::runtime_error("ensure"); }) .then([](int) { throw std::runtime_error("ensure"); })
...@@ -31,3 +35,16 @@ TEST(Ensure, basic) { ...@@ -31,3 +35,16 @@ TEST(Ensure, basic) {
EXPECT_THROW(f.get(), std::runtime_error); EXPECT_THROW(f.get(), std::runtime_error);
EXPECT_EQ(2, count); 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);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment