1d590543dSopenharmony_ci/*
2d590543dSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3d590543dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d590543dSopenharmony_ci * you may not use this file except in compliance with the License.
5d590543dSopenharmony_ci * You may obtain a copy of the License at
6d590543dSopenharmony_ci *
7d590543dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8d590543dSopenharmony_ci *
9d590543dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d590543dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d590543dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d590543dSopenharmony_ci * See the License for the specific language governing permissions and
13d590543dSopenharmony_ci * limitations under the License.
14d590543dSopenharmony_ci */
15d590543dSopenharmony_ci
16d590543dSopenharmony_ci#ifndef STATS_COMMON_H
17d590543dSopenharmony_ci#define STATS_COMMON_H
18d590543dSopenharmony_ci
19d590543dSopenharmony_ci#include <cstdint>
20d590543dSopenharmony_ci#include <type_traits>
21d590543dSopenharmony_ci
22d590543dSopenharmony_ci#include "stats_errors.h"
23d590543dSopenharmony_ci#include "stats_log.h"
24d590543dSopenharmony_ci
25d590543dSopenharmony_cinamespace OHOS {
26d590543dSopenharmony_cinamespace PowerMgr {
27d590543dSopenharmony_ci#define STATS_RETURN_IF_WITH_RET(cond, retval) if (cond) { return (retval); }
28d590543dSopenharmony_ci#define STATS_RETURN_IF(cond) if (cond) { return; }
29d590543dSopenharmony_ci#define STATS_RETURN_IF_WITH_LOG(loglabel, cond, loginfo)                                   \
30d590543dSopenharmony_ci    do {                                                                                    \
31d590543dSopenharmony_ci        if (cond) {                                                                         \
32d590543dSopenharmony_ci            STATS_HILOGE(loglabel, ""#loginfo"");                                           \
33d590543dSopenharmony_ci            return;                                                                         \
34d590543dSopenharmony_ci        }                                                                                   \
35d590543dSopenharmony_ci    } while (0)                                                                             \
36d590543dSopenharmony_ci
37d590543dSopenharmony_ci#define STATS_RETURN_IF_READ_PARCEL_FAILED_NO_RET(loglabel, parcel, type, out)                               \
38d590543dSopenharmony_ci    do {                                                                                    \
39d590543dSopenharmony_ci        if (!(parcel).Read##type(out)) {                                                    \
40d590543dSopenharmony_ci            STATS_HILOGE(loglabel, "Read "#out" failed");                                   \
41d590543dSopenharmony_ci            return;                                                                         \
42d590543dSopenharmony_ci        }                                                                                   \
43d590543dSopenharmony_ci    } while (0)                                                                             \
44d590543dSopenharmony_ci
45d590543dSopenharmony_ci#define STATS_RETURN_IF_WRITE_PARCEL_FAILED_NO_RET(loglabel, parcel, type, data)                             \
46d590543dSopenharmony_ci    do {                                                                                    \
47d590543dSopenharmony_ci        if (!(parcel).Write##type(data)) {                                                  \
48d590543dSopenharmony_ci            STATS_HILOGE(loglabel, "Write "#data" failed");                                 \
49d590543dSopenharmony_ci            return;                                                                         \
50d590543dSopenharmony_ci        }                                                                                   \
51d590543dSopenharmony_ci    } while (0)                                                                             \
52d590543dSopenharmony_ci
53d590543dSopenharmony_ci#define STATS_RETURN_IF_READ_PARCEL_FAILED_WITH_RET(loglabel, parcel, type, out, retval)                     \
54d590543dSopenharmony_ci    do {                                                                                    \
55d590543dSopenharmony_ci        if (!(parcel).Read##type(out)) {                                                    \
56d590543dSopenharmony_ci            STATS_HILOGE(loglabel, "Read "#out" failed");                                   \
57d590543dSopenharmony_ci            return (retval);                                                                \
58d590543dSopenharmony_ci        }                                                                                   \
59d590543dSopenharmony_ci    } while (0)                                                                             \
60d590543dSopenharmony_ci
61d590543dSopenharmony_ci#define STATS_RETURN_IF_WRITE_PARCEL_FAILED_WITH_RET(loglabel, parcel, type, data, retval)                   \
62d590543dSopenharmony_ci    do {                                                                                    \
63d590543dSopenharmony_ci        if (!(parcel).Write##type(data)) {                                                  \
64d590543dSopenharmony_ci            STATS_HILOGE(loglabel, "Write "#data" failed");                                 \
65d590543dSopenharmony_ci            return (retval);                                                                \
66d590543dSopenharmony_ci        }                                                                                   \
67d590543dSopenharmony_ci    } while (0)
68d590543dSopenharmony_ci
69d590543dSopenharmony_citemplate<typename E>
70d590543dSopenharmony_ciconstexpr auto StatsToUnderlying(E e) noexcept
71d590543dSopenharmony_ci{
72d590543dSopenharmony_ci    return static_cast<std::underlying_type_t<E>>(e);
73d590543dSopenharmony_ci}
74d590543dSopenharmony_ci} // namespace PowerMgr
75d590543dSopenharmony_ci} // namespace OHOS
76d590543dSopenharmony_ci
77d590543dSopenharmony_ci#endif // STATS_COMMON_H
78