Home | History | Annotate | Download | only in core
      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 #include "SkMacros.h"
     13 
     14 #include <functional>
     15 
     16 /** SkScopeExit calls a std:::function<void()> in its destructor. */
     17 class SkScopeExit {
     18 public:
     19     SkScopeExit(std::function<void()> f) : fFn(std::move(f)) {}
     20     SkScopeExit(SkScopeExit&& that) : fFn(std::move(that.fFn)) {}
     21 
     22     ~SkScopeExit() {
     23         if (fFn) {
     24             fFn();
     25         }
     26     }
     27 
     28     void clear() { fFn = {}; }
     29 
     30     SkScopeExit& operator=(SkScopeExit&& that) {
     31         fFn = std::move(that.fFn);
     32         return *this;
     33     }
     34 
     35 private:
     36     std::function<void()> fFn;
     37 
     38     SkScopeExit(           const SkScopeExit& ) = delete;
     39     SkScopeExit& operator=(const SkScopeExit& ) = delete;
     40 };
     41 
     42 /**
     43  * SK_AT_SCOPE_EXIT(stmt) evaluates stmt when the current scope ends.
     44  *
     45  * E.g.
     46  *    {
     47  *        int x = 5;
     48  *        {
     49  *           SK_AT_SCOPE_EXIT(x--);
     50  *           SkASSERT(x == 5);
     51  *        }
     52  *        SkASSERT(x == 4);
     53  *    }
     54  */
     55 #define SK_AT_SCOPE_EXIT(stmt)                              \
     56     SkScopeExit SK_MACRO_APPEND_LINE(at_scope_exit_)([&]() { stmt; })
     57 
     58 #endif  // SkScopeExit_DEFINED
     59