wwa-scope-action 1.0.0
Scope guard utilities for managing exit actions in C++
wwa::utils::fail_action< ExitFunc > Class Template Reference

A scope guard that calls its exit function when a scope is exited via an exception. More...

#include <scope_action.h>

+ Collaboration diagram for wwa::utils::fail_action< ExitFunc >:

Public Member Functions

 fail_action (fail_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<fail_action, ExitFunc, Func>)
 fail_action (Func &&fn) noexcept
 Constructs a new fail_action from an exit function of type Func.
 
template<typename Func >
requires (detail::can_construct_from<fail_action, ExitFunc, Func>)
 fail_action (Func &&fn) noexcept(std::is_nothrow_constructible_v< ExitFunc, Func >||std::is_nothrow_constructible_v< ExitFunc, Func & >)
 Constructs a new fail_action from an exit function of type Func.
 
 ~fail_action () noexcept
 Calls the exit function if the scope is exited via an exception and destroys the object.
 
void release () noexcept
 Makes the fail_action object inactive.
 

Detailed Description

template<typename ExitFunc>
class wwa::utils::fail_action< ExitFunc >

A scope guard that calls its exit function when a scope is exited via an exception.

Like exit_action, a fail_action may be active or inactive. A fail_action is active after construction from an exit function.

An fail_action becomes inactive by calling release() or a move constructor. An inactive fail_action may also be obtained by initializing with another inactive fail_action. Once an fail_action is inactive, it cannot become active again.

Usage example:

try {
auto guard = wwa::utils::fail_action{[&exit_status]() { exit_status = true; }};
maybe_throw();
}
catch (...) {
did_throw = true;
}
print_exit_status("fail_action", exit_status, did_throw);
Template Parameters
ExitFuncExit function type. Func is either a Destructible FunctionObject type, or an lvalue reference to a FunctionObject or function.
See also
https://en.cppreference.com/w/cpp/experimental/scope_fail
Note
Constructing a fail_action of dynamic storage duration might lead to unexpected behavior.
Constructing a fail_action from another fail_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.
Examples
scope_action.cpp.

Definition at line 246 of file scope_action.h.

Constructor & Destructor Documentation

◆ fail_action() [1/3]

template<typename ExitFunc >
template<typename Func >
requires (detail::can_construct_from<fail_action, ExitFunc, Func>)
wwa::utils::fail_action< ExitFunc >::fail_action ( Func && fn)
inlineexplicitnoexcept

Constructs a new fail_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 fail_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>, fail_action> is false, and
  • std::is_constructible_v<ExitFunc, Func> is true.
Template Parameters
FuncExit function type. Must be constructible from ExitFunc.
Parameters
fnExit function.
Exceptions
anythingAny exception thrown during the initialization of the stored exit function.
See also
https://en.cppreference.com/w/cpp/experimental/scope_fail/scope_fail

Definition at line 270 of file scope_action.h.

◆ fail_action() [2/3]

template<typename ExitFunc >
template<typename Func >
requires (detail::can_move_construct_from_noexcept<fail_action, ExitFunc, Func>)
wwa::utils::fail_action< ExitFunc >::fail_action ( Func && fn)
inlineexplicitnoexcept

Constructs a new fail_action from an exit function of type Func.

Initializes the exit function with a function or function object fn. The constructed fail_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>, fail_action> is false, and
  • std::is_lvalue_reference_v<Func> is false, and
  • std::is_nothrow_constructible_v<ExitFunc, Func> is true.
Template Parameters
FuncExit function type. Must be constructible from ExitFunc.
Parameters
fnExit function.
See also
https://en.cppreference.com/w/cpp/experimental/scope_fail/scope_fail

Definition at line 303 of file scope_action.h.

◆ fail_action() [3/3]

template<typename ExitFunc >
wwa::utils::fail_action< ExitFunc >::fail_action ( fail_action< ExitFunc > && other)
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 fail_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, or
  • std::is_copy_constructible_v<ExitFunc> is true.
Parameters
otherfail_action to move from.
Exceptions
anythingAny exception thrown during the initialization of the stored exit function.
See also
https://en.cppreference.com/w/cpp/experimental/scope_fail/scope_fail

Definition at line 326 of file scope_action.h.

◆ ~fail_action()

template<typename ExitFunc >
wwa::utils::fail_action< ExitFunc >::~fail_action ( )
inlinenoexcept

Calls the exit function if the scope is exited via an exception and destroys the object.

Calls the exit function if the result of std::uncaught_exceptions() is greater than the counter of uncaught exceptions (typically on stack unwinding) and the fail_action is active; then destroys the object.

See also
https://en.cppreference.com/w/cpp/experimental/scope_fail/%7Escope_fail

Definition at line 358 of file scope_action.h.

Member Function Documentation

◆ release()

template<typename ExitFunc >
void wwa::utils::fail_action< ExitFunc >::release ( )
inlinenoexcept

Makes the fail_action object inactive.

Once an fail_action is inactive, it cannot become active again, and it will not call its exit function upon destruction.

Note
release() may be either manually called or automatically called by fail_action's move constructor.
See also
https://en.cppreference.com/w/cpp/experimental/scope_fail/release

Definition at line 374 of file scope_action.h.


The documentation for this class was generated from the following file: