Line data Source code
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:
29 0 : SkScopeExit(Fn f) : fFn(std::move(f)) {}
30 0 : ~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>
42 0 : inline SkScopeExit<Fn> SkMakeScopeExit(Fn&& fn) {
43 0 : 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
|