X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3388e09cbb920fc3b904327f3b254f794e231ed1..3d35f119d529a283de2a39bca8d8034e6086aefc:/include/simgrid/kernel/future.hpp diff --git a/include/simgrid/kernel/future.hpp b/include/simgrid/kernel/future.hpp index 6adfe664dd..374d0ee650 100644 --- a/include/simgrid/kernel/future.hpp +++ b/include/simgrid/kernel/future.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2016-2018. The SimGrid Team. +/* Copyright (c) 2016-2019. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -157,7 +157,7 @@ public: xbt_assert(this->value_); auto result = std::move(this->value_.get()); this->value_ = boost::optional(); - return std::move(result); + return result; } private: @@ -204,23 +204,31 @@ public: } }; -template -void bindPromise(Promise promise, Future future) +template void bind_promise(Promise&& promise, Future future) { class PromiseBinder { public: - explicit PromiseBinder(Promise promise) : promise_(std::move(promise)) {} - void operator()(Future future) - { - simgrid::xbt::setPromise(promise_, future); - } + explicit PromiseBinder(Promise&& promise) : promise_(std::move(promise)) {} + void operator()(Future future) { simgrid::xbt::set_promise(promise_, future); } + private: Promise promise_; }; future.then_(PromiseBinder(std::move(promise))); } -template Future unwrapFuture(Future> future); +template Future unwrap_future(Future> future); + +template +XBT_ATTRIB_DEPRECATED_v323("Please use bind_promise") void bindPromise(Promise promise, Future future) +{ + bind_promise(promise, future); +} +template +XBT_ATTRIB_DEPRECATED_v323("Please use unwrap_future") Future unwrapFuture(Future> future) +{ + unwrap_future(future); +} /** Result of some (probably) asynchronous operation in the SimGrid kernel * @@ -283,6 +291,7 @@ class Future { public: Future() = default; explicit Future(std::shared_ptr> state) : state_(std::move(state)) {} + ~Future() = default; // Move type: Future(Future&) = delete; @@ -334,9 +343,7 @@ public: * * This version never does future unwrapping. */ - template - auto thenNoUnwrap(F continuation) - -> Future + template auto then_no_unwrap(F continuation) -> Future { typedef decltype(continuation(std::move(*this))) R; if (state_ == nullptr) @@ -350,10 +357,17 @@ public: [](Promise promise, std::shared_ptr> state, F continuation) { // ...set the new future value by running the continuation. Future future(std::move(state)); - simgrid::xbt::fulfillPromise(promise, [&] { return continuation(std::move(future)); }); + simgrid::xbt::fulfill_promise(promise, [&continuation, &future] { return continuation(std::move(future)); }); }, std::move(promise), state, std::move(continuation))); - return std::move(future); + return future; + } + + template + XBT_ATTRIB_DEPRECATED_v323("Please use then_no_unwrap") auto thenNoUnwrap(F continuation) + -> Future + { + then_no_unwrap(continuation); } /** Attach a continuation to this future @@ -370,7 +384,7 @@ public: auto then(F continuation) -> typename std::enable_if::value, Future>::type { - return this->thenNoUnwrap(std::move(continuation)); + return this->then_no_unwrap(std::move(continuation)); } /** Attach a continuation to this future (future chaining) */ @@ -381,7 +395,7 @@ public: decltype(continuation(std::move(*this))) >::type { - return unwrapFuture(this->thenNoUnwap(std::move(continuation))); + return unwrap_future(this->then_no_unwrap(std::move(continuation))); } /** Get the value from the future @@ -407,13 +421,12 @@ private: std::shared_ptr> state_; }; -template -Future unwrapFuture(Future> future) +template Future unwrap_future(Future> future) { Promise promise; Future result = promise.get_future(); - bindPromise(std::move(promise), std::move(future)); - return std::move(result); + bind_promise(std::move(promise), std::move(future)); + return result; } /** Producer side of a @ref simgrid::kernel::Future @@ -428,7 +441,7 @@ Future unwrapFuture(Future> future) * auto promise = std::make_shared>(); * auto future = promise->get_future(); * - * SIMIX_timer_set(date, [promise] { + * simgrid::simix::Timer::set(date, [promise] { * try { * int value = compute_the_value(); * if (value < 0)