11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
18PROMEKI_NAMESPACE_BEGIN
32 explicit PromiseError(Error e) : error(e) {}
64template <
typename T>
class Future {
70 Future(std::future<T> &&f) : _future(std::move(f)) {}
75 Future(
const Future &) =
delete;
76 Future &operator=(
const Future &) =
delete;
79 Future(Future &&other) =
default;
82 Future &operator=(Future &&other) =
default;
88 bool isReady()
const {
89 return _future.valid() &&
90 _future.wait_for(std::chrono::seconds(0)) == std::future_status::ready;
103 Result<T> result(
unsigned int timeoutMs = 0) {
104 if (!_future.valid())
return Result<T>(T{}, Error::Invalid);
105 if (timeoutMs != 0) {
106 if (_future.wait_for(std::chrono::milliseconds(timeoutMs)) !=
107 std::future_status::ready) {
108 return Result<T>(T{}, Error::Timeout);
112 return Result<T>(_future.get(), Error::Ok);
113 }
catch (
const PromiseError &pe) {
114 return Result<T>(T{}, pe.error);
115 }
catch (
const std::future_error &) {
116 return Result<T>(T{}, Error::Invalid);
118 return Result<T>(T{}, Error::LibraryFailure);
125 void waitForFinished() {
126 if (_future.valid()) _future.wait();
134 Error waitForFinished(
unsigned int timeoutMs) {
135 if (!_future.valid())
return Error::Invalid;
136 if (_future.wait_for(std::chrono::milliseconds(timeoutMs)) == std::future_status::ready) {
139 return Error::Timeout;
146 bool isValid()
const {
return _future.valid(); }
149 mutable std::future<T> _future;
157template <>
class Future<void> {
163 Future(std::future<void> &&f) : _future(std::move(f)) {}
168 Future(
const Future &) =
delete;
169 Future &operator=(
const Future &) =
delete;
170 Future(Future &&other) =
default;
171 Future &operator=(Future &&other) =
default;
177 bool isReady()
const {
178 return _future.valid() &&
179 _future.wait_for(std::chrono::seconds(0)) == std::future_status::ready;
189 Error result(
unsigned int timeoutMs = 0) {
190 if (!_future.valid())
return Error::Invalid;
191 if (timeoutMs != 0) {
192 if (_future.wait_for(std::chrono::milliseconds(timeoutMs)) !=
193 std::future_status::ready) {
194 return Error::Timeout;
200 }
catch (
const PromiseError &pe) {
202 }
catch (
const std::future_error &) {
203 return Error::Invalid;
205 return Error::LibraryFailure;
212 void waitForFinished() {
213 if (_future.valid()) _future.wait();
221 Error waitForFinished(
unsigned int timeoutMs) {
222 if (!_future.valid())
return Error::Invalid;
223 if (_future.wait_for(std::chrono::milliseconds(timeoutMs)) == std::future_status::ready) {
226 return Error::Timeout;
233 bool isValid()
const {
return _future.valid(); }
236 mutable std::future<void> _future;