LIEF: Library to Instrument Executable Formats Version 1.0.0
Loading...
Searching...
No Matches
enums.hpp
Go to the documentation of this file.
1/* Copyright 2021 - 2026 R. Thomas
2 * Copyright 2021 - 2026 Quarkslab
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#ifndef LIEF_ENUMS_H
17#define LIEF_ENUMS_H
18#include <type_traits>
19
20#define _LIEF_EN(N) class N : size_t
21#define _LIEF_EN_2(N, TYPE) class N : TYPE
22#define _LIEF_EI(X) X
23
24#define ENABLE_BITMASK_OPERATORS(X) \
25 template<> \
26 struct EnableBitMaskOperators<X> { \
27 static const bool bit_mask_enabled = true; \
28 }
29
30template<typename Enum>
32 static const bool bit_mask_enabled = false;
33};
34
35template<typename Enum>
36typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled, Enum>::type
37 operator|(Enum lhs, Enum rhs) {
38 using underlying = typename std::underlying_type<Enum>::type;
39 return static_cast<Enum>(static_cast<underlying>(lhs) |
40 static_cast<underlying>(rhs));
41}
42
43template<typename Enum>
44typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled, Enum>::type
45 operator&(Enum lhs, Enum rhs) {
46 using underlying = typename std::underlying_type<Enum>::type;
47 return static_cast<Enum>(static_cast<underlying>(lhs) &
48 static_cast<underlying>(rhs));
49}
50
51template<typename Enum>
52typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled, Enum>::type
53 operator~(Enum e) {
54 using underlying = typename std::underlying_type<Enum>::type;
55 return static_cast<Enum>(~static_cast<underlying>(e));
56}
57
58template<typename Enum>
59typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled,
60 typename std::add_lvalue_reference<Enum>::type>::type
61 operator|=(Enum& lhs, Enum rhs) {
62 using underlying = typename std::underlying_type<Enum>::type;
63 lhs = static_cast<Enum>(static_cast<underlying>(lhs) |
64 static_cast<underlying>(rhs));
65 return lhs;
66}
67
68template<typename Enum>
69typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled,
70 typename std::add_lvalue_reference<Enum>::type>::type
71 operator&=(Enum& lhs, Enum rhs) {
72 using underlying = typename std::underlying_type<Enum>::type;
73 lhs = static_cast<Enum>(static_cast<underlying>(lhs) &
74 static_cast<underlying>(rhs));
75 return lhs;
76}
77
78template<typename Enum>
79typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled, bool>::type
80 is_true(Enum e) {
81 using underlying = typename std::underlying_type<Enum>::type;
82 return static_cast<underlying>(e) > 0;
83}
84#endif
std::enable_if< EnableBitMaskOperators< Enum >::bit_mask_enabled, bool >::type is_true(Enum e)
Definition enums.hpp:80
std::enable_if< EnableBitMaskOperators< Enum >::bit_mask_enabled, Enum >::type operator|(Enum lhs, Enum rhs)
Definition enums.hpp:37
std::enable_if< EnableBitMaskOperators< Enum >::bit_mask_enabled, Enum >::type operator&(Enum lhs, Enum rhs)
Definition enums.hpp:45
std::enable_if< EnableBitMaskOperators< Enum >::bit_mask_enabled, typenamestd::add_lvalue_reference< Enum >::type >::type operator&=(Enum &lhs, Enum rhs)
Definition enums.hpp:71
std::enable_if< EnableBitMaskOperators< Enum >::bit_mask_enabled, typenamestd::add_lvalue_reference< Enum >::type >::type operator|=(Enum &lhs, Enum rhs)
Definition enums.hpp:61
std::enable_if< EnableBitMaskOperators< Enum >::bit_mask_enabled, Enum >::type operator~(Enum e)
Definition enums.hpp:53
Definition enums.hpp:31
static const bool bit_mask_enabled
Definition enums.hpp:32