wwa-scope-action 1.0.0
Scope guard utilities for managing exit actions in C++
|
A scope guard that calls its exit function when a scope is exited normally. More...
#include <scope_action.h>
Public Member Functions | |
template<typename Func > requires detail::can_move_construct_from_noexcept<success_action, ExitFunc, Func> | |
success_action (Func &&fn) noexcept | |
Constructs a new success_action from an exit function of type Func. | |
template<typename Func > requires (detail::can_construct_from<success_action, ExitFunc, Func>) | |
success_action (Func &&fn) noexcept(std::is_nothrow_constructible_v< ExitFunc, Func >||std::is_nothrow_constructible_v< ExitFunc, Func & >) | |
Constructs a new success_action from an exit function of type Func. | |
success_action (success_action &&other) noexcept(std::is_nothrow_move_constructible_v< ExitFunc >||std::is_nothrow_copy_constructible_v< ExitFunc >) | |
Move constructor. | |
~success_action () noexcept(noexcept(this->m_exit_function())) | |
Calls the exit function when the scope is exited normally if the success_action is active, then destroys the object. | |
void | release () noexcept |
Makes the success_action object inactive. | |
A scope guard that calls its exit function when a scope is exited normally.
Like exit_action
, a success_action
may be active or inactive. A success_action
is active after construction from an exit function.
An success_action
becomes inactive by calling release()
or a move constructor. An inactive success_action
may also be obtained by initializing with another inactive success_action
. Once an success_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. |
success_action
of dynamic storage duration might lead to unexpected behavior. success_action
from another success_action
created in a different thread might also lead to unexpected behavior since the count of uncaught exceptions obtained in different threads may be compared during the destruction. success_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 success_action
's destructor executes, calling the exit function. This can lead to surprising behavior. Definition at line 417 of file scope_action.h.
|
inlineexplicitnoexcept |
Constructs a new success_action from an exit function of type Func.
Initializes the exit function with a function or function object, and initializes the counter of uncaught exceptions as if with std::uncaught_exceptions()
. The constructed success_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>, success_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 443 of file scope_action.h.
|
inlineexplicitnoexcept |
Constructs a new success_action from an exit function of type Func.
Initializes the exit function with a function or function object fn
. The constructed success_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>, success_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 472 of file scope_action.h.
|
inlinenoexcept |
Move constructor.
Initializes the stored exit function with the one in other
, and initializes the counter of uncaught exceptions with the one in other
. The constructed success_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.release()
is called and 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 | success_action to move from. |
anything | Any exception thrown during the initialization of the stored exit function. |
Definition at line 495 of file scope_action.h.
|
inlinenoexcept |
Calls the exit function when the scope is exited normally if the success_action
is active, then destroys the object.
Calls the exit function if the result of std::uncaught_exceptions()
is less than or equal to the counter of uncaught exceptions (typically on normal exit) and the success_action
is active, then destroys the object.
anything | Throws any exception thrown by calling the exit function. |
Definition at line 530 of file scope_action.h.
|
inlinenoexcept |
Makes the success_action object inactive.
Once an success_action is inactive, it cannot become active again, and it will not call its exit function upon destruction.
Definition at line 545 of file scope_action.h.