22 #include <unordered_map>
31 static constexpr
int Null = -1;
42 QString keyToString(
int value)
const;
46 int stringToKey(
const QString &
name)
const;
53 #define TTK_SUPER_ENUM(Type, ...) \
54 static const TTKSuperEnum Type ## EnumObject(#__VA_ARGS__); \
55 class TTK_MODULE_EXPORT Type { \
57 enum { kNull = TTKSuperEnum::Null, __VA_ARGS__ }; \
59 Type() : m_data(Type::kNull) {} \
60 Type(const Type &v) : m_data(v.m_data) {} \
61 Type(int v) : m_data(v) {} \
62 Type(const QString &v) : m_data(Type ## EnumObject.stringToKey(v)) {} \
63 QString toString() const { return Type ## EnumObject.keyToString(m_data); } \
64 int toInt() const { return m_data; } \
65 operator int () const { return m_data; } \
66 operator QString () const { return toString(); } \
67 Type& operator =(int v) { m_data = v; return *this; } \
68 Type& operator =(const Type &v) { m_data = v.m_data; return *this; } \
69 Type& operator =(const QString &v) { m_data = Type ## EnumObject.stringToKey(v); return *this; } \
74 #define TTK_ENUM_TYPE(Enum) std::underlying_type<Enum>::type
75 #define TTK_DECLARE_OPERATORS_FOR_ENUM(Enum) \
76 inline constexpr Enum operator~(const Enum lhs) { return TTKStaticCast(Enum, ~TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs)); } \
77 inline constexpr Enum operator!(const Enum lhs) { return TTKStaticCast(Enum, !TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs)); } \
78 inline constexpr bool operator>(const Enum lhs, const Enum rhs) { return TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs) > TTKStaticCast(TTK_ENUM_TYPE(Enum), rhs); } \
79 inline constexpr bool operator<(const Enum lhs, const Enum rhs) { return TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs) < TTKStaticCast(TTK_ENUM_TYPE(Enum), rhs); } \
80 inline constexpr bool operator>=(const Enum lhs, const Enum rhs) { return TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs) >= TTKStaticCast(TTK_ENUM_TYPE(Enum), rhs); } \
81 inline constexpr bool operator<=(const Enum lhs, const Enum rhs) { return TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs) <= TTKStaticCast(TTK_ENUM_TYPE(Enum), rhs); } \
82 inline constexpr bool operator==(const Enum lhs, const Enum rhs) { return TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs) == TTKStaticCast(TTK_ENUM_TYPE(Enum), rhs); } \
83 inline constexpr bool operator!=(const Enum lhs, const Enum rhs) { return TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs) != TTKStaticCast(TTK_ENUM_TYPE(Enum), rhs); } \
84 inline constexpr Enum operator&(const Enum lhs, const Enum rhs) { return TTKStaticCast(Enum, TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs) & TTKStaticCast(TTK_ENUM_TYPE(Enum), rhs)); } \
85 inline constexpr Enum operator|(const Enum lhs, const Enum rhs) { return TTKStaticCast(Enum, TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs) | TTKStaticCast(TTK_ENUM_TYPE(Enum), rhs)); } \
86 inline constexpr Enum operator^(const Enum lhs, const Enum rhs) { return TTKStaticCast(Enum, TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs) ^ TTKStaticCast(TTK_ENUM_TYPE(Enum), rhs)); } \
87 inline constexpr bool operator||(const Enum lhs, const Enum rhs) { return TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs) || TTKStaticCast(TTK_ENUM_TYPE(Enum), rhs); } \
88 inline constexpr bool operator&&(const Enum lhs, const Enum rhs) { return TTKStaticCast(TTK_ENUM_TYPE(Enum), lhs) && TTKStaticCast(TTK_ENUM_TYPE(Enum), rhs); } \
89 inline const Enum& operator|=(Enum& lhs, const Enum rhs) { return lhs = (lhs | rhs); } \
90 inline const Enum& operator&=(Enum& lhs, const Enum rhs) { return lhs = (lhs & rhs); } \
91 inline const Enum& operator^=(Enum& lhs, const Enum rhs) { return lhs = (lhs ^ rhs); }
93 #endif // TTKSUPERENUM_H
#define TTK_MODULE_EXPORT
The class of the super enum.
std::unordered_map< int, QString > m_enumValue