Browse Source

Move assignment implemented.

main
offa 7 years ago
parent
commit
12f3d51a1a
2 changed files with 35 additions and 4 deletions
  1. +13
    -1
      include/unique_resource.h
  2. +22
    -3
      test/UniqueResourceTest.cpp

+ 13
- 1
include/unique_resource.h View File

} }




unique_resource& operator=(unique_resource&& other); // TODO: Implement
template<class RR = R, class DD = D,
std::enable_if_t<(std::is_nothrow_move_assignable<RR>::value || std::is_nothrow_copy_assignable<RR>::value)
&& (std::is_nothrow_copy_assignable<DD>::value || std::is_nothrow_copy_assignable<DD>::value), int> = 0
>
unique_resource& operator=(unique_resource&& other)
{
reset();
m_resource = std::forward<RR>(other.m_resource);
m_deleter = std::forward<DD>(other.m_deleter);
m_execute_on_destruction = std::exchange(other.m_execute_on_destruction, false);
return *this;
}

unique_resource& operator=(const unique_resource&) = delete; unique_resource& operator=(const unique_resource&) = delete;





+ 22
- 3
test/UniqueResourceTest.cpp View File

CHECK(guard.get() == 3); CHECK(guard.get() == 3);
} }


// TODO: Implement move assignment
TEST_CASE("move assignment has no effect if same object", "[UniqueResource]")
{
REQUIRE_CALL(m, deleter(3));
auto guard = sr::make_unique_resource(Handle{3}, deleter);
guard = std::move(guard);
REQUIRE(guard.get() == 3);
}

TEST_CASE("move assignment calls deleter", "[UniqueResource]")
{
auto moveFrom = sr::make_unique_resource(Handle{3}, deleter);
REQUIRE_CALL(m, deleter(4));

{
REQUIRE_CALL(m, deleter(3));
auto guard = sr::make_unique_resource(Handle{4}, deleter);
guard = std::move(moveFrom);
}
}


TEST_CASE("deleter called on destruction", "[UniqueResource]") TEST_CASE("deleter called on destruction", "[UniqueResource]")
{ {
CHECK(guard.get() == 3); CHECK(guard.get() == 3);
} }


TEST_CASE("pointer access resturns resource" "[UniqueResource]")
TEST_CASE("pointer access returns resource" "[UniqueResource]")
{ {
const auto p = std::make_pair(3, 4); const auto p = std::make_pair(3, 4);
auto guard = sr::make_unique_resource(&p, [](auto*) { }); auto guard = sr::make_unique_resource(&p, [](auto*) { });
REQUIRE(guard->second == 4); REQUIRE(guard->second == 4);
} }


TEST_CASE("pointer dereference resturns resource" "[UniqueResource]")
TEST_CASE("pointer dereference returns resource" "[UniqueResource]")
{ {
Handle h{5}; Handle h{5};
auto guard = sr::make_unique_resource(PtrHandle{&h}, [](auto*) { }); auto guard = sr::make_unique_resource(PtrHandle{&h}, [](auto*) { });
guard.get_deleter()(8); guard.get_deleter()(8);
} }
} }


Loading…
Cancel
Save