29 SharedState<T>::SharedState() :
42 if (_state != FutureState::PromiseNotSatisfied)
46 _value = std::forward<V>(value);
47 _state = FutureState::PromiseAlreadySatisfied;
60 if (_state != FutureState::PromiseNotSatisfied)
64 _value = std::forward<V>(value);
65 _state = FutureState::PromiseAlreadySatisfied;
77 _state = FutureState::FutureAlreadyRetrieved;
78 return std::move(_value);
96 _state = FutureState::FutureAlreadyRetrieved;
97 return std::move(_value);
114 if (_state == FutureState::PromiseNotSatisfied)
116 _state = FutureState::BrokenPromise;
127 _cond.wait(_mutex, [
this]()->
bool 129 return stateHasChanged();
138 _cond.wait(sync, _mutex, [
this]()->
bool 140 return stateHasChanged();
145 template<
class REP,
class PERIOD>
150 _cond.waitFor(_mutex, time, [
this]()->
bool 152 return stateHasChanged();
154 return _state == FutureState::PromiseNotSatisfied ? std::future_status::timeout : std::future_status::ready;
158 template<
class REP,
class PERIOD>
160 const std::chrono::duration<REP, PERIOD> &time)
const 164 _cond.waitFor(sync, _mutex, time, [
this]()->
bool 166 return stateHasChanged();
168 return _state == FutureState::PromiseNotSatisfied ? std::future_status::timeout : std::future_status::ready;
184 std::exception_ptr ex)
197 _cond.
wait(_mutex, [
this]()->
bool 199 return stateHasChanged();
205 void SharedState<T>::conditionWait(ICoroSync::Ptr sync)
const 207 _cond.wait(sync, _mutex, [
this]()->
bool 209 return stateHasChanged();
215 void SharedState<T>::checkPromiseState()
const 219 std::rethrow_exception(_exception);
221 if ((_state == FutureState::BrokenPromise) || (_state == FutureState::FutureAlreadyRetrieved))
228 bool SharedState<T>::stateHasChanged()
const 230 return (_state != FutureState::PromiseNotSatisfied) || (_exception !=
nullptr);
237 SharedState<Buffer<T>>::SharedState() :
259 if (!_reader.empty())
265 _cond.wait(_mutex, [
this]()->
bool 269 return stateHasChanged(status);
276 if (!_reader.empty())
282 _cond.wait(sync, _mutex, [
this]()->
bool 286 return stateHasChanged(status);
291 template<
class REP,
class PERIOD>
294 if (!_reader.empty())
296 return std::future_status::ready;
300 _cond.waitFor(_mutex, time, [
this]()->
bool 304 return stateHasChanged(status);
306 return (_writer.empty() && !_writer.isClosed()) ? std::future_status::timeout : std::future_status::ready;
310 template<
class REP,
class PERIOD>
312 const std::chrono::duration<REP, PERIOD> &time)
const 314 if (!_reader.empty())
316 return std::future_status::ready;
320 _cond.waitFor(sync, _mutex, time, [
this]()->
bool 324 return stateHasChanged(status);
326 return (_writer.empty() && !_writer.isClosed()) ? std::future_status::timeout : std::future_status::ready;
342 std::exception_ptr ex)
362 BufferStatus status = _writer.push(std::forward<V>(value));
382 BufferStatus status = _writer.push(std::forward<V>(value));
396 if (!_reader.empty())
404 _cond.wait(_mutex, [
this]()->
bool 408 bool changed = stateHasChanged(status);
411 _reader = std::move(_writer);
416 isBufferClosed = _reader.empty() && _reader.isClosed();
417 if (isBufferClosed) {
431 if (!_reader.empty())
439 _cond.wait(sync, _mutex, [
this]()->
bool 443 bool changed = stateHasChanged(status);
446 _reader = std::move(_writer);
451 isBufferClosed = _reader.empty() && _reader.isClosed();
452 if (isBufferClosed) {
482 std::rethrow_exception(_exception);
491 bool SharedState<Buffer<T>>::stateHasChanged(
BufferStatus status)
const 495 (_exception !=
nullptr);
Buffer is closed. Push operations are not allowed. Pull operations are allowed until buffer is emtpy.
Definition: quantum_buffer_impl.h:22
Shared state used between a Promise and a Future to exchange values.
Definition: quantum_shared_state.h:38
Data has been successfully read from the buffer.
Data has been successfully written to the buffer.
Promise could not be fulfilled.
std::shared_ptr< ICoroSync > Ptr
Definition: quantum_icoro_sync.h:36
Buffered future is being streamed.
void wait() const
Definition: quantum_shared_state_impl.h:123
Buffer is empty and more data is on the way.
Future value has not yet been set.
Future value has been consumed. In the case of a buffer, no pulling is allowed.
void ThrowFutureException(FutureState state)
Definition: quantum_future_state.h:130
FutureState
Represents the internal state of a future/promise pair. Modeled after std::future_errc.
Definition: quantum_future_state.h:31
Definition: quantum_mutex.h:73
Buffer is closed for pushing data. Data can still be pulled.
BufferStatus
Defines the result of the operation on the buffer object.
Definition: quantum_buffer.h:32