/************************************************************************************ * * * Copyright (c) 2014 - 2018 Axel Menzel * * * * This file is part of RTTR (Run Time Type Reflection) * * License: MIT License * * * * Permission is hereby granted, free of charge, to any person obtaining * * a copy of this software and associated documentation files (the "Software"), * * to deal in the Software without restriction, including without limitation * * the rights to use, copy, modify, merge, publish, distribute, sublicense, * * and/or sell copies of the Software, and to permit persons to whom the * * Software is furnished to do so, subject to the following conditions: * * * * The above copyright notice and this permission notice shall be included in * * all copies or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * * SOFTWARE. * * * *************************************************************************************/ #ifndef RTTR_ENUM_FLAGS_IMPL_H_ #define RTTR_ENUM_FLAGS_IMPL_H_ namespace rttr { namespace detail { /*! * The \ref enum_flag class is a wrapper around integer value. * */ class enum_flag { public: RTTR_CONSTEXPR RTTR_INLINE enum_flag(int value) RTTR_NOEXCEPT : m_value(value) {} RTTR_CONSTEXPR RTTR_INLINE operator int32_t() const RTTR_NOEXCEPT { return m_value; } private: int32_t m_value; }; } // end namespace detail ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags::enum_flags(zero) RTTR_NOEXCEPT : m_value(0) { } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags::enum_flags(Enum enum_value) RTTR_NOEXCEPT : m_value(static_cast(enum_value)) { } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags::enum_flags(detail::enum_flag f) RTTR_NOEXCEPT : m_value(f) { } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& enum_flags::operator&=(int mask) RTTR_NOEXCEPT { m_value &= mask; return *this; } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& enum_flags::operator&=(uint32_t mask) RTTR_NOEXCEPT { m_value &= mask; return *this; } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& enum_flags::operator&=(Enum mask) RTTR_NOEXCEPT { m_value &= static_cast(mask); return *this; } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& enum_flags::operator|=(enum_flags f) RTTR_NOEXCEPT { m_value |= f.m_value; return *this; } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& enum_flags::operator|=(Enum f) RTTR_NOEXCEPT { m_value |= static_cast(f); return *this; } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& enum_flags::operator^=(enum_flags f) RTTR_NOEXCEPT { m_value ^= f.m_value; return *this; } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& enum_flags::operator^=(Enum f) RTTR_NOEXCEPT { m_value ^= static_cast(f); return *this; } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags::operator enum_type() const RTTR_NOEXCEPT { return m_value; } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags enum_flags::operator|(Enum f) const RTTR_NOEXCEPT { return enum_flags(m_value | static_cast(f)); } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags enum_flags::operator|(enum_flags f) const RTTR_NOEXCEPT { return enum_flags(m_value | f.m_value); } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags enum_flags::operator^(Enum f) const RTTR_NOEXCEPT { return enum_flags(m_value ^ static_cast(f)); } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags enum_flags::operator^(enum_flags f) const RTTR_NOEXCEPT { return enum_flags(m_value ^ f.m_value); } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags enum_flags::operator&(Enum f) const RTTR_NOEXCEPT { return enum_flags(m_value & static_cast(f)); } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags enum_flags::operator&(int mask) const RTTR_NOEXCEPT { return enum_flags(m_value & mask); } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags enum_flags::operator&(uint32_t mask) const RTTR_NOEXCEPT { return enum_flags(m_value & mask); } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE enum_flags enum_flags::operator~() const RTTR_NOEXCEPT { return enum_flags(~m_value); } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE bool enum_flags::operator!() const RTTR_NOEXCEPT { return (!m_value); } ///////////////////////////////////////////////////////////////////////////////////////// template RTTR_CONSTEXPR RTTR_INLINE bool enum_flags::test_flag(Enum flag) const RTTR_NOEXCEPT { return ((m_value & static_cast(flag)) == static_cast(flag) && (static_cast(flag) != 0 || m_value == static_cast(flag)) ); } ///////////////////////////////////////////////////////////////////////////////////////// } // end namespace rttr #endif // RTTR_ENUM_FLAGS_IMPL_H_