Index: src/pdf/SkScopeExit.h |
diff --git a/src/pdf/SkScopeExit.h b/src/pdf/SkScopeExit.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5b7bcdc07686cb334417659cb0d312dcf36a9c53 |
--- /dev/null |
+++ b/src/pdf/SkScopeExit.h |
@@ -0,0 +1,50 @@ |
+/* |
+ * 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_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); |
+ * } |
+ */ |
+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 |