/* Copyright 2021 R. Thomas * Copyright 2021 Quarkslab * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef LIEF_ENUMS_H_ #define LIEF_ENUMS_H_ #include #define _LIEF_EN(N) class N : size_t #define _LIEF_EN_2(N, TYPE) class N : TYPE #define _LIEF_EI(X) X #define ENABLE_BITMASK_OPERATORS(X) \ template<> \ struct EnableBitMaskOperators \ { \ static const bool bit_mask_enabled = true; \ }; template struct EnableBitMaskOperators { static const bool bit_mask_enabled = false; }; template typename std::enable_if::bit_mask_enabled, Enum>::type operator |(Enum lhs, Enum rhs) { using underlying = typename std::underlying_type::type; return static_cast ( static_cast(lhs) | static_cast(rhs) ); } template typename std::enable_if::bit_mask_enabled, Enum>::type operator &(Enum lhs, Enum rhs) { using underlying = typename std::underlying_type::type; return static_cast ( static_cast(lhs) & static_cast(rhs) ); } template typename std::enable_if::bit_mask_enabled, Enum>::type operator ~(Enum e) { using underlying = typename std::underlying_type::type; return static_cast(~static_cast(e)); } template typename std::enable_if::bit_mask_enabled, typename std::add_lvalue_reference::type>::type operator |=(Enum& lhs, Enum rhs) { using underlying = typename std::underlying_type::type; lhs = static_cast(static_cast(lhs) | static_cast(rhs)); return lhs; } template typename std::enable_if::bit_mask_enabled, typename std::add_lvalue_reference::type>::type operator &=(Enum& lhs, Enum rhs) { using underlying = typename std::underlying_type::type; lhs = static_cast(static_cast(lhs) & static_cast(rhs)); return lhs; } template typename std::enable_if::bit_mask_enabled, bool>::type is_true(Enum e) { using underlying = typename std::underlying_type::type; return static_cast(e) > 0; } #endif