Summary: Update the internal lambda to mutable to support mutable lambdas as
parameters to Future::ensure()
Reviewed By: @yfeldblum
Differential Revision:
D2286097
template <class F>
Future<T> Future<T>::ensure(F func) {
MoveWrapper<F> funcw(std::move(func));
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));
});
(*funcw)();
return makeFuture(std::move(t));
});
* limitations under the License.
*/
* limitations under the License.
*/
+#include <memory>
+#include <unordered_set>
+
+#include <folly/MoveWrapper.h>
#include <folly/futures/Future.h>
using namespace folly;
TEST(Ensure, basic) {
size_t count = 0;
#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"); })
auto f = makeFuture(42)
.ensure(cob)
.then([](int) { throw std::runtime_error("ensure"); })
EXPECT_THROW(f.get(), std::runtime_error);
EXPECT_EQ(2, count);
}
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);
+}