From 912459ca3322b5ed9a89cb9a70552baac737c08c Mon Sep 17 00:00:00 2001 From: joren-dev Date: Sat, 21 Nov 2020 01:30:56 +0100 Subject: [PATCH 1/2] add scope guard --- pe_scope_guard/pe_scope_guard.hpp | 36 +++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 pe_scope_guard/pe_scope_guard.hpp diff --git a/pe_scope_guard/pe_scope_guard.hpp b/pe_scope_guard/pe_scope_guard.hpp new file mode 100644 index 0000000..7ed3f7a --- /dev/null +++ b/pe_scope_guard/pe_scope_guard.hpp @@ -0,0 +1,36 @@ +#ifndef PE_SCOPE_GUARD_HPP +#define PE_SCOPE_GUARD_HPP + +#include +#include +#include +#include + +namespace peach +{ + + template< typename... Tys > class ScopeGuard + { + public: + ScopeGuard( Tys&&... callables ) requires( ( std::same_as< std::invoke_result_t< Tys >, void > && ... ) ) + : m_callables( std::make_tuple( std::forward< Tys >( callables )... ) ) + { + } + + ScopeGuard( Tys... callables ) requires( ( std::same_as< std::invoke_result_t< Tys >, void > && ... ) ) + : m_callables( std::make_tuple( callables... ) ) + { + } + + ~ScopeGuard( ) noexcept + { + std::apply( []( auto&&... args ) { ( ( args( ) ), ... ); }, m_callables ); + } + + private: + std::tuple< Tys... > m_callables; + }; + +} // namespace peach + +#endif // PE_SCOPE_GUARD_HPP From aa921dcccf62762b05ec433c61a558477b59fb6c Mon Sep 17 00:00:00 2001 From: joren-dev Date: Sat, 21 Nov 2020 02:05:01 +0100 Subject: [PATCH 2/2] remove redundant overload, add constexpr --- pe_scope_guard/pe_scope_guard.hpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pe_scope_guard/pe_scope_guard.hpp b/pe_scope_guard/pe_scope_guard.hpp index 7ed3f7a..7bf4dca 100644 --- a/pe_scope_guard/pe_scope_guard.hpp +++ b/pe_scope_guard/pe_scope_guard.hpp @@ -12,12 +12,7 @@ namespace peach template< typename... Tys > class ScopeGuard { public: - ScopeGuard( Tys&&... callables ) requires( ( std::same_as< std::invoke_result_t< Tys >, void > && ... ) ) - : m_callables( std::make_tuple( std::forward< Tys >( callables )... ) ) - { - } - - ScopeGuard( Tys... callables ) requires( ( std::same_as< std::invoke_result_t< Tys >, void > && ... ) ) + constexpr ScopeGuard( Tys... callables ) requires( ( std::same_as< std::invoke_result_t< Tys >, void > && ... ) ) : m_callables( std::make_tuple( callables... ) ) { }