wwa-scope-action 1.0.0
Scope guard utilities for managing exit actions in C++
|
A scope guard that calls its exit function on destruction, when a scope is exited. More...
#include <scope_action.h>
Public Member Functions | |
exit_action (exit_action &&other) noexcept(std::is_nothrow_move_constructible_v< ExitFunc >||std::is_nothrow_copy_constructible_v< ExitFunc >) | |
Move constructor. | |
template<typename Func > requires (detail::can_move_construct_from_noexcept<exit_action, ExitFunc, Func>) | |
exit_action (Func &&fn) noexcept | |
Constructs a new exit_action from an exit function of type Func. | |
template<typename Func > requires (detail::can_construct_from<exit_action, ExitFunc, Func>) | |
exit_action (Func &&fn) noexcept(std::is_nothrow_constructible_v< ExitFunc, Func >||std::is_nothrow_constructible_v< ExitFunc, Func & >) | |
Constructs a new exit_action from an exit function of type Func. | |
~exit_action () noexcept | |
Calls the exit function if m_is_armed is active, then destroys the object. | |
void | release () noexcept |
Makes the exit_action object inactive. | |
A scope guard that calls its exit function on destruction, when a scope is exited.
An exit_action
may be either active (i.e., it will calls its exit function on destruction), or inactive (it does nothing on destruction). An exit_action
is active after construction from an exit function.
An exit_action
becomes inactive by calling release()
or a move constructor. An inactive exit_action
may also be obtained by initializing with another inactive exit_action
. Once an exit_action
is inactive, it cannot become active again.
Usage example:
ExitFunc | Exit function type. Func is either a Destructible FunctionObject type, or an lvalue reference to a FunctionObject or function. |
exit_action
of dynamic storage duration might lead to unexpected behavior. exit_action
object refers to a local variable of the function where it is defined (e.g., as a lambda capturing the variable by reference), and that variable is used as a return operand in that function, that variable might have already been returned when the exit_action
's destructor executes, calling the exit function. This can lead to surprising behavior. Definition at line 88 of file scope_action.h.
|
inlineexplicitnoexcept |
Constructs a new exit_action from an exit function of type Func.
Initializes the exit function with a function or function object fn
. The constructed exit_action
is active. If Func
is not an lvalue reference type, and std::is_nothrow_constructible_v<ExitFunc, Func>
is true
, the stored exit function is initialized with std::forward<Func>(fn)
; otherwise it is initialized with fn
. If initialization of the stored exit function throws an exception, calls fn()
.
This overload participates in overload resolution only if:
std::is_same_v<std::remove_cvref_t<Func>, exit_action>
is false
, andstd::is_constructible_v<ExitFunc, Func>
is true
.Func | Exit function type. Must be constructible from ExitFunc. |
fn | Exit function. |
anything | Any exception thrown during the initialization of the stored exit function. |
Definition at line 109 of file scope_action.h.
|
inlineexplicitnoexcept |
Constructs a new exit_action from an exit function of type Func.
Initializes the exit function with a function or function object fn
. The constructed exit_action
is active. The stored exit function is initialized with std::forward<Func>(fn)
.
This overload participates in overload resolution only if:
std::is_same_v<std::remove_cvref_t<Func>, exit_action>
is false
, andstd::is_lvalue_reference_v<Func>
is false
, andstd::is_nothrow_constructible_v<ExitFunc, Func>
is true
.Func | Exit function type. Must be constructible from ExitFunc. |
fn | Exit function. |
Definition at line 142 of file scope_action.h.
|
inlinenoexcept |
Move constructor.
Initializes the stored exit function with the one in other
. The constructed exit_action
is active if and only if other
is active before the construction.
If std::is_nothrow_move_constructible_v<ExitFunc>
is true, initializes stored exit function (denoted by exitfun
) with std::forward<ExitFunc>(other.exitfun)
, otherwise initializes it with other.exitfun
.
After successful move construction, other
becomes inactive.
This overload participates in overload resolution only if:
std::is_nothrow_move_constructible_v<ExitFunc>
is true
, orstd::is_copy_constructible_v<ExitFunc>
is true
.other | exit_action to move from. |
anything | Any exception thrown during the initialization of the stored exit function. |
Definition at line 164 of file scope_action.h.
|
inlinenoexcept |
Calls the exit function if m_is_armed is active, then destroys the object.
Definition at line 192 of file scope_action.h.
|
inlinenoexcept |
Makes the exit_action object inactive.
Once an exit_action is inactive, it cannot become active again, and it will not call its exit function upon destruction.
Definition at line 207 of file scope_action.h.