mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Add SCOPE_EXIT macro to conveniently execute cleanup actions
This commit is contained in:
		
							parent
							
								
									ed0221552a
								
							
						
					
					
						commit
						04b1f2936c
					
				
					 2 changed files with 38 additions and 0 deletions
				
			
		|  | @ -51,6 +51,7 @@ set(HEADERS | ||||||
|             msg_handler.h |             msg_handler.h | ||||||
|             platform.h |             platform.h | ||||||
|             scm_rev.h |             scm_rev.h | ||||||
|  |             scope_exit.h | ||||||
|             string_util.h |             string_util.h | ||||||
|             swap.h |             swap.h | ||||||
|             symbols.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) | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue