|
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>
Collaboration diagram for wwa::utils::success_action< ExitFunc >: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.