Add SCOPE_EXIT macro to conveniently execute cleanup actions
This commit is contained in:
		@@ -51,6 +51,7 @@ set(HEADERS
 | 
			
		||||
            msg_handler.h
 | 
			
		||||
            platform.h
 | 
			
		||||
            scm_rev.h
 | 
			
		||||
            scope_exit.h
 | 
			
		||||
            string_util.h
 | 
			
		||||
            swap.h
 | 
			
		||||
            symbols.h
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								src/common/scope_exit.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/common/scope_exit.h
									
									
									
									
									
										Normal file
									
								
							@@ -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)
 | 
			
		||||
		Reference in New Issue
	
	Block a user