28 #ifndef RTTR_ENUM_FLAGS_H_
29 #define RTTR_ENUM_FLAGS_H_
31 #include "rttr/detail/base/core_prerequisites.h"
32 #include "rttr/detail/misc/std_type_traits.h"
34 #include <type_traits>
85 template<
typename Enum>
88 static_assert(
sizeof(Enum) <=
sizeof(int32_t),
"Cannot store enums value with the given type."
89 "Please use an enum which fits into an 'int32_t'." );
92 using enum_type = detail::conditional_t<std::is_signed<typename std::underlying_type<Enum>::type>
::value,
100 RTTR_CONSTEXPR RTTR_INLINE
enum_flags(
zero =
nullptr) RTTR_NOEXCEPT;
105 RTTR_CONSTEXPR RTTR_INLINE
enum_flags(Enum flag) RTTR_NOEXCEPT;
113 RTTR_CONSTEXPR RTTR_INLINE
enum_flags(detail::enum_flag v) RTTR_NOEXCEPT;
123 RTTR_CXX14_CONSTEXPR RTTR_INLINE
enum_flags& operator&=(
int mask) RTTR_NOEXCEPT;
131 RTTR_CXX14_CONSTEXPR RTTR_INLINE
enum_flags& operator&=(uint32_t mask) RTTR_NOEXCEPT;
139 RTTR_CXX14_CONSTEXPR RTTR_INLINE
enum_flags& operator&=(Enum mask) RTTR_NOEXCEPT;
155 RTTR_CXX14_CONSTEXPR RTTR_INLINE
enum_flags& operator|=(Enum f) RTTR_NOEXCEPT;
171 RTTR_CXX14_CONSTEXPR RTTR_INLINE
enum_flags& operator^=(Enum f) RTTR_NOEXCEPT;
179 RTTR_CONSTEXPR RTTR_INLINE operator
enum_type() const RTTR_NOEXCEPT;
189 RTTR_CONSTEXPR RTTR_INLINE
enum_flags operator|(Enum f) const RTTR_NOEXCEPT;
206 RTTR_CONSTEXPR RTTR_INLINE
enum_flags operator^(Enum f) const RTTR_NOEXCEPT;
222 RTTR_CONSTEXPR RTTR_INLINE
enum_flags operator&(Enum f) const RTTR_NOEXCEPT;
231 RTTR_CONSTEXPR RTTR_INLINE
enum_flags operator&(
int mask) const RTTR_NOEXCEPT;
239 RTTR_CONSTEXPR RTTR_INLINE
enum_flags operator&(uint32_t mask) const RTTR_NOEXCEPT;
247 RTTR_CONSTEXPR RTTR_INLINE
enum_flags operator~() const RTTR_NOEXCEPT;
254 RTTR_CONSTEXPR RTTR_INLINE
bool operator!() const RTTR_NOEXCEPT;
261 RTTR_CONSTEXPR RTTR_INLINE
bool test_flag(Enum flag) const RTTR_NOEXCEPT;
274 class invalid_enum_flag
277 RTTR_CONSTEXPR RTTR_INLINE
explicit invalid_enum_flag(
int v){}
294 #define RTTR_DECLARE_FLAGS(Flags, Enum)
301 #define RTTR_DECLARE_ENUM_FLAGS_OPERATORS(Flags)
305 #define RTTR_DECLARE_FLAGS(Flags, Enum) \
306 using Flags = rttr::enum_flags<Enum>;
308 #define RTTR_DECLARE_ENUM_FLAGS_OPERATORS(Flags) \
309 RTTR_CONSTEXPR RTTR_INLINE rttr::enum_flags<Flags::type> operator|(Flags::type lhs, Flags::type rhs) RTTR_NOEXCEPT \
311 return (rttr::enum_flags<Flags::type>(lhs) | rhs); \
313 RTTR_CONSTEXPR RTTR_INLINE rttr::enum_flags<Flags::type> operator|(Flags::type lhs, rttr::enum_flags<Flags::type> rhs) RTTR_NOEXCEPT \
315 return (rhs | lhs); \
317 RTTR_CONSTEXPR RTTR_INLINE rttr::detail::invalid_enum_flag operator|(Flags::type lhs, int rhs) \
319 return rttr::detail::invalid_enum_flag(int(lhs) | rhs); \
326 #include "rttr/detail/impl/enum_flags_impl.h"
328 #endif // RTTR_ENUM_FLAGS_H_
Definition: access_levels.h:33
constexpr bool test_flag(Enum flag) const noexcept
This will test whether the given flag flag was set.
detail::enum_data< Enum_Type > value(string_view, Enum_Type value)
The value function should be used to add a mapping from enum name to value during the registration pr...
Enum type
Definition: enum_flags.h:91
enum_type * zero
Definition: enum_flags.h:95
constexpr enum_flags(zero=nullptr) noexcept
Creates an enum_flags object with no flags set.
The enum_flags class template is used to store OR-combinations of enum values in a type-safe way...
Definition: enum_flags.h:86
detail::conditional_t< std::is_signed< typename std::underlying_type< Enum >::type >::value, int32_t, uint32_t > enum_type
Definition: enum_flags.h:94