11#ifndef SYMBIAN_CONCURRENCY_FUTURE_H_
12#define SYMBIAN_CONCURRENCY_FUTURE_H_
22#include "absl/status/status.h"
23#include "absl/status/statusor.h"
24#include "absl/time/time.h"
25#include "thread/boost_primitives.h"
29#if defined(__SYMBIAN32__)
45 std::optional<absl::StatusOr<T>> result;
46 std::function<
void()> cancel;
47 std::vector<std::function<
void(
const absl::StatusOr<T>&)>> callbacks;
63 state_ = std::move(
other.state_);
80 state_->cancel = std::move(cancel);
92 return SetResult(absl::StatusOr<T>(std::move(error)));
100 std::vector<std::function<
void(
const absl::StatusOr<T>&)>> callbacks;
106 state->result.emplace(std::move(result));
108 callbacks.swap(state->callbacks);
110 state->ready.SignalAll();
112 for (
auto& callback : callbacks) {
113 callback(*state->result);
121 SetError(absl::CancelledError(
"Promise was abandoned"));
126 std::shared_ptr<internal::FutureState<T>> state_;
134 bool valid()
const {
return state_ !=
nullptr; }
141 return state_->result.has_value();
150 std::function<
void()> cancel;
153 if (state_->result) {
156 cancel = state_->cancel;
171 return state_->result;
177 absl::StatusOr<T>
Await(absl::Time deadline = absl::InfiniteFuture())
const {
179 return absl::FailedPreconditionError(
"Future is invalid");
185 return absl::FailedPreconditionError(
186 "Await requires a supported fiber context");
188 const bool infinite = deadline == absl::InfiniteFuture();
189 absl::Duration remaining =
190 infinite ? absl::InfiniteDuration() : deadline - absl::Now();
192 while (!state_->result) {
193 if (!
infinite && remaining <= absl::ZeroDuration()) {
194 return absl::DeadlineExceededError(
"Future deadline expired");
197 state_->ready.Wait(&state_->mu);
200 const auto start = std::chrono::steady_clock::now();
201 const bool timed_out =
202 state_->ready.WaitWithTimeout(&state_->mu, remaining);
204 std::chrono::duration_cast<std::chrono::nanoseconds>(
205 std::chrono::steady_clock::now() -
start);
206 remaining -= absl::Nanoseconds(
elapsed.count());
207 if (timed_out && !state_->result) {
208 return absl::DeadlineExceededError(
"Future deadline expired");
211 return *state_->result;
215 void OnReady(std::function<
void(
const absl::StatusOr<T>&)> callback)
const {
221 const absl::StatusOr<T>
invalid =
222 absl::FailedPreconditionError(
"Future is not valid");
226 const absl::StatusOr<T>* ready =
nullptr;
229 if (!state->result) {
230 state->callbacks.push_back(std::move(callback));
233 ready = &*state->result;
240#if defined(__SYMBIAN32__)
241 template <
typename Fn>
243 typename std::invoke_result_t<Fn, const absl::StatusOr<T>&>::value_type>;
247 explicit Future(std::shared_ptr<internal::FutureState<T>> state)
250 std::shared_ptr<internal::FutureState<T>> state_;
258 promise.SetValue(std::move(
value));
266 promise.SetError(error);
280template <
typename T,
typename Fn>
282 typename std::invoke_result_t<Fn, const absl::StatusOr<T>&>::value_type> {
284 typename std::invoke_result_t<Fn, const absl::StatusOr<T>&>::value_type;
285 if (
auto ready = future.ResultIfReady()) {
291 auto promise = std::make_shared<Promise<U>>();
293 promise->SetCancellationCallback([future] { future.Cancel(); });
296 const absl::StatusOr<T>& result)
mutable {
const std::function< absl::Status()> & start
Definition active_service.cc:12
Definition bounded_channel.h:38
Definition event_executor.h:27
bool IsReady() const
Definition future.h:136
bool Cancel() const
Definition future.h:146
std::optional< absl::StatusOr< T > > ResultIfReady() const
Definition future.h:166
absl::StatusOr< T > Await(absl::Time deadline=absl::InfiniteFuture()) const
Definition future.h:177
bool valid() const
Definition future.h:134
void OnReady(std::function< void(const absl::StatusOr< T > &)> callback) const
Definition future.h:215
Future< T > future() const
Definition future.h:70
Promise()
Definition future.h:54
bool SetError(absl::Status error)
Definition future.h:88
Promise(const Promise &)=delete
bool SetCancellationCallback(std::function< void()> cancel)
Definition future.h:72
Promise & operator=(const Promise &)=delete
Promise(Promise &&) noexcept=default
bool SetValue(T value)
Definition future.h:84
~Promise()
Definition future.h:68
bool SetResult(absl::StatusOr< T > result)
Definition future.h:95
Definition boost_primitives.h:110
Definition boost_primitives.h:95
Definition boost_primitives.h:34
Definition exception_count.cc:8
Definition bounded_channel.h:32
Task FailedTask(absl::Status error)
Definition future.h:276
Future< T > ReadyFuture(T value)
Definition future.h:255
Future< T > FailedFuture(absl::Status error)
Definition future.h:263
Task ReadyTask()
Definition future.h:272
auto Then(const Future< T > &future, Fn transform) -> Future< typename std::invoke_result_t< Fn, const absl::StatusOr< T > & >::value_type >
Definition future.h:281
bool CanParkAwait() noexcept
Definition boost_primitives.h:30
friend bool operator==(Unit, Unit)=default
libusb_context * value
Definition usb.cc:35