From bf5c17c106cbd255a91b5a94e2486626e55d2a91 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Mon, 10 Dec 2018 13:10:39 +0700 Subject: [PATCH] copy ctors, comparison operators, swap, hash --- promise.hpp | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests.cpp | 46 ++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/promise.hpp b/promise.hpp index f8d4497..ad1875d 100644 --- a/promise.hpp +++ b/promise.hpp @@ -380,6 +380,29 @@ namespace promise_hpp promise() : state_(std::make_shared()) {} + 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_.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 > std::enable_if_t< @@ -686,6 +709,29 @@ namespace promise_hpp promise() : state_(std::make_shared()) {} + 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_.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 > std::enable_if_t< @@ -961,6 +1007,15 @@ namespace promise_hpp }; }; + // + // swap + // + + template < typename T > + void swap(promise& l, promise& r) noexcept { + l.swap(r); + } + // // make_promise // @@ -1107,3 +1162,15 @@ namespace promise_hpp std::end(container)); } } + +namespace std +{ + template < typename T > + struct hash> + : std::unary_function, std::size_t> + { + std::size_t operator()(const promise_hpp::promise& p) const noexcept { + return p.hash(); + } + }; +} diff --git a/tests.cpp b/tests.cpp index 5842dcf..6ef753f 100644 --- a/tests.cpp +++ b/tests.cpp @@ -104,6 +104,52 @@ TEST_CASE("is_promise_r") { } TEST_CASE("promise") { + SECTION("basic") { + { + auto p1 = pr::promise(); + auto p2 = pr::promise(); + REQUIRE_FALSE(p1 == p2); + REQUIRE(p1 != p2); + + REQUIRE((p1 < p2 || p2 < p1)); + REQUIRE(p1.hash() != p2.hash()); + REQUIRE(p1.hash() == std::hash>()(p1)); + } + { + auto p1 = pr::promise(); + auto p2 = pr::promise(); + REQUIRE_FALSE(p1 == p2); + REQUIRE(p1 != p2); + + REQUIRE((p1 < p2 || p2 < p1)); + REQUIRE(p1.hash() != p2.hash()); + REQUIRE(p1.hash() == std::hash>()(p1)); + } + { + auto p1 = pr::promise(); + auto p2 = pr::promise(); + auto p3 = p1; + REQUIRE(p1 == p3); + p3 = p2; + REQUIRE(p2 == p3); + } + { + auto p1 = pr::promise(); + auto p2 = pr::promise(); + auto p3 = p1; + p1.swap(p2); + REQUIRE(p2 == p3); + REQUIRE_FALSE(p1 == p3); + } + { + auto p1 = pr::promise(); + auto p2 = pr::promise(); + auto p3 = p1; + p1.swap(p2); + REQUIRE(p2 == p3); + REQUIRE_FALSE(p1 == p3); + } + } SECTION("resolved") { { int check_42_int = 0;