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:59 +0100
committerJörg Frings-Fürst <debian@jff-webhosting.net>2025-03-16 12:48:59 +0100
commit4b6d7e11c893c7c201ef0a5a43609a12a5235187 (patch)
tree42a3aaef992613eab55c5154ca7d207a4f70ef99 /include/libHX/scope.hpp
parent5acefbd715c8720abc5d8ccd5349e1d9589739df (diff)
parent3aa2b0a6657b0ebd1618ee684f8ae31cd8bf127b (diff)
Merge branch 'feature/upstream' into develop
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 */