Chromium Code Reviews| Index: src/pdf/SkScoped.h |
| diff --git a/src/pdf/SkScoped.h b/src/pdf/SkScoped.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e76f63e3ce21c40f8221fef80b3584c10e386d06 |
| --- /dev/null |
| +++ b/src/pdf/SkScoped.h |
| @@ -0,0 +1,47 @@ |
| +/* |
| + * 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 SkScoped_DEFINED |
| +#define SkScoped_DEFINED |
| + |
| +/** |
| +* sk_at_scope_end(stmt) evaluates stmt when the current scope ends. |
| +* |
| +* E.g. |
| +* |
| +* int x = 5; |
| +* { |
| +* sk_at_scope_end(x--); |
| +* SkASSERT(x == 5); |
| +* } |
| +* SkASSERT(x == 4); |
| +*/ |
| +template <typename Fn> |
| +class SkScoped { |
|
bungeman-skia
2016/08/26 18:24:42
SkScopeExit
hal.canary
2016/08/26 19:22:37
Done.
|
| +public: |
| + SkScoped(Fn f) : fFn(std::move(f)) {} |
| + ~SkScoped() { fFn(); } |
| + |
| +private: |
| + Fn fFn; |
| + |
| + SkScoped( const SkScoped& ) = delete; |
| + SkScoped& operator=(const SkScoped& ) = delete; |
| + SkScoped( SkScoped&&) = delete; |
| + SkScoped& operator=( SkScoped&&) = delete; |
| +}; |
| + |
| +template <typename Fn> |
| +inline SkScoped<Fn> SkMakeScoped(Fn&& fn) { |
|
bungeman-skia
2016/08/26 18:24:42
SkMakeScopeExit
hal.canary
2016/08/26 19:22:37
Done.
|
| + return {std::move(fn)}; |
| +} |
| + |
| +#define sk_at_scope_end(stmt) \ |
|
bungeman-skia
2016/08/26 18:24:42
SK_AT_SCOPE_EXIT
|
| + SK_UNUSED auto&& SK_MACRO_APPEND_LINE(at_scope_exit_) = \ |
|
bungeman-skia
2016/08/26 18:24:42
You'll also need
https://codereview.chromium.org/
|
| + SkMakeScoped([&]() { stmt; }); |
| + |
| +#endif // SkScoped_DEFINED |