From b6d33b8c299b47d877c89af675b15b318e33eb9f Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Sat, 4 Apr 2020 01:20:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=80=D0=BE=D1=81,=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D1=8E=D1=89=D0=B8=D0=B9=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D1=8F=D1=82=D1=8C=20=D0=B1=D0=B8=D1=82=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B2=20enum=20class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/myx/base/CMakeLists.txt | 1 + src/myx/base/enum_bitmask_operations.hpp | 58 ++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/myx/base/enum_bitmask_operations.hpp diff --git a/src/myx/base/CMakeLists.txt b/src/myx/base/CMakeLists.txt index 7e857f8..2fa7acd 100644 --- a/src/myx/base/CMakeLists.txt +++ b/src/myx/base/CMakeLists.txt @@ -9,6 +9,7 @@ set(current_target_sources set(current_target_headers ${CMAKE_CURRENT_SOURCE_DIR}/config.hpp ${CMAKE_CURRENT_SOURCE_DIR}/limits.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/enum_bitmask_operations.hpp ) add_common_library(TARGET ${current_target} OUTPUT_NAME myx-${current_target} diff --git a/src/myx/base/enum_bitmask_operations.hpp b/src/myx/base/enum_bitmask_operations.hpp new file mode 100644 index 0000000..a93094d --- /dev/null +++ b/src/myx/base/enum_bitmask_operations.hpp @@ -0,0 +1,58 @@ +#ifndef MYX_BASE_ENUM_BITWISE_OPERATIONS_HPP_ +#define MYX_BASE_ENUM_BITWISE_OPERATIONS_HPP_ + + +#pragma once + +#include + +namespace myx { + +namespace base { + +template< typename Enum > +struct EnableBitMaskOperators +{ + static const bool enable = false; +}; + +template< typename Enum > +typename std::enable_if< EnableBitMaskOperators< Enum >::enable, Enum >::type +operator |( Enum lhs, Enum rhs ) +{ + using underlying = typename std::underlying_type< Enum >::type; + return( static_cast< Enum >( + static_cast< underlying >( lhs ) | + static_cast< underlying >( rhs ) + ) ); +} + +} // namespace base + +} // namespace myx + +/** + * @brief Макрос, предоставляющий возможность выполнять битовые операции в enum class + * + * Источник: http://blog.bitwigglers.org/using-enum-classes-as-type-safe-bitmasks/ + * Пример использования: + * + * namespace ns { + * enum class Permissions + * { + * Readable = 0x4, + * Writeable = 0x2, + * Executable = 0x1 + * }; + * } + * ENABLE_BITMASK_OPERATORS(ns::Permissions) + */ + +#define ENABLE_BITMASK_OPERATORS( x ) \ + template<> \ + struct myx::base::EnableBitMaskOperators< x > \ + { \ + static const bool enable = true; \ + }; + +#endif // ifndef MYX_BASE_ENUM_BITWISE_OPERATIONS_HPP_