Browse Source

Implementation of swap() added. As the specification of the

noexcept-value is missing in the document it is implemented as for
std::swap(). Fixes #73.
main
offa 7 years ago
parent
commit
0b264e8f80
2 changed files with 30 additions and 0 deletions
  1. +16
    -0
      include/unique_resource.h
  2. +14
    -0
      test/UniqueResourceTest.cpp

+ 16
- 0
include/unique_resource.h View File

constexpr auto is_nothrow_move_or_copy_constructible_from_v = is_ntmocp_constructible<T, TT>::value; constexpr auto is_nothrow_move_or_copy_constructible_from_v = is_ntmocp_constructible<T, TT>::value;




template<class T>
constexpr auto is_nothrow_swappable_v = std::is_nothrow_move_constructible<T>::value
&& std::is_nothrow_move_assignable<T>::value;



template<class T, class U = std::conditional_t<std::is_nothrow_move_constructible<T>::value, T&&, const T&>> template<class T, class U = std::conditional_t<std::is_nothrow_move_constructible<T>::value, T&&, const T&>>
constexpr U forward_if_nothrow_move_constructible(T&& value) noexcept constexpr U forward_if_nothrow_move_constructible(T&& value) noexcept
{ {
} }




void swap(unique_resource& other) noexcept(is_nothrow_swappable_v<R>
&& is_nothrow_swappable_v<D>
&& is_nothrow_swappable_v<bool>)
{
using std::swap;
swap(m_resource.get(), other.m_resource.get());
swap(m_deleter.get(), other.m_deleter.get());
swap(m_execute_on_destruction, other.m_execute_on_destruction);
}

void reset() void reset()
{ {
if( m_execute_on_destruction == true ) if( m_execute_on_destruction == true )

+ 14
- 0
test/UniqueResourceTest.cpp View File

} }
} }


TEST_CASE("swap", "[UniqueResource]")
{
REQUIRE_CALL(m, deleter(7));
auto guard1 = sr::make_unique_resource(Handle{3}, deleter);

{
REQUIRE_CALL(m, deleter(3));
auto guard2 = sr::make_unique_resource(Handle{7}, deleter);
guard2.swap(guard1);
REQUIRE(guard1.get() == 7);
REQUIRE(guard2.get() == 3);
}
}

TEST_CASE("make unique resource", "[UniqueResource]") TEST_CASE("make unique resource", "[UniqueResource]")
{ {
REQUIRE_CALL(m, deleter(7)); REQUIRE_CALL(m, deleter(7));

Loading…
Cancel
Save