|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace sr |
|
|
namespace sr |
|
|
{ |
|
|
{ |
|
|
|
|
|
namespace detail |
|
|
|
|
|
{ |
|
|
|
|
|
template<class T, class U, |
|
|
|
|
|
class R = std::conditional_t<std::is_nothrow_constructible_v<T, U>, U&&, U> |
|
|
|
|
|
> |
|
|
|
|
|
constexpr R forward_if_nothrow_constructible(U&& arg) |
|
|
|
|
|
{ |
|
|
|
|
|
return std::forward<U>(arg); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<class R, class D> |
|
|
template<class R, class D> |
|
|
class unique_resource |
|
|
class unique_resource |
|
|
|
|
|
|
|
|
> |
|
|
> |
|
|
explicit unique_resource(RR&& r, DD&& d) noexcept((std::is_nothrow_constructible_v<R, RR> || std::is_nothrow_constructible_v<R, RR&>) |
|
|
explicit unique_resource(RR&& r, DD&& d) noexcept((std::is_nothrow_constructible_v<R, RR> || std::is_nothrow_constructible_v<R, RR&>) |
|
|
&& (std::is_nothrow_constructible_v<D, DD> || std::is_nothrow_constructible_v<D, DD&>)) |
|
|
&& (std::is_nothrow_constructible_v<D, DD> || std::is_nothrow_constructible_v<D, DD&>)) |
|
|
: m_resource(std::forward<RR>(r), scope_exit{[&r, &d] { d(r); }}), |
|
|
|
|
|
m_deleter(std::forward<DD>(d), scope_exit{[this, &d] { d(get()); }}), |
|
|
|
|
|
|
|
|
: m_resource(detail::forward_if_nothrow_constructible<R, RR>(std::forward<RR>(r)), scope_exit{[&r, &d] { d(r); }}), |
|
|
|
|
|
m_deleter(detail::forward_if_nothrow_constructible<D, DD>(std::forward<DD>(d)), scope_exit{[this, &d] { d(get()); }}), |
|
|
m_execute_on_destruction(true) |
|
|
m_execute_on_destruction(true) |
|
|
{ |
|
|
{ |
|
|
} |
|
|
} |