1#ifndef LIBOSMSCOUT_CANCELABLEFUTURE_H
2#define LIBOSMSCOUT_CANCELABLEFUTURE_H
40 class CancelableFuture
56 std::unique_lock lock(
mutex);
72 std::shared_ptr<State> state=std::make_shared<State>();
77 FutureBreaker(
const std::shared_ptr<State> &state): state(state)
88 FutureBreaker&
operator=(
const FutureBreaker&) =
default;
89 FutureBreaker&
operator=(FutureBreaker&&) =
default;
98 std::unique_lock lock(state->mutex);
99 return state->canceled;
104 log.Warn() <<
"Future breaker doesn't support reset.";
111 std::shared_ptr<State> state=std::make_shared<State>();
124 return CancelableFuture<T>(state);
134 std::unique_lock lock(state->mutex);
135 return state->canceled;
140 std::unique_lock lock(state->mutex);
141 if (state->canceled || state->value) {
145 for (
const auto &callback: state->callbacks) {
157 std::shared_ptr<State> state;
170 CancelableFuture&
operator=(
const CancelableFuture &) =
default;
171 CancelableFuture&
operator=(CancelableFuture &&) =
default;
191 std::unique_lock lock(state->mutex);
193 callback(state->value.value());
194 }
else if (!state->canceled) {
195 state->callbacks.push_back(std::move(callback));
208 std::unique_lock lock(state->mutex);
209 if (state->canceled) {
211 }
else if (!state->value) {
212 state->cancelCallbacks.push_back(std::move(callback));
218 std::unique_lock lock(state->mutex);
224 std::unique_lock lock(state->mutex);
225 return state->canceled;
230 auto promisePtr=std::make_shared<std::promise<T>>();
233 promisePtr->set_value(value);
237 promisePtr->set_exception(std::make_exception_ptr(std::runtime_error(
"Canceled")));
240 return promisePtr->get_future();
Definition CancelableFuture.h:70
FutureBreaker(FutureBreaker &&)=default
FutureBreaker & operator=(FutureBreaker &&)=default
bool IsAborted() const override
Definition CancelableFuture.h:96
FutureBreaker & operator=(const FutureBreaker &)=default
virtual ~FutureBreaker()=default
void Break() override
Definition CancelableFuture.h:91
void Reset() override
Definition CancelableFuture.h:102
friend class Promise
Definition CancelableFuture.h:75
FutureBreaker(const FutureBreaker &)=default
void SetValue(const T &value)
Definition CancelableFuture.h:138
bool IsCanceled() const
Definition CancelableFuture.h:132
Promise & operator=(Promise &&)=default
virtual ~Promise()=default
Promise(Promise &&)=default
Promise(const Promise &)=default
FutureBreaker Breaker() const
Definition CancelableFuture.h:150
Promise & operator=(const Promise &)=default
void Cancel()
Definition CancelableFuture.h:127
CancelableFuture< T > Future() const
Definition CancelableFuture.h:123
Definition CancelableFuture.h:41
void OnCancel(const CancelCallback &callback)
Definition CancelableFuture.h:206
std::function< void(T const &)> DoneCallback
Definition CancelableFuture.h:43
bool IsCanceled()
Definition CancelableFuture.h:222
virtual ~CancelableFuture()=default
std::future< T > StdFuture()
Definition CancelableFuture.h:228
std::optional< T > Value()
Definition CancelableFuture.h:216
CancelableFuture & operator=(const CancelableFuture &)=default
CancelableFuture & operator=(CancelableFuture &&)=default
std::function< void()> CancelCallback
Definition CancelableFuture.h:44
void OnComplete(const DoneCallback &callback)
Definition CancelableFuture.h:189
CancelableFuture(const CancelableFuture &)=default
void Cancel()
Definition CancelableFuture.h:176
CancelableFuture(CancelableFuture &&)=default
OSMSCOUT_API Log log
Definition LoggerImpl.h:95
Definition CancelableFuture.h:47
bool canceled
Definition CancelableFuture.h:50
std::vector< DoneCallback > callbacks
Definition CancelableFuture.h:51
std::mutex mutex
Definition CancelableFuture.h:48
std::optional< T > value
Definition CancelableFuture.h:49
void Cancel()
Definition CancelableFuture.h:54
std::vector< CancelCallback > cancelCallbacks
Definition CancelableFuture.h:52