xref: /aosp_15_r20/external/skia/src/base/SkScopeExit.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2016 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkScopeExit_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkScopeExit_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMacros.h"
12*c8dee2aaSAndroid Build Coastguard Worker 
13*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
14*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
15*c8dee2aaSAndroid Build Coastguard Worker 
16*c8dee2aaSAndroid Build Coastguard Worker /** SkScopeExit calls a std:::function<void()> in its destructor. */
17*c8dee2aaSAndroid Build Coastguard Worker class SkScopeExit {
18*c8dee2aaSAndroid Build Coastguard Worker public:
19*c8dee2aaSAndroid Build Coastguard Worker     SkScopeExit() = default;
SkScopeExit(std::function<void ()> f)20*c8dee2aaSAndroid Build Coastguard Worker     SkScopeExit(std::function<void()> f) : fFn(std::move(f)) {}
SkScopeExit(SkScopeExit && that)21*c8dee2aaSAndroid Build Coastguard Worker     SkScopeExit(SkScopeExit&& that) : fFn(std::move(that.fFn)) {}
22*c8dee2aaSAndroid Build Coastguard Worker 
~SkScopeExit()23*c8dee2aaSAndroid Build Coastguard Worker     ~SkScopeExit() {
24*c8dee2aaSAndroid Build Coastguard Worker         if (fFn) {
25*c8dee2aaSAndroid Build Coastguard Worker             fFn();
26*c8dee2aaSAndroid Build Coastguard Worker         }
27*c8dee2aaSAndroid Build Coastguard Worker     }
28*c8dee2aaSAndroid Build Coastguard Worker 
clear()29*c8dee2aaSAndroid Build Coastguard Worker     void clear() { fFn = {}; }
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker     SkScopeExit& operator=(SkScopeExit&& that) {
32*c8dee2aaSAndroid Build Coastguard Worker         fFn = std::move(that.fFn);
33*c8dee2aaSAndroid Build Coastguard Worker         return *this;
34*c8dee2aaSAndroid Build Coastguard Worker     }
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker private:
37*c8dee2aaSAndroid Build Coastguard Worker     std::function<void()> fFn;
38*c8dee2aaSAndroid Build Coastguard Worker 
39*c8dee2aaSAndroid Build Coastguard Worker     SkScopeExit(           const SkScopeExit& ) = delete;
40*c8dee2aaSAndroid Build Coastguard Worker     SkScopeExit& operator=(const SkScopeExit& ) = delete;
41*c8dee2aaSAndroid Build Coastguard Worker };
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker /**
44*c8dee2aaSAndroid Build Coastguard Worker  * SK_AT_SCOPE_EXIT(stmt) evaluates stmt when the current scope ends.
45*c8dee2aaSAndroid Build Coastguard Worker  *
46*c8dee2aaSAndroid Build Coastguard Worker  * E.g.
47*c8dee2aaSAndroid Build Coastguard Worker  *    {
48*c8dee2aaSAndroid Build Coastguard Worker  *        int x = 5;
49*c8dee2aaSAndroid Build Coastguard Worker  *        {
50*c8dee2aaSAndroid Build Coastguard Worker  *           SK_AT_SCOPE_EXIT(x--);
51*c8dee2aaSAndroid Build Coastguard Worker  *           SkASSERT(x == 5);
52*c8dee2aaSAndroid Build Coastguard Worker  *        }
53*c8dee2aaSAndroid Build Coastguard Worker  *        SkASSERT(x == 4);
54*c8dee2aaSAndroid Build Coastguard Worker  *    }
55*c8dee2aaSAndroid Build Coastguard Worker  */
56*c8dee2aaSAndroid Build Coastguard Worker #define SK_AT_SCOPE_EXIT(stmt)                              \
57*c8dee2aaSAndroid Build Coastguard Worker     SkScopeExit SK_MACRO_APPEND_LINE(at_scope_exit_)([&]() { stmt; })
58*c8dee2aaSAndroid Build Coastguard Worker 
59*c8dee2aaSAndroid Build Coastguard Worker #endif  // SkScopeExit_DEFINED
60