copy ctors, comparison operators, swap, hash

This commit is contained in:
2018-12-10 13:10:39 +07:00
parent 654cfda902
commit bf5c17c106
2 changed files with 113 additions and 0 deletions

View File

@@ -380,6 +380,29 @@ namespace promise_hpp
promise()
: state_(std::make_shared<state>()) {}
promise(const promise&) noexcept = default;
promise& operator=(const promise&) noexcept = default;
void swap(promise& other) noexcept {
state_.swap(other.state_);
}
std::size_t hash() const noexcept {
return std::hash<state*>()(state_.get());
}
friend bool operator<(const promise& l, const promise& r) noexcept {
return l.state_ < r.state_;
}
friend bool operator==(const promise& l, const promise& r) noexcept {
return l.state_ == r.state_;
}
friend bool operator!=(const promise& l, const promise& r) noexcept {
return l.state_ != r.state_;
}
template < typename ResolveF
, typename ResolveFR = invoke_hpp::invoke_result_t<ResolveF,T> >
std::enable_if_t<
@@ -686,6 +709,29 @@ namespace promise_hpp
promise()
: state_(std::make_shared<state>()) {}
promise(const promise&) noexcept = default;
promise& operator=(const promise&) noexcept = default;
void swap(promise& other) noexcept {
state_.swap(other.state_);
}
std::size_t hash() const noexcept {
return std::hash<state*>()(state_.get());
}
friend bool operator<(const promise& l, const promise& r) noexcept {
return l.state_ < r.state_;
}
friend bool operator==(const promise& l, const promise& r) noexcept {
return l.state_ == r.state_;
}
friend bool operator!=(const promise& l, const promise& r) noexcept {
return l.state_ != r.state_;
}
template < typename ResolveF
, typename ResolveFR = invoke_hpp::invoke_result_t<ResolveF> >
std::enable_if_t<
@@ -961,6 +1007,15 @@ namespace promise_hpp
};
};
//
// swap
//
template < typename T >
void swap(promise<T>& l, promise<T>& r) noexcept {
l.swap(r);
}
//
// make_promise
//
@@ -1107,3 +1162,15 @@ namespace promise_hpp
std::end(container));
}
}
namespace std
{
template < typename T >
struct hash<promise_hpp::promise<T>>
: std::unary_function<promise_hpp::promise<T>, std::size_t>
{
std::size_t operator()(const promise_hpp::promise<T>& p) const noexcept {
return p.hash();
}
};
}

View File

@@ -104,6 +104,52 @@ TEST_CASE("is_promise_r") {
}
TEST_CASE("promise") {
SECTION("basic") {
{
auto p1 = pr::promise<int>();
auto p2 = pr::promise<int>();
REQUIRE_FALSE(p1 == p2);
REQUIRE(p1 != p2);
REQUIRE((p1 < p2 || p2 < p1));
REQUIRE(p1.hash() != p2.hash());
REQUIRE(p1.hash() == std::hash<pr::promise<int>>()(p1));
}
{
auto p1 = pr::promise<void>();
auto p2 = pr::promise<void>();
REQUIRE_FALSE(p1 == p2);
REQUIRE(p1 != p2);
REQUIRE((p1 < p2 || p2 < p1));
REQUIRE(p1.hash() != p2.hash());
REQUIRE(p1.hash() == std::hash<pr::promise<void>>()(p1));
}
{
auto p1 = pr::promise<int>();
auto p2 = pr::promise<int>();
auto p3 = p1;
REQUIRE(p1 == p3);
p3 = p2;
REQUIRE(p2 == p3);
}
{
auto p1 = pr::promise<int>();
auto p2 = pr::promise<int>();
auto p3 = p1;
p1.swap(p2);
REQUIRE(p2 == p3);
REQUIRE_FALSE(p1 == p3);
}
{
auto p1 = pr::promise<void>();
auto p2 = pr::promise<void>();
auto p3 = p1;
p1.swap(p2);
REQUIRE(p2 == p3);
REQUIRE_FALSE(p1 == p3);
}
}
SECTION("resolved") {
{
int check_42_int = 0;