mirror of
https://github.com/BlackMATov/promise.hpp.git
synced 2025-12-14 20:21:32 +07:00
copy ctors, comparison operators, swap, hash
This commit is contained in:
67
promise.hpp
67
promise.hpp
@@ -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();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
46
tests.cpp
46
tests.cpp
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user