• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ES2PANDA_UTIL_INCLUDE_ENUM_BITOPS_H
17 #define ES2PANDA_UTIL_INCLUDE_ENUM_BITOPS_H
18 
19 #include <type_traits>
20 
21 #define DEFINE_BITOPS(T)                                                          \
22     inline T operator~(T a)                                                       \
23     {                                                                             \
24         using utype = std::underlying_type_t<T>;                                  \
25         /* NOLINTNEXTLINE(hicpp-signed-bitwise) */                                \
26         return static_cast<T>(~static_cast<utype>(a));                            \
27     }                                                                             \
28                                                                                   \
29     inline bool operator!(T a)                                                    \
30     {                                                                             \
31         using utype = std::underlying_type_t<T>;                                  \
32         /* NOLINTNEXTLINE(hicpp-signed-bitwise) */                                \
33         return (!static_cast<utype>(a));                                          \
34     }                                                                             \
35                                                                                   \
36     inline T operator|(T a, T b)                                                  \
37     {                                                                             \
38         using utype = std::underlying_type_t<T>;                                  \
39         /* NOLINTNEXTLINE(hicpp-signed-bitwise) */                                \
40         return static_cast<T>(static_cast<utype>(a) | static_cast<utype>(b));     \
41     }                                                                             \
42                                                                                   \
43     inline std::underlying_type_t<T> operator&(T a, T b)                          \
44     {                                                                             \
45         using utype = std::underlying_type_t<T>;                                  \
46         /* NOLINTNEXTLINE(hicpp-signed-bitwise) */                                \
47         return static_cast<utype>(static_cast<utype>(a) & static_cast<utype>(b)); \
48     }                                                                             \
49                                                                                   \
50     inline T operator^(T a, T b)                                                  \
51     {                                                                             \
52         using utype = std::underlying_type_t<T>;                                  \
53         /* NOLINTNEXTLINE(hicpp-signed-bitwise) */                                \
54         return static_cast<T>(static_cast<utype>(a) ^ static_cast<utype>(b));     \
55     }                                                                             \
56                                                                                   \
57     inline T &operator|=(T &a, T b)                                               \
58     {                                                                             \
59         /* NOLINTNEXTLINE(hicpp-signed-bitwise) */                                \
60         return a = a | b;                                                         \
61     }                                                                             \
62                                                                                   \
63     inline T &operator&=(T &a, T b)                                               \
64     {                                                                             \
65         using utype = std::underlying_type_t<T>;                                  \
66         /* NOLINTNEXTLINE(hicpp-signed-bitwise) */                                \
67         return a = static_cast<T>(static_cast<utype>(a) & static_cast<utype>(b)); \
68     }                                                                             \
69                                                                                   \
70     inline T &operator^=(T &a, T b)                                               \
71     {                                                                             \
72         /* NOLINTNEXTLINE(hicpp-signed-bitwise) */                                \
73         return a = a ^ b;                                                         \
74     }
75 
76 #endif
77