.. _program_listing_file__tmp_ws_src_sick_safetyscanners_base_include_sick_safetyscanners_base_experimental_enumflags.h: Program Listing for File enumflags.h ==================================== |exhale_lsh| :ref:`Return to documentation for file ` (``/tmp/ws/src/sick_safetyscanners_base/include/sick_safetyscanners_base/experimental/enumflags.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp // this is for emacs file handling -*- mode: c++; indent-tabs-mode: nil -*- // -- BEGIN LICENSE BLOCK ---------------------------------------------- // -- END LICENSE BLOCK ------------------------------------------------ //---------------------------------------------------------------------- //---------------------------------------------------------------------- #ifndef SICK_SAFETYSCANNERS_BASE_ENUMFLAGS_H #define SICK_SAFETYSCANNERS_BASE_ENUMFLAGS_H #include #include #include #define ENABLE_BITMASK_OPERATORS(x) \ namespace sick { \ template <> \ struct is_bitmask_enum \ { \ static const bool enable = true; \ }; \ } // namespace sick namespace sick { // Strongly typed BitFlag operator overloads template struct is_bitmask_enum { static const bool enable = false; }; template constexpr typename std::enable_if::enable, Enum>::type operator|(Enum const& lhs, Enum const& rhs) { using underlying_t = typename std::underlying_type::type; return static_cast(static_cast(lhs) | static_cast(rhs)); } template constexpr typename std::enable_if::enable, Enum>::type operator&(Enum const& lhs, Enum const& rhs) { using underlying_t = typename std::underlying_type::type; return static_cast(static_cast(lhs) & static_cast(rhs)); } template constexpr typename std::enable_if::enable, Enum>::type operator^(Enum const& lhs, Enum const& rhs) { using underlying_t = typename std::underlying_type::type; return static_cast(static_cast(lhs) ^ static_cast(rhs)); } template constexpr typename std::enable_if::enable, Enum>::type operator~(Enum const& rhs) { using underlying_t = typename std::underlying_type::type; return static_cast(~static_cast(rhs)); } template constexpr typename std::enable_if::enable, Enum>::type& operator|=(Enum& lhs, Enum rhs) { using underlying_t = typename std::underlying_type::type; lhs = static_cast(static_cast(lhs) | static_cast(rhs)); return lhs; } template constexpr typename std::enable_if::enable, Enum>::type& operator&=(Enum& lhs, Enum rhs) { using underlying_t = typename std::underlying_type::type; lhs = static_cast(static_cast(lhs) & static_cast(rhs)); return lhs; } template constexpr typename std::enable_if::enable, Enum>::type& operator^=(Enum& lhs, Enum rhs) { using underlying_t = typename std::underlying_type::type; lhs = static_cast(static_cast(lhs) ^ static_cast(rhs)); return lhs; } } // namespace sick #endif // SICK_SAFETYSCANNERS_BASE_ENUMFLAGS_H