blob: 76bbb93a257ee15e628007f8509b49b16c909d5f [file] [log] [blame]
Patrick Rohr776c40c2022-01-12 21:05:26 +01001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// -----------------------------------------------------------------------------
18// TODO: figure out a way to use libbase_ndk. This is currently not working
19// because of missing apex availability. For now, we can use a copy of
20// ScopeGuard which is very lean compared to unique_fd. This code has been
21// copied verbatim from:
22// https://cs.android.com/android/platform/superproject/+/master:system/libbase/include/android-base/scopeguard.h
23
24#pragma once
25
26#include <utility> // for std::move, std::forward
27
28namespace android {
29namespace base {
30
31// ScopeGuard ensures that the specified functor is executed no matter how the
32// current scope exits.
33template <typename F> class ScopeGuard {
34public:
35 ScopeGuard(F &&f) : f_(std::forward<F>(f)), active_(true) {}
36
37 ScopeGuard(ScopeGuard &&that) noexcept
38 : f_(std::move(that.f_)), active_(that.active_) {
39 that.active_ = false;
40 }
41
42 template <typename Functor>
43 ScopeGuard(ScopeGuard<Functor> &&that)
44 : f_(std::move(that.f_)), active_(that.active_) {
45 that.active_ = false;
46 }
47
48 ~ScopeGuard() {
49 if (active_)
50 f_();
51 }
52
53 ScopeGuard() = delete;
54 ScopeGuard(const ScopeGuard &) = delete;
55 void operator=(const ScopeGuard &) = delete;
56 void operator=(ScopeGuard &&that) = delete;
57
58 void Disable() { active_ = false; }
59
60 bool active() const { return active_; }
61
62private:
63 template <typename Functor> friend class ScopeGuard;
64
65 F f_;
66 bool active_;
67};
68
69template <typename F> ScopeGuard<F> make_scope_guard(F &&f) {
70 return ScopeGuard<F>(std::forward<F>(f));
71}
72
73} // namespace base
74} // namespace android