mirror of
https://git.suyu.dev/suyu/suyu
synced 2024-12-24 18:32:49 -06:00
ef24e72b26
Involves making asserts use printf instead of the log functions (log functions are asynchronous and, as such, the log won't be printed in time) As such, the log type argument was removed (printf obviously can't use it, and it's made obsolete by the file and line printing) Also removed some GEKKO cruft.
40 lines
1 KiB
C++
40 lines
1 KiB
C++
// Copyright 2014 Citra Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include "common/common_funcs.h"
|
|
#include <utility>
|
|
|
|
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 CONCAT2(scope_exit_helper_, __LINE__) = detail::ScopeExit([&]() body)
|