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>
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));
});
......
......@@ -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);
}
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