diff options
author | Yuri Kunde Schlesner <yuriks@yuriks.net> | 2014-11-02 20:34:14 +0100 |
---|---|---|
committer | Yuri Kunde Schlesner <yuriks@yuriks.net> | 2014-12-13 04:59:51 +0100 |
commit | 04b1f2936c606313ee28b505ec7cdcb81875cd8d (patch) | |
tree | 2db415f3a63a9ff297a09e29258d1982dc34350d | |
parent | doxygen: Enable EXTRACT_ALL so that Doxygen identifies namespaces (diff) | |
download | yuzu-04b1f2936c606313ee28b505ec7cdcb81875cd8d.tar yuzu-04b1f2936c606313ee28b505ec7cdcb81875cd8d.tar.gz yuzu-04b1f2936c606313ee28b505ec7cdcb81875cd8d.tar.bz2 yuzu-04b1f2936c606313ee28b505ec7cdcb81875cd8d.tar.lz yuzu-04b1f2936c606313ee28b505ec7cdcb81875cd8d.tar.xz yuzu-04b1f2936c606313ee28b505ec7cdcb81875cd8d.tar.zst yuzu-04b1f2936c606313ee28b505ec7cdcb81875cd8d.zip |
-rw-r--r-- | src/common/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/common/scope_exit.h | 37 |
2 files changed, 38 insertions, 0 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 9d5a90762..1dbc5db21 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -51,6 +51,7 @@ set(HEADERS msg_handler.h platform.h scm_rev.h + scope_exit.h string_util.h swap.h symbols.h diff --git a/src/common/scope_exit.h b/src/common/scope_exit.h new file mode 100644 index 000000000..1d3e59319 --- /dev/null +++ b/src/common/scope_exit.h @@ -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) |