/src/libjxl/lib/jxl/base/scope_guard.h
Line | Count | Source |
1 | | // Copyright (c) the JPEG XL Project Authors. All rights reserved. |
2 | | // |
3 | | // Use of this source code is governed by a BSD-style |
4 | | // license that can be found in the LICENSE file. |
5 | | |
6 | | #ifndef LIB_JXL_BASE_SCOPE_GUARD_H_ |
7 | | #define LIB_JXL_BASE_SCOPE_GUARD_H_ |
8 | | |
9 | | #include <utility> |
10 | | |
11 | | namespace jxl { |
12 | | |
13 | | template <typename Callback> |
14 | | class ScopeGuard { |
15 | | public: |
16 | | // Discourage unnecessary moves / copies. |
17 | | ScopeGuard(const ScopeGuard &) = delete; |
18 | | ScopeGuard &operator=(const ScopeGuard &) = delete; |
19 | | ScopeGuard &operator=(ScopeGuard &&) = delete; |
20 | | |
21 | | // Pre-C++17 does not guarantee RVO -> require move constructor. |
22 | | ScopeGuard(ScopeGuard &&other) noexcept |
23 | | : callback_(std::move(other.callback_)) { |
24 | | other.armed_ = false; |
25 | | } |
26 | | |
27 | | template <typename CallbackParam> |
28 | | ScopeGuard(CallbackParam &&callback, bool armed) |
29 | 27.1k | : callback_(std::forward<CallbackParam>(callback)), armed_(armed) {} |
30 | | |
31 | 27.1k | ~ScopeGuard() { |
32 | 27.1k | if (armed_) callback_(); |
33 | 27.1k | } |
34 | | |
35 | 25.1k | void Disarm() { armed_ = false; } |
36 | | |
37 | | private: |
38 | | Callback callback_; |
39 | | bool armed_; |
40 | | }; |
41 | | |
42 | | template <typename Callback> |
43 | 27.1k | ScopeGuard<Callback> MakeScopeGuard(Callback &&callback) { |
44 | 27.1k | return ScopeGuard<Callback>{std::forward<Callback>(callback), true}; |
45 | 27.1k | } |
46 | | |
47 | | } // namespace jxl |
48 | | |
49 | | #endif // LIB_JXL_BASE_SCOPE_GUARD_H_ |