diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2025-03-16 12:48:59 +0100 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2025-03-16 12:48:59 +0100 | 
| commit | 4b6d7e11c893c7c201ef0a5a43609a12a5235187 (patch) | |
| tree | 42a3aaef992613eab55c5154ca7d207a4f70ef99 /include/libHX/scope.hpp | |
| parent | 5acefbd715c8720abc5d8ccd5349e1d9589739df (diff) | |
| parent | 3aa2b0a6657b0ebd1618ee684f8ae31cd8bf127b (diff) | |
Merge branch 'feature/upstream' into develop
Diffstat (limited to 'include/libHX/scope.hpp')
| -rw-r--r-- | include/libHX/scope.hpp | 35 | 
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 */ | 
