|
|
@@ -0,0 +1,37 @@
|
|
|
+// Copyright 2014 Citra Emulator Project
|
|
|
+// Licensed under GPLv2+
|
|
|
+// Refer to the license.txt file included.
|
|
|
+
|
|
|
+#pragma once
|
|
|
+
|
|
|
+namespace detail {
|
|
|
+ template <typename Func>
|
|
|
+ struct ScopeExitHelper {
|
|
|
+ explicit ScopeExitHelper(Func&& func) : func(std::move(func)) {}
|
|
|
+ ~ScopeExitHelper() { func(); }
|
|
|
+
|
|
|
+ Func func;
|
|
|
+ };
|
|
|
+
|
|
|
+ template <typename Func>
|
|
|
+ ScopeExitHelper<Func> ScopeExit(Func&& func) { return ScopeExitHelper<Func>(std::move(func)); }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * This macro allows you to conveniently specify a block of code that will run on scope exit. Handy
|
|
|
+ * for doing ad-hoc clean-up tasks in a function with multiple returns.
|
|
|
+ *
|
|
|
+ * Example usage:
|
|
|
+ * \code
|
|
|
+ * const int saved_val = g_foo;
|
|
|
+ * g_foo = 55;
|
|
|
+ * SCOPE_EXIT({ g_foo = saved_val; });
|
|
|
+ *
|
|
|
+ * if (Bar()) {
|
|
|
+ * return 0;
|
|
|
+ * } else {
|
|
|
+ * return 20;
|
|
|
+ * }
|
|
|
+ * \endcode
|
|
|
+ */
|
|
|
+#define SCOPE_EXIT(body) auto scope_exit_helper_##__LINE__ = detail::ScopeExit([&]() body)
|