From cec79a3f5578da4a9f9085282389482edf45c81b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Sun, 16 Mar 2025 12:48:45 +0100 Subject: New upstream version 4.26 --- include/libHX/scope.hpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 include/libHX/scope.hpp (limited to 'include/libHX/scope.hpp') diff --git a/include/libHX/scope.hpp b/include/libHX/scope.hpp new file mode 100644 index 0000000..0c0c70d --- /dev/null +++ b/include/libHX/scope.hpp @@ -0,0 +1,35 @@ +#pragma once +#include +#include + +namespace HX { + +/* + * Modeled upon the C++ standards proposal P0052r10 / Library Fundamentals v3. + * Not yet present in GNU stdlibc++ or clang libc++. + */ +template class scope_exit { + private: + F m_func; + bool m_eod = false; + + public: + explicit scope_exit(F &&f) : m_func(std::move(f)), m_eod(true) {} + scope_exit(scope_exit &&o) : m_func(std::move(o.m_func)), m_eod(o.m_eod) { + o.m_eod = false; + } + ~scope_exit() try { + if (m_eod) + m_func(); + } catch (...) { + } + void operator=(scope_exit &&) = delete; + void release() noexcept { m_eod = false; } +}; + +template scope_exit make_scope_exit(F &&f) +{ + return scope_exit(std::move(f)); +} + +} /* namespace */ -- cgit v1.2.3