Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Try to ensure test reproducibility.
[simgrid.git] / include / simgrid / kernel / future.hpp
index 7662939..71e87ab 100644 (file)
@@ -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
@@ -74,7 +74,7 @@ public:
       schedule(std::move(continuation));
       break;
     case FutureStatus::not_ready:
-      // The future is not ready so we mast keep the continuation for
+      // The future is not ready so we must keep the continuation for
       // executing it later:
       continuation_ = std::move(continuation);
       break;
@@ -157,7 +157,7 @@ public:
     xbt_assert(this->value_);
     auto result = std::move(this->value_.get());
     this->value_ = boost::optional<T>();
-    return std::move(result);
+    return result;
   }
 
 private:
@@ -204,11 +204,11 @@ public:
   }
 };
 
-template <class T> void bind_promise(Promise<T> promise, Future<T> future)
+template <class T> void bind_promise(Promise<T>&& promise, Future<T> future)
 {
   class PromiseBinder {
   public:
-    explicit PromiseBinder(Promise<T> promise) : promise_(std::move(promise)) {}
+    explicit PromiseBinder(Promise<T>&& promise) : promise_(std::move(promise)) {}
     void operator()(Future<T> future) { simgrid::xbt::set_promise(promise_, future); }
 
   private:
@@ -219,17 +219,6 @@ template <class T> void bind_promise(Promise<T> promise, Future<T> future)
 
 template <class T> Future<T> unwrap_future(Future<Future<T>> future);
 
-template <class T>
-XBT_ATTRIB_DEPRECATED_v323("Please use bind_promise") void bindPromise(Promise<T> promise, Future<T> future)
-{
-  bind_promise(promise, future);
-}
-template <class T>
-XBT_ATTRIB_DEPRECATED_v323("Please use unwrap_future") Future<T> unwrapFuture(Future<Future<T>> future)
-{
-  unwrap_future(future);
-}
-
 /** Result of some (probably) asynchronous operation in the SimGrid kernel
  *
  * @ref simgrid::simix::Future and @ref simgrid::simix::Future provide an
@@ -258,7 +247,7 @@ XBT_ATTRIB_DEPRECATED_v323("Please use unwrap_future") Future<T> unwrapFuture(Fu
  *    // available:
  *    try {
  *      // Try to get value, this might throw an exception if the operation
- *      // failed (such as an exception throwed by the worker process):
+ *      // failed (such as an exception thrown by the worker process):
  *      std::string value = result.get();
  *      XBT_INFO("Value: %s", value.c_str());
  *    }
@@ -291,6 +280,7 @@ class Future {
 public:
   Future() = default;
   explicit Future(std::shared_ptr<FutureState<T>> state) : state_(std::move(state)) {}
+  ~Future() = default;
 
   // Move type:
   Future(Future&) = delete;
@@ -356,17 +346,10 @@ public:
         [](Promise<R> promise, std::shared_ptr<FutureState<T>> state, F continuation) {
           // ...set the new future value by running the continuation.
           Future<T> future(std::move(state));
-          simgrid::xbt::fulfill_promise(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);
-  }
-
-  template <class F>
-  XBT_ATTRIB_DEPRECATED_v323("Please use then_no_unwrap") auto thenNoUnwrap(F continuation)
-      -> Future<decltype(continuation(std::move(*this)))>
-  {
-    then_no_unwrap(continuation);
+    return future;
   }
 
   /** Attach a continuation to this future
@@ -425,7 +408,7 @@ template <class T> Future<T> unwrap_future(Future<Future<T>> future)
   Promise<T> promise;
   Future<T> result = promise.get_future();
   bind_promise(std::move(promise), std::move(future));
-  return std::move(result);
+  return result;
 }
 
 /** Producer side of a @ref simgrid::kernel::Future
@@ -440,7 +423,7 @@ template <class T> Future<T> unwrap_future(Future<Future<T>> future)
  *  auto promise = std::make_shared<simgrid::kernel::Promise<T>>();
  *  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)
@@ -451,7 +434,7 @@ template <class T> Future<T> unwrap_future(Future<Future<T>> future)
  *    }
  *    catch (...) {
  *      // If an error occured, we can set an exception which
- *      // will be throwed buy future.get():
+ *      // will be thrown by future.get():
  *      promise.set_exception(std::current_exception());
  *    }
  *  });