1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- /*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #ifndef SkScopeExit_DEFINED
- #define SkScopeExit_DEFINED
- #include "include/core/SkTypes.h"
- #include "include/private/SkMacros.h"
- #include <functional>
- /** SkScopeExit calls a std:::function<void()> in its destructor. */
- class SkScopeExit {
- public:
- SkScopeExit() = default;
- SkScopeExit(std::function<void()> f) : fFn(std::move(f)) {}
- SkScopeExit(SkScopeExit&& that) : fFn(std::move(that.fFn)) {}
- ~SkScopeExit() {
- if (fFn) {
- fFn();
- }
- }
- void clear() { fFn = {}; }
- SkScopeExit& operator=(SkScopeExit&& that) {
- fFn = std::move(that.fFn);
- return *this;
- }
- private:
- std::function<void()> fFn;
- SkScopeExit( const SkScopeExit& ) = delete;
- SkScopeExit& operator=(const SkScopeExit& ) = delete;
- };
- /**
- * SK_AT_SCOPE_EXIT(stmt) evaluates stmt when the current scope ends.
- *
- * E.g.
- * {
- * int x = 5;
- * {
- * SK_AT_SCOPE_EXIT(x--);
- * SkASSERT(x == 5);
- * }
- * SkASSERT(x == 4);
- * }
- */
- #define SK_AT_SCOPE_EXIT(stmt) \
- SkScopeExit SK_MACRO_APPEND_LINE(at_scope_exit_)([&]() { stmt; })
- #endif // SkScopeExit_DEFINED
|