1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkScopeExit_DEFINED 9 #define SkScopeExit_DEFINED 10 11 #include "SkTypes.h" 12 13 /** 14 * SK_AT_SCOPE_EXIT(stmt) evaluates stmt when the current scope ends. 15 * 16 * E.g. 17 * { 18 * int x = 5; 19 * { 20 * SK_AT_SCOPE_EXIT(x--); 21 * SkASSERT(x == 5); 22 * } 23 * SkASSERT(x == 4); 24 * } 25 */ 26 template <typename Fn> 27 class SkScopeExit { 28 public: SkScopeExit(Fn f)29 SkScopeExit(Fn f) : fFn(std::move(f)) {} ~SkScopeExit()30 ~SkScopeExit() { fFn(); } 31 32 private: 33 Fn fFn; 34 35 SkScopeExit( const SkScopeExit& ) = delete; 36 SkScopeExit& operator=(const SkScopeExit& ) = delete; 37 SkScopeExit( SkScopeExit&&) = delete; 38 SkScopeExit& operator=( SkScopeExit&&) = delete; 39 }; 40 41 template <typename Fn> SkMakeScopeExit(Fn && fn)42inline SkScopeExit<Fn> SkMakeScopeExit(Fn&& fn) { 43 return {std::move(fn)}; 44 } 45 46 #define SK_AT_SCOPE_EXIT(stmt) \ 47 SK_UNUSED auto&& SK_MACRO_APPEND_LINE(at_scope_exit_) = \ 48 SkMakeScopeExit([&]() { stmt; }); 49 50 #endif // SkScopeExit_DEFINED 51