123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- #ifndef RTTR_ENUM_FLAGS_H_
- #define RTTR_ENUM_FLAGS_H_
- #include "rttr/detail/base/core_prerequisites.h"
- #include "rttr/detail/misc/std_type_traits.h"
- #include <type_traits>
- #include <cstdint>
- namespace rttr
- {
- namespace detail
- {
- class enum_flag;
- }
- template<typename Enum>
- class enum_flags
- {
- static_assert(sizeof(Enum) <= sizeof(int32_t), "Cannot store enums value with the given type."
- "Please use an enum which fits into an 'int32_t'." );
- public:
- using type = Enum;
- using enum_type = detail::conditional_t<std::is_signed<typename std::underlying_type<Enum>::type>::value,
- int32_t,
- uint32_t>;
- using zero = enum_type*;
-
- RTTR_CONSTEXPR RTTR_INLINE enum_flags(zero = nullptr) RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE enum_flags(Enum flag) RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE enum_flags(detail::enum_flag v) RTTR_NOEXCEPT;
-
-
- RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& operator&=(int mask) RTTR_NOEXCEPT;
-
- RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& operator&=(uint32_t mask) RTTR_NOEXCEPT;
-
- RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& operator&=(Enum mask) RTTR_NOEXCEPT;
-
- RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& operator|=(enum_flags f) RTTR_NOEXCEPT;
-
- RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& operator|=(Enum f) RTTR_NOEXCEPT;
-
- RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& operator^=(enum_flags f) RTTR_NOEXCEPT;
-
- RTTR_CXX14_CONSTEXPR RTTR_INLINE enum_flags& operator^=(Enum f) RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE operator enum_type() const RTTR_NOEXCEPT;
-
-
- RTTR_CONSTEXPR RTTR_INLINE enum_flags operator|(Enum f) const RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE enum_flags operator|(enum_flags f) const RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE enum_flags operator^(Enum f) const RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE enum_flags operator^(enum_flags f) const RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE enum_flags operator&(Enum f) const RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE enum_flags operator&(int mask) const RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE enum_flags operator&(uint32_t mask) const RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE enum_flags operator~() const RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE bool operator!() const RTTR_NOEXCEPT;
-
- RTTR_CONSTEXPR RTTR_INLINE bool test_flag(Enum flag) const RTTR_NOEXCEPT;
- private:
- enum_type m_value;
- };
- namespace detail
- {
- class invalid_enum_flag
- {
- public:
- RTTR_CONSTEXPR RTTR_INLINE explicit invalid_enum_flag(int v){}
- };
- }
- #ifdef DOXYGEN
- #define RTTR_DECLARE_FLAGS(Flags, Enum)
- #define RTTR_DECLARE_ENUM_FLAGS_OPERATORS(Flags)
- #else
- #define RTTR_DECLARE_FLAGS(Flags, Enum) \
- using Flags = rttr::enum_flags<Enum>;
- #define RTTR_DECLARE_ENUM_FLAGS_OPERATORS(Flags) \
- RTTR_CONSTEXPR RTTR_INLINE rttr::enum_flags<Flags::type> operator|(Flags::type lhs, Flags::type rhs) RTTR_NOEXCEPT \
- { \
- return (rttr::enum_flags<Flags::type>(lhs) | rhs); \
- } \
- RTTR_CONSTEXPR RTTR_INLINE rttr::enum_flags<Flags::type> operator|(Flags::type lhs, rttr::enum_flags<Flags::type> rhs) RTTR_NOEXCEPT \
- { \
- return (rhs | lhs); \
- } \
- RTTR_CONSTEXPR RTTR_INLINE rttr::detail::invalid_enum_flag operator|(Flags::type lhs, int rhs) \
- { \
- return rttr::detail::invalid_enum_flag(int(lhs) | rhs); \
- }
- #endif
- }
- #include "rttr/detail/impl/enum_flags_impl.h"
- #endif
|