1fb299fa2Sopenharmony_ci/*
2fb299fa2Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at
6fb299fa2Sopenharmony_ci *
7fb299fa2Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb299fa2Sopenharmony_ci *
9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and
13fb299fa2Sopenharmony_ci * limitations under the License.
14fb299fa2Sopenharmony_ci */
15fb299fa2Sopenharmony_ci
16fb299fa2Sopenharmony_ci#ifndef SCOPE_GUARD_H
17fb299fa2Sopenharmony_ci#define SCOPE_GUARD_H
18fb299fa2Sopenharmony_ci
19fb299fa2Sopenharmony_cinamespace Updater {
20fb299fa2Sopenharmony_ci/*
21fb299fa2Sopenharmony_ci * The RAII feature is used to implement scope exit protection so that resources
22fb299fa2Sopenharmony_ci * can be released and the closure action can be performed in a unified manner when
23fb299fa2Sopenharmony_ci * the scope exits.
24fb299fa2Sopenharmony_ci */
25fb299fa2Sopenharmony_cinamespace Detail {
26fb299fa2Sopenharmony_citemplate<typename ExitAction> class ScopeGuard {
27fb299fa2Sopenharmony_cipublic:
28fb299fa2Sopenharmony_ci    ScopeGuard(ExitAction &&action) : action_(action), enable_(true) {}
29fb299fa2Sopenharmony_ci    ~ScopeGuard()
30fb299fa2Sopenharmony_ci    {
31fb299fa2Sopenharmony_ci        if (enable_) {
32fb299fa2Sopenharmony_ci            action_();
33fb299fa2Sopenharmony_ci        }
34fb299fa2Sopenharmony_ci    }
35fb299fa2Sopenharmony_ci
36fb299fa2Sopenharmony_ci    void Disable()
37fb299fa2Sopenharmony_ci    {
38fb299fa2Sopenharmony_ci        enable_ = false;
39fb299fa2Sopenharmony_ci    }
40fb299fa2Sopenharmony_ci
41fb299fa2Sopenharmony_ciprivate:
42fb299fa2Sopenharmony_ci    ExitAction action_;
43fb299fa2Sopenharmony_ci    bool enable_;
44fb299fa2Sopenharmony_ci};
45fb299fa2Sopenharmony_ci
46fb299fa2Sopenharmony_cistruct ScopeExitGuardHelper {};
47fb299fa2Sopenharmony_citemplate<typename ExitAction>
48fb299fa2Sopenharmony_cistatic inline ScopeGuard<ExitAction> operator + (ScopeExitGuardHelper, ExitAction &&action)
49fb299fa2Sopenharmony_ci{
50fb299fa2Sopenharmony_ci    return ScopeGuard<ExitAction>(std::forward<ExitAction>(action));
51fb299fa2Sopenharmony_ci}
52fb299fa2Sopenharmony_ci}
53fb299fa2Sopenharmony_ci
54fb299fa2Sopenharmony_ci#define ON_SCOPE_EXIT(id) auto onScopeExitGuard##id = Detail::ScopeExitGuardHelper {} + [ & ]
55fb299fa2Sopenharmony_ci
56fb299fa2Sopenharmony_ci#define CANCEL_SCOPE_EXIT_GUARD(id) onScopeExitGuard##id.Disable()
57fb299fa2Sopenharmony_ci}
58fb299fa2Sopenharmony_ci#endif
59