From aa73023bee1aebc745188e54039d3bf567be97e3 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Thu, 20 Feb 2025 23:47:02 +0100 Subject: Use intrusive list in logging, and add defer --- asl/base/defer.hpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 asl/base/defer.hpp (limited to 'asl/base/defer.hpp') diff --git a/asl/base/defer.hpp b/asl/base/defer.hpp new file mode 100644 index 0000000..b6d52af --- /dev/null +++ b/asl/base/defer.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include "asl/base/utility.hpp" +#include "asl/base/functional.hpp" + +namespace asl +{ + +// @Todo Add invokable check +template +class DeferCallback +{ + Callback m_callback; + bool m_moved = false; + +public: + template + explicit DeferCallback(T&& callback) : m_callback(ASL_FWD(callback)) + { + } + + ASL_DELETE_COPY(DeferCallback); + + DeferCallback(DeferCallback&& other) : + m_callback(ASL_MOVE(other.m_callback)), m_moved(exchange(other.m_moved, true)) + { + } + + DeferCallback& operator=(DeferCallback&&) = delete; + + ~DeferCallback() + { + if (!m_moved) { invoke(m_callback); } + } +}; + +struct DeferFactory +{ + // @Todo Add invokable check + template + DeferCallback operator<<(Callback&& callback) const + { + return DeferCallback(ASL_FWD(callback)); + } +}; + +} // namespace asl + +#define ASL_DEFER auto ASL_CONCAT(_defer_, __COUNTER__) = ::asl::DeferFactory{} << + -- cgit