LIPH's C++ Codes
finally.h
Go to the documentation of this file.
1#ifndef LIPH_LANG_FINALLY_H_
2#define LIPH_LANG_FINALLY_H_
3
4#include <utility>
5
6namespace liph {
7
8template <class F>
10public:
11 explicit final_action(const F& ff) noexcept : f{ff} {}
12 explicit final_action(F&& ff) noexcept : f{std::move(ff)} {}
13 ~final_action() noexcept {
14 if (invoke) f();
15 }
16 final_action(final_action&& other) noexcept : f(std::move(other.f)), invoke(std::exchange(other.invoke, false)) {}
17 final_action(const final_action&) = delete;
18 void operator=(const final_action&) = delete;
19 void operator=(final_action&&) = delete;
20
21private:
22 F f;
23 bool invoke = true;
24};
25
26template <class F>
27[[nodiscard]] auto finally(F&& f) noexcept {
28 return final_action<std::decay_t<F>>{std::forward<F>(f)};
29}
30
31} // namespace liph
32
33#endif // LIPH_LANG_FINALLY_H_
Definition: finally.h:9
final_action(F &&ff) noexcept
Definition: finally.h:12
void operator=(const final_action &)=delete
final_action(const F &ff) noexcept
Definition: finally.h:11
void operator=(final_action &&)=delete
~final_action() noexcept
Definition: finally.h:13
final_action(final_action &&other) noexcept
Definition: finally.h:16
final_action(const final_action &)=delete
#define F(x, y, z)
Definition: md5.cpp:34
Definition: algorithm.h:10