template <class T>
void Promise<T>::throwIfFulfilled() {
- if (!core_)
+ if (UNLIKELY(!core_)) {
throw NoState();
- if (core_->ready())
+ }
+ if (UNLIKELY(core_->ready())) {
throw PromiseAlreadySatisfied();
+ }
}
template <class T>
void Promise<T>::throwIfRetrieved() {
- if (retrieved_)
+ if (UNLIKELY(retrieved_)) {
throw FutureAlreadyRetrieved();
+ }
}
template <class T>
}
template <class T>
-void Promise<T>::fulfilTry(Try<T> t) {
+void Promise<T>::setTry(Try<T>&& t) {
throwIfFulfilled();
core_->setResult(std::move(t));
}
static_assert(!std::is_same<T, void>::value,
"Use setValue() instead");
- fulfilTry(Try<T>(std::forward<M>(v)));
+ setTry(Try<T>(std::forward<M>(v)));
}
template <class T>
-void Promise<T>::setValue() {
- static_assert(std::is_same<T, void>::value,
- "Use setValue(value) instead");
-
- fulfilTry(Try<void>());
+template <class F>
+void Promise<T>::setWith(F&& func) {
+ throwIfFulfilled();
+ setTry(makeTryWith(std::forward<F>(func)));
}
template <class T>
-template <class F>
-void Promise<T>::fulfil(F&& func) {
- throwIfFulfilled();
- fulfilTry(makeTryFunction(std::forward<F>(func)));
+bool Promise<T>::isFulfilled() {
+ if (core_) {
+ return core_->hasResult();
+ }
+ return true;
}
}