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 |