Chromium Code Reviews| Index: src/pdf/SkScopeExit.h |
| diff --git a/src/pdf/SkScopeExit.h b/src/pdf/SkScopeExit.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a3f518abcb80644f69dcd6909d641711439c72fa |
| --- /dev/null |
| +++ b/src/pdf/SkScopeExit.h |
| @@ -0,0 +1,49 @@ |
| +/* |
| + * 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 "SkTypes.h" |
| + |
| +/** |
| +* sk_at_scope_end(stmt) evaluates stmt when the current scope ends. |
|
bungeman-skia
2016/08/26 19:47:05
SK_AT_SCOPE_EXIT
hal.canary
2016/08/26 19:49:01
Done.
|
| +* |
| +* E.g. |
| +* |
| +* int x = 5; |
| +* { |
| +* SK_AT_SCOPE_EXIT(x--); |
| +* SkASSERT(x == 5); |
| +* } |
| +* SkASSERT(x == 4); |
| +*/ |
| +template <typename Fn> |
| +class SkScopeExit { |
| +public: |
| + SkScopeExit(Fn f) : fFn(std::move(f)) {} |
| + ~SkScopeExit() { fFn(); } |
| + |
| +private: |
| + Fn fFn; |
| + |
| + SkScopeExit( const SkScopeExit& ) = delete; |
| + SkScopeExit& operator=(const SkScopeExit& ) = delete; |
| + SkScopeExit( SkScopeExit&&) = delete; |
| + SkScopeExit& operator=( SkScopeExit&&) = delete; |
| +}; |
| + |
| +template <typename Fn> |
| +inline SkScopeExit<Fn> SkMakeScopeExit(Fn&& fn) { |
| + return {std::move(fn)}; |
| +} |
| + |
| +#define SK_AT_SCOPE_EXIT(stmt) \ |
| + SK_UNUSED auto&& SK_MACRO_APPEND_LINE(at_scope_exit_) = \ |
| + SkMakeScopeExit([&]() { stmt; }); |
| + |
| +#endif // SkScopeExit_DEFINED |