summaryrefslogtreecommitdiff
path: root/include/libHX/scope.hpp
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2025-03-16 12:48:45 +0100
committerJörg Frings-Fürst <debian@jff-webhosting.net>2025-03-16 12:48:45 +0100
commitcec79a3f5578da4a9f9085282389482edf45c81b (patch)
tree5c45f5efee77f9f8d84c3a1c7e02b12b6725a2e3 /include/libHX/scope.hpp
parent677e5b0b948fe62d8017c198c57049275f6fe61a (diff)
New upstream version 4.26upstream/4.26upstream
Diffstat (limited to 'include/libHX/scope.hpp')
-rw-r--r--include/libHX/scope.hpp35
1 files changed, 35 insertions, 0 deletions
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 <exception>
+#include <utility>
+
+namespace HX {
+
+/*
+ * Modeled upon the C++ standards proposal P0052r10 / Library Fundamentals v3.
+ * Not yet present in GNU stdlibc++ or clang libc++.
+ */
+template<typename F> 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<typename F> scope_exit<F> make_scope_exit(F &&f)
+{
+ return scope_exit<F>(std::move(f));
+}
+
+} /* namespace */