/*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2014-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#pragma once
-#include <folly/futures/Deprecated.h>
-#include <folly/futures/Try.h>
+#include <folly/Portability.h>
+#include <folly/Try.h>
#include <functional>
namespace folly {
// forward declaration
+template <class T>
+class SemiFuture;
template <class T> class Future;
+namespace futures {
+namespace detail {
+template <class T>
+class FutureBase;
+struct EmptyConstruct {};
+template <typename T, typename F>
+class CoreCallbackState;
+} // namespace detail
+} // namespace futures
+
template <class T>
class Promise {
-public:
+ public:
+ static Promise<T> makeEmpty() noexcept; // equivalent to moved-from
+
Promise();
~Promise();
Promise(Promise<T>&&) noexcept;
Promise& operator=(Promise<T>&&) noexcept;
+ /** Return a SemiFuture tied to the shared core state. This can be called only
+ once, thereafter FutureAlreadyRetrieved exception will be raised. */
+ SemiFuture<T> getSemiFuture();
+
/** Return a Future tied to the shared core state. This can be called only
- once, thereafter Future already retrieved exception will be raised. */
+ once, thereafter FutureAlreadyRetrieved exception will be raised.
+ NOTE: This function is deprecated. Please use getSemiFuture and pass the
+ appropriate executor to .via on the returned SemiFuture to get a
+ valid Future where necessary. */
Future<T> getFuture();
/** Fulfill the Promise with an exception_wrapper */
p.setException(std::current_exception());
}
*/
- void setException(std::exception_ptr const&) DEPRECATED;
+ FOLLY_DEPRECATED("use setException(exception_wrapper)")
+ void setException(std::exception_ptr const&);
/** Fulfill the Promise with an exception type E, which can be passed to
std::make_exception_ptr(). Useful for originating exceptions. If you
/// handled.
void setInterruptHandler(std::function<void(exception_wrapper const&)>);
- /// Fulfill this Promise<void>
- template <class B = T>
- typename std::enable_if<std::is_void<B>::value, void>::type
- setValue() {
- setTry(Try<T>());
- }
-
/// Sugar to fulfill this Promise<Unit>
template <class B = T>
typename std::enable_if<std::is_same<Unit, B>::value, void>::type
template <class F>
void setWith(F&& func);
- bool isFulfilled();
+ bool isFulfilled() const noexcept;
-private:
+ private:
typedef typename Future<T>::corePtr corePtr;
+ template <class>
+ friend class futures::detail::FutureBase;
+ template <class>
+ friend class SemiFuture;
+ template <class>
+ friend class Future;
+ template <class, class>
+ friend class futures::detail::CoreCallbackState;
// Whether the Future has been retrieved (a one-time operation).
bool retrieved_;
// shared core state object
corePtr core_;
+ explicit Promise(futures::detail::EmptyConstruct) noexcept;
+
void throwIfFulfilled();
void throwIfRetrieved();
void detach();
};
-}
+} // namespace folly
#include <folly/futures/Future.h>
#include <folly/futures/Promise-inl.h>