Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
050ca0c0cc
@ -1,6 +1,7 @@
|
|||||||
#ifndef SLED_FUTURES_FUTURE_H
|
#ifndef SLED_FUTURES_FUTURE_H
|
||||||
#define SLED_FUTURES_FUTURE_H
|
#define SLED_FUTURES_FUTURE_H
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "sled/exec/detail/invoke_result.h"
|
#include "sled/exec/detail/invoke_result.h"
|
||||||
#include "sled/futures/internal/failure_handling.h"
|
#include "sled/futures/internal/failure_handling.h"
|
||||||
@ -82,6 +83,28 @@ public:
|
|||||||
Future<T, FailureT> &operator=(Future<T, FailureT> &&) noexcept = default;
|
Future<T, FailureT> &operator=(Future<T, FailureT> &&) noexcept = default;
|
||||||
~Future() = default;
|
~Future() = default;
|
||||||
|
|
||||||
|
Future(const T &value) noexcept
|
||||||
|
{
|
||||||
|
static_assert(!std::is_same<T, FailureT>::value, "T and FailureT must be different types");
|
||||||
|
data_ = Future<T, FailureT>::Create().data_;
|
||||||
|
FillSuccess(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future(T &&value) noexcept
|
||||||
|
{
|
||||||
|
static_assert(!std::is_same<T, FailureT>::value, "T and FailureT must be different types");
|
||||||
|
data_ = Future<T, FailureT>::Create().data_;
|
||||||
|
FillSuccess(std::move(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename = typename std::enable_if<!std::is_same<T, FailureT>::value>>
|
||||||
|
Future(const FailureT &failure) noexcept
|
||||||
|
{
|
||||||
|
static_assert(!std::is_same<T, FailureT>::value, "T and FailureT must be different types");
|
||||||
|
data_ = Future<T, FailureT>::Create().data_;
|
||||||
|
FillFailure(failure);
|
||||||
|
}
|
||||||
|
|
||||||
bool operator==(const Future<T, FailureT> &other) const noexcept { return data_ == other.data_; }
|
bool operator==(const Future<T, FailureT> &other) const noexcept { return data_ == other.data_; }
|
||||||
|
|
||||||
bool operator!=(const Future<T, FailureT> &other) const noexcept { return !operator==(other); }
|
bool operator!=(const Future<T, FailureT> &other) const noexcept { return !operator==(other); }
|
||||||
@ -359,7 +382,7 @@ public:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<T, FailureT> successful(const T &value) noexcept
|
static Future<T, FailureT> Successful(const T &value) noexcept
|
||||||
{
|
{
|
||||||
Future<T, FailureT> result = Future<T, FailureT>::Create();
|
Future<T, FailureT> result = Future<T, FailureT>::Create();
|
||||||
result.FillSuccess(value);
|
result.FillSuccess(value);
|
||||||
|
@ -115,5 +115,13 @@ TEST_SUITE("future")
|
|||||||
CHECK_FALSE(f2.IsFailed());
|
CHECK_FALSE(f2.IsFailed());
|
||||||
auto f3 = sled::Future<std::string>::AsyncValue("11");
|
auto f3 = sled::Future<std::string>::AsyncValue("11");
|
||||||
CHECK_EQ(f3.Result(), "11");
|
CHECK_EQ(f3.Result(), "11");
|
||||||
|
TEST_CASE("Constructor")
|
||||||
|
{
|
||||||
|
sled::Future<int, std::string> f1 = 1;
|
||||||
|
sled::Future<int, std::string> f2 = std::string("1");
|
||||||
|
REQUIRE(f1.IsCompleted());
|
||||||
|
REQUIRE(f2.IsFailed());
|
||||||
|
REQUIRE_EQ(f1.Result(), 1);
|
||||||
|
REQUIRE_EQ(f2.FailureReason(), "1");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ template<typename T, typename FailureT>
|
|||||||
class Future;
|
class Future;
|
||||||
|
|
||||||
template<typename T, typename FailureT = std::exception>
|
template<typename T, typename FailureT = std::exception>
|
||||||
class Promise {
|
class Promise final {
|
||||||
static_assert(!std::is_same<T, void>::value, "Promise<void, _> is not allowed. Use Promise<bool, _> instead");
|
static_assert(!std::is_same<T, void>::value, "Promise<void, _> is not allowed. Use Promise<bool, _> instead");
|
||||||
static_assert(!std::is_same<FailureT, void>::value,
|
static_assert(!std::is_same<FailureT, void>::value,
|
||||||
"Promise<_, void> is not allowed. Use Promise<_, bool> instead");
|
"Promise<_, void> is not allowed. Use Promise<_, bool> instead");
|
||||||
@ -19,9 +19,9 @@ class Promise {
|
|||||||
public:
|
public:
|
||||||
using Value = T;
|
using Value = T;
|
||||||
Promise() = default;
|
Promise() = default;
|
||||||
Promise(const Promise &) noexcept = default;
|
Promise(const Promise &) = default;
|
||||||
Promise(Promise &&) noexcept = default;
|
Promise(Promise &&) noexcept = default;
|
||||||
Promise &operator=(const Promise &) noexcept = default;
|
Promise &operator=(const Promise &) = default;
|
||||||
Promise &operator=(Promise &&) noexcept = default;
|
Promise &operator=(Promise &&) noexcept = default;
|
||||||
~Promise() = default;
|
~Promise() = default;
|
||||||
|
|
||||||
@ -29,14 +29,14 @@ public:
|
|||||||
|
|
||||||
bool IsFilled() const noexcept { return future_.IsCompleted(); }
|
bool IsFilled() const noexcept { return future_.IsCompleted(); }
|
||||||
|
|
||||||
void Failure(const FailureT &reason) { return future_.FillFailure(reason); }
|
void Failure(const FailureT &reason) const noexcept { return future_.FillFailure(reason); }
|
||||||
|
|
||||||
void Success(const T &value) { return future_.FillSuccess(value); }
|
void Success(const T &value) const noexcept { return future_.FillSuccess(value); }
|
||||||
|
|
||||||
void Success(T &&value) { return future_.FillSuccess(std::move(value)); }
|
void Success(T &&value) const noexcept { return future_.FillSuccess(std::move(value)); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Future<T, FailureT> future_ = Future<T, FailureT>::Create();
|
mutable Future<T, FailureT> future_ = Future<T, FailureT>::Create();
|
||||||
};
|
};
|
||||||
}// namespace sled
|
}// namespace sled
|
||||||
|
|
||||||
|
@ -61,7 +61,8 @@ struct is_invocable_test {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<class F, class... Args>
|
template<class F, class... Args>
|
||||||
using is_invocable = typename std::integral_constant<bool, sizeof(is_invocable_test::test<F, Args...>(0)) == 1>::type;
|
using fsm_is_invocable =
|
||||||
|
typename std::integral_constant<bool, sizeof(is_invocable_test::test<F, Args...>(0)) == 1>::type;
|
||||||
#else
|
#else
|
||||||
#error "fsmlite requires C++11 support."
|
#error "fsmlite requires C++11 support."
|
||||||
#endif
|
#endif
|
||||||
@ -101,10 +102,10 @@ invoke(M T::*f, T1 &&obj, Args &&...args)
|
|||||||
template<class F,
|
template<class F,
|
||||||
class Arg1,
|
class Arg1,
|
||||||
class Arg2,
|
class Arg2,
|
||||||
bool f1 = is_invocable<F>::value,
|
bool f1 = fsm_is_invocable<F>::value,
|
||||||
bool f2 = is_invocable<F, Arg1>::value,
|
bool f2 = fsm_is_invocable<F, Arg1>::value,
|
||||||
bool f3 = is_invocable<F, Arg2>::value,
|
bool f3 = fsm_is_invocable<F, Arg2>::value,
|
||||||
bool f4 = is_invocable<F, Arg1, Arg2>::value>
|
bool f4 = fsm_is_invocable<F, Arg1, Arg2>::value>
|
||||||
struct binary_fn_helper;
|
struct binary_fn_helper;
|
||||||
|
|
||||||
template<class F, class Arg1, class Arg2>
|
template<class F, class Arg1, class Arg2>
|
||||||
|
@ -70,6 +70,11 @@ private:
|
|||||||
|
|
||||||
bool has_authority_ = false;
|
bool has_authority_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#undef __SLED_URI_GETTER_AND_SETTER
|
||||||
|
#undef __SLED_URI_GETTER
|
||||||
|
#undef __SLED_URI_SETTER
|
||||||
|
|
||||||
}// namespace sled
|
}// namespace sled
|
||||||
|
|
||||||
#endif// SLED_URI_H
|
#endif// SLED_URI_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user