@@ -70,8 +70,8 @@ namespace sr::detail | |||
> | |||
explicit scope_guard_base(EFP&& exitFunction) noexcept(std::is_nothrow_constructible_v<EF, EFP> | |||
|| std::is_nothrow_constructible_v<EF, EFP&>) | |||
: m_exitfunction(std::forward<EFP>(exitFunction)), | |||
m_execute_on_destruction(true) | |||
: exitfunction(std::forward<EFP>(exitFunction)), | |||
execute_on_destruction(true) | |||
{ | |||
} | |||
@@ -79,8 +79,8 @@ namespace sr::detail | |||
std::enable_if_t<std::is_constructible_v<EF, EFP>, int> = 0, | |||
std::enable_if_t<std::is_lvalue_reference_v<EFP>, int> = 0 | |||
> | |||
explicit scope_guard_base(EFP&& exitFunction) try : m_exitfunction(exitFunction), | |||
m_execute_on_destruction(true) | |||
explicit scope_guard_base(EFP&& exitFunction) try : exitfunction(exitFunction), | |||
execute_on_destruction(true) | |||
{ | |||
} | |||
catch( ... ) | |||
@@ -95,8 +95,8 @@ namespace sr::detail | |||
scope_guard_base(scope_guard_base&& other) noexcept(std::is_nothrow_move_constructible_v<EF> | |||
|| std::is_nothrow_copy_constructible_v<EF>) | |||
: Strategy(other), | |||
m_exitfunction(forward_if_nothrow_move_constructible(other.m_exitfunction)), | |||
m_execute_on_destruction(other.m_execute_on_destruction) | |||
exitfunction(forward_if_nothrow_move_constructible(other.exitfunction)), | |||
execute_on_destruction(other.execute_on_destruction) | |||
{ | |||
other.release(); | |||
} | |||
@@ -106,16 +106,16 @@ namespace sr::detail | |||
~scope_guard_base() noexcept(is_noexcept_dtor_v<EF, Strategy>) | |||
{ | |||
if( (m_execute_on_destruction == true) && (this->should_execute() == true) ) | |||
if( (execute_on_destruction == true) && (this->should_execute() == true) ) | |||
{ | |||
m_exitfunction(); | |||
exitfunction(); | |||
} | |||
} | |||
void release() noexcept | |||
{ | |||
m_execute_on_destruction = false; | |||
execute_on_destruction = false; | |||
} | |||
@@ -125,8 +125,8 @@ namespace sr::detail | |||
private: | |||
EF m_exitfunction; | |||
bool m_execute_on_destruction; | |||
EF exitfunction; | |||
bool execute_on_destruction; | |||
}; | |||
} |
@@ -34,7 +34,7 @@ namespace sr::detail | |||
public: | |||
template<class TT, class G, std::enable_if_t<std::is_constructible_v<T, TT>, int> = 0> | |||
Wrapper(TT&& value, G&& g) noexcept(std::is_nothrow_constructible_v<T, TT>) : m_value(std::forward<TT>(value)) | |||
Wrapper(TT&& v, G&& g) noexcept(std::is_nothrow_constructible_v<T, TT>) : value(std::forward<TT>(v)) | |||
{ | |||
g.release(); | |||
} | |||
@@ -42,27 +42,27 @@ namespace sr::detail | |||
T& get() noexcept | |||
{ | |||
return m_value; | |||
return value; | |||
} | |||
const T& get() const noexcept | |||
{ | |||
return m_value; | |||
return value; | |||
} | |||
void reset(Wrapper<T>&& other) noexcept | |||
{ | |||
m_value = std::move(other.m_value); | |||
value = std::move(other.value); | |||
} | |||
void reset(T&& newValue) noexcept(std::is_nothrow_assignable_v<T, decltype(std::move_if_noexcept(newValue))>) | |||
{ | |||
m_value = std::forward<T>(newValue); | |||
value = std::forward<T>(newValue); | |||
} | |||
void reset(const T& newValue) noexcept(std::is_nothrow_assignable_v<T, const T&>) | |||
{ | |||
m_value = newValue; | |||
value = newValue; | |||
} | |||
@@ -71,7 +71,7 @@ namespace sr::detail | |||
private: | |||
T m_value; | |||
T value; | |||
}; | |||
@@ -81,7 +81,7 @@ namespace sr::detail | |||
public: | |||
template<class TT, class G, std::enable_if_t<std::is_convertible_v<TT, T&>, int> = 0> | |||
Wrapper(TT&& value, G&& g) noexcept(std::is_nothrow_constructible_v<TT, T&>) : m_value(static_cast<T&>(value)) | |||
Wrapper(TT&& v, G&& g) noexcept(std::is_nothrow_constructible_v<TT, T&>) : value(static_cast<T&>(v)) | |||
{ | |||
g.release(); | |||
} | |||
@@ -89,22 +89,22 @@ namespace sr::detail | |||
T& get() noexcept | |||
{ | |||
return m_value.get(); | |||
return value.get(); | |||
} | |||
const T& get() const noexcept | |||
{ | |||
return m_value.get(); | |||
return value.get(); | |||
} | |||
void reset(Wrapper<T>&& other) noexcept | |||
{ | |||
m_value = std::move(other.m_value); | |||
value = std::move(other.value); | |||
} | |||
void reset(T& newValue) noexcept | |||
{ | |||
m_value = std::ref(newValue); | |||
value = std::ref(newValue); | |||
} | |||
@@ -113,7 +113,7 @@ namespace sr::detail | |||
private: | |||
type m_value; | |||
type value; | |||
}; | |||
} |
@@ -34,11 +34,11 @@ namespace sr | |||
{ | |||
bool should_execute() const noexcept | |||
{ | |||
return std::uncaught_exceptions() > m_uncaught_on_creation; | |||
return std::uncaught_exceptions() > uncaught_on_creation; | |||
} | |||
int m_uncaught_on_creation = std::uncaught_exceptions(); | |||
int uncaught_on_creation = std::uncaught_exceptions(); | |||
}; | |||
} |
@@ -34,11 +34,11 @@ namespace sr | |||
{ | |||
bool should_execute() const noexcept | |||
{ | |||
return std::uncaught_exceptions() <= m_uncaught_on_creation; | |||
return std::uncaught_exceptions() <= uncaught_on_creation; | |||
} | |||
int m_uncaught_on_creation = std::uncaught_exceptions(); | |||
int uncaught_on_creation = std::uncaught_exceptions(); | |||
}; | |||
@@ -53,19 +53,19 @@ namespace sr | |||
> | |||
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&>)) | |||
: 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) | |||
: resource(detail::forward_if_nothrow_constructible<R, RR>(std::forward<RR>(r)), scope_exit{[&r, &d] { d(r); }}), | |||
deleter(detail::forward_if_nothrow_constructible<D, DD>(std::forward<DD>(d)), scope_exit{[this, &d] { d(get()); }}), | |||
execute_on_destruction(true) | |||
{ | |||
} | |||
unique_resource(unique_resource&& other) noexcept(std::is_nothrow_move_constructible_v<R> | |||
&& std::is_nothrow_move_constructible_v<D>) | |||
: m_resource(std::move_if_noexcept(other.m_resource.get()), scope_exit{[] { }}), | |||
m_deleter(std::move_if_noexcept(other.m_deleter.get()), scope_exit{[&other] { | |||
other.get_deleter()(other.m_resource.get()); | |||
: resource(std::move_if_noexcept(other.resource.get()), scope_exit{[] { }}), | |||
deleter(std::move_if_noexcept(other.deleter.get()), scope_exit{[&other] { | |||
other.get_deleter()(other.resource.get()); | |||
other.release(); }}), | |||
m_execute_on_destruction(std::exchange(other.m_execute_on_destruction, false)) | |||
execute_on_destruction(std::exchange(other.execute_on_destruction, false)) | |||
{ | |||
} | |||
@@ -79,10 +79,10 @@ namespace sr | |||
void reset() noexcept | |||
{ | |||
if( m_execute_on_destruction == true ) | |||
if( execute_on_destruction == true ) | |||
{ | |||
m_execute_on_destruction = false; | |||
get_deleter()(m_resource.get()); | |||
execute_on_destruction = false; | |||
get_deleter()(resource.get()); | |||
} | |||
} | |||
@@ -96,31 +96,31 @@ namespace sr | |||
if constexpr( std::is_nothrow_assignable_v<R1&, RR> == true ) | |||
{ | |||
m_resource.reset(std::forward<RR>(r)); | |||
resource.reset(std::forward<RR>(r)); | |||
} | |||
else | |||
{ | |||
m_resource.reset(std::as_const(r)); | |||
resource.reset(std::as_const(r)); | |||
} | |||
m_execute_on_destruction = true; | |||
execute_on_destruction = true; | |||
se.release(); | |||
} | |||
void release() noexcept | |||
{ | |||
m_execute_on_destruction = false; | |||
execute_on_destruction = false; | |||
} | |||
const R& get() const noexcept | |||
{ | |||
return m_resource.get(); | |||
return resource.get(); | |||
} | |||
template<class RR = R, std::enable_if_t<std::is_pointer_v<RR>, int> = 0> | |||
RR operator->() const noexcept | |||
{ | |||
return m_resource.get(); | |||
return resource.get(); | |||
} | |||
template<class RR = R, | |||
@@ -133,7 +133,7 @@ namespace sr | |||
const D& get_deleter() const noexcept | |||
{ | |||
return m_deleter.get(); | |||
return deleter.get(); | |||
} | |||
@@ -154,30 +154,30 @@ namespace sr | |||
{ | |||
if constexpr( std::is_nothrow_move_assignable_v<DD> == true ) | |||
{ | |||
m_resource.reset(std::move(other.m_resource)); | |||
m_deleter.reset(std::move(other.m_deleter)); | |||
resource.reset(std::move(other.resource)); | |||
deleter.reset(std::move(other.deleter)); | |||
} | |||
else | |||
{ | |||
m_deleter.reset(other.m_deleter); | |||
m_resource.reset(std::move(other.m_resource)); | |||
deleter.reset(other.deleter); | |||
resource.reset(std::move(other.resource)); | |||
} | |||
} | |||
else | |||
{ | |||
if constexpr( std::is_nothrow_move_assignable_v<DD> == true ) | |||
{ | |||
m_resource.reset(other.m_resource); | |||
m_deleter.reset(std::move(other.m_deleter)); | |||
resource.reset(other.resource); | |||
deleter.reset(std::move(other.deleter)); | |||
} | |||
else | |||
{ | |||
m_resource.reset(other.m_resource); | |||
m_deleter.reset(other.m_deleter); | |||
resource.reset(other.resource); | |||
deleter.reset(other.deleter); | |||
} | |||
} | |||
m_execute_on_destruction = std::exchange(other.m_execute_on_destruction, false); | |||
execute_on_destruction = std::exchange(other.execute_on_destruction, false); | |||
} | |||
return *this; | |||
} | |||
@@ -187,9 +187,9 @@ namespace sr | |||
private: | |||
detail::Wrapper<R> m_resource; | |||
detail::Wrapper<D> m_deleter; | |||
bool m_execute_on_destruction; | |||
detail::Wrapper<R> resource; | |||
detail::Wrapper<D> deleter; | |||
bool execute_on_destruction; | |||
}; | |||
@@ -65,22 +65,22 @@ namespace mock | |||
struct NotNothrowMoveMock | |||
{ | |||
explicit NotNothrowMoveMock(CallMock* m) : m_mock(m) | |||
explicit NotNothrowMoveMock(CallMock* m) : mock(m) | |||
{ | |||
} | |||
NotNothrowMoveMock(const NotNothrowMoveMock& other) : m_mock(other.m_mock) | |||
NotNothrowMoveMock(const NotNothrowMoveMock& other) : mock(other.mock) | |||
{ | |||
} | |||
NotNothrowMoveMock(NotNothrowMoveMock&& other) noexcept(false) : m_mock(other.m_mock) | |||
NotNothrowMoveMock(NotNothrowMoveMock&& other) noexcept(false) : mock(other.mock) | |||
{ | |||
} | |||
void operator()() const | |||
{ | |||
m_mock->deleter(); | |||
mock->deleter(); | |||
} | |||
NotNothrowMoveMock& operator=(const NotNothrowMoveMock&) | |||
@@ -94,21 +94,21 @@ namespace mock | |||
} | |||
CallMock* m_mock; | |||
CallMock* mock; | |||
}; | |||
struct ConditialThrowOnCopyMock | |||
{ | |||
explicit ConditialThrowOnCopyMock(Handle h, bool shouldThrow) : m_handle(h), | |||
m_shouldThrow(shouldThrow) | |||
explicit ConditialThrowOnCopyMock(Handle h, bool throwOnCopyMock) : handle(h), | |||
shouldThrow(throwOnCopyMock) | |||
{ | |||
} | |||
ConditialThrowOnCopyMock(const ConditialThrowOnCopyMock& other) : m_handle(other.m_handle), | |||
m_shouldThrow(other.m_shouldThrow) | |||
ConditialThrowOnCopyMock(const ConditialThrowOnCopyMock& other) : handle(other.handle), | |||
shouldThrow(other.shouldThrow) | |||
{ | |||
if( m_shouldThrow == true ) | |||
if( shouldThrow == true ) | |||
{ | |||
throw std::exception{}; | |||
} | |||
@@ -120,10 +120,10 @@ namespace mock | |||
{ | |||
if( &other != this ) | |||
{ | |||
m_handle = other.m_handle; | |||
m_shouldThrow = other.m_shouldThrow; | |||
handle = other.handle; | |||
shouldThrow = other.shouldThrow; | |||
if( m_shouldThrow == true ) | |||
if( shouldThrow == true ) | |||
{ | |||
throw std::exception{}; | |||
} | |||
@@ -135,31 +135,31 @@ namespace mock | |||
ConditialThrowOnCopyMock& operator=(ConditialThrowOnCopyMock&&) = default; | |||
Handle m_handle; | |||
bool m_shouldThrow; | |||
Handle handle; | |||
bool shouldThrow; | |||
}; | |||
struct NotNothrowAssignable | |||
{ | |||
explicit NotNothrowAssignable(int value) : m_value(value) { } | |||
explicit NotNothrowAssignable(int v) : value(v) { } | |||
NotNothrowAssignable(const NotNothrowAssignable&) = default; | |||
NotNothrowAssignable& operator=(const NotNothrowAssignable& other) | |||
{ | |||
if( this != &other ) | |||
{ | |||
assignNotNoexcept(other.m_value); | |||
assignNotNoexcept(other.value); | |||
} | |||
return *this; | |||
} | |||
void assignNotNoexcept(int value) noexcept(false) | |||
void assignNotNoexcept(int v) noexcept(false) | |||
{ | |||
m_value = value; | |||
value = v; | |||
} | |||
int m_value; | |||
int value; | |||
}; | |||
struct CopyMock |
@@ -129,7 +129,7 @@ TEST_CASE("reset sets new lvalue and calls deleter on previous", "[UniqueResourc | |||
{ | |||
REQUIRE_CALL(m, deleter(3)); | |||
REQUIRE_CALL(m, deleter(7)); | |||
auto d = [](const auto& v) { deleter(v.m_value); }; | |||
auto d = [](const auto& v) { deleter(v.value); }; | |||
auto guard = sr::unique_resource{NotNothrowAssignable{3}, d}; | |||
const NotNothrowAssignable h{7}; | |||
guard.reset(h); | |||
@@ -139,7 +139,7 @@ TEST_CASE("reset handles exception on assignment", "[UniqueResource]") | |||
{ | |||
REQUIRE_CALL(m, deleter(3)); | |||
REQUIRE_CALL(m, deleter(7)); | |||
auto d = [](const auto& v) { deleter(v.m_handle); }; | |||
auto d = [](const auto& v) { deleter(v.handle); }; | |||
auto guard = sr::unique_resource{ConditialThrowOnCopyMock{3, false}, d}; | |||
guard.reset(ConditialThrowOnCopyMock{7, true}); | |||
} |