2 * Copyright 2016 Facebook, Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <folly/fibers/traits.h>
19 #include <folly/Try.h>
26 template <typename T, typename BatonT = Baton>
30 typedef BatonT baton_type;
35 Promise(const Promise&) = delete;
36 Promise& operator=(const Promise&) = delete;
39 Promise(Promise&&) noexcept;
40 Promise& operator=(Promise&&);
42 /** Fulfill this promise (only for Promise<void>) */
45 /** Set the value (use perfect forwarding for both move and copy) */
47 void setValue(M&& value);
50 * Fulfill the promise with a given try
54 void setTry(folly::Try<T>&& t);
56 /** Fulfill this promise with the result of a function that takes no
57 arguments and returns something implicitly convertible to T.
58 Captures exceptions. e.g.
60 p.setWith([] { do something that may throw; return a T; });
63 void setWith(F&& func);
65 /** Fulfill the Promise with an exception_wrapper, e.g.
66 auto ew = folly::try_and_catch<std::exception>([]{ ... });
68 p.setException(std::move(ew));
71 void setException(folly::exception_wrapper);
74 * Blocks task execution until given promise is fulfilled.
76 * Calls function passing in a Promise<T>, which has to be fulfilled.
78 * @return data which was used to fulfill the promise.
81 static value_type await(F&& func);
84 Promise(folly::Try<T>& value, BatonT& baton);
85 folly::Try<T>* value_;
88 void throwIfFulfilled() const;
91 typename std::enable_if<
92 std::is_convertible<typename std::result_of<F()>::type, T>::value &&
93 !std::is_same<T, void>::value>::type
94 fulfilHelper(F&& func);
97 typename std::enable_if<
98 std::is_same<typename std::result_of<F()>::type, void>::value &&
99 std::is_same<T, void>::value>::type
100 fulfilHelper(F&& func);
105 #include <folly/fibers/Promise-inl.h>