13 #include <type_traits>
17 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
18 #define defineQHash(enumName)\
19 inline size_t qHash(enumName pKey, size_t pSeed)\
21 return ::qHash(static_cast<std::underlying_type_t<enumName>>(pKey), pSeed);\
24 #define defineQHash(enumName)\
25 inline uint qHash(enumName pKey, uint pSeed)\
27 return ::qHash(static_cast<std::underlying_type_t<enumName>>(pKey), pSeed);\
31 #define defineEnumOperators(enumName)\
32 inline QDebug operator<<(QDebug pDbg, enumName pType)\
34 QDebugStateSaver saver(pDbg);\
35 return pDbg.noquote() << Enum<enumName>::getName(pType);\
38 inline QString& operator+=(QString & pStr, enumName pType)\
40 pStr += Enum<enumName>::getName(pType);\
44 inline QString operator+(const QString& pStr, enumName pType)\
46 return pStr + Enum<enumName>::getName(pType);\
49 inline QString operator+(enumName pType, const QString& pStr)\
51 return Enum<enumName>::getName(pType) + pStr;\
54 inline bool operator==(std::underlying_type_t<enumName> pType, enumName pName)\
56 return static_cast<std::underlying_type_t<enumName>>(pName) == pType;\
58 inline bool operator!=(std::underlying_type_t<enumName> pType, enumName pName)\
60 return !(pType == pName);\
65 #define defineTypedEnumType(enumName, enumType, ...)\
70 Q_DISABLE_COPY(Enum##enumName)\
76 enum class enumName : enumType\
84 using enumName = Enum##enumName::enumName;\
85 namespace governikusEnum##enumName\
89 qRegisterMetaType<enumType>(#enumName);\
93 defineEnumOperators(enumName)
96 #define defineEnumType(enumName, ...) defineTypedEnumType(enumName, int, __VA_ARGS__)
99 template<
typename EnumTypeT>
class Enum
101 using EnumBaseTypeT = std::underlying_type_t<EnumTypeT>;
112 return QMetaEnum::fromType<EnumTypeT>();
122 [[nodiscard]]
static QLatin1String
getName(EnumTypeT pType)
124 const auto value =
static_cast<int>(pType);
126 if (Q_UNLIKELY(
name ==
nullptr))
128 qCritical().noquote().nospace() <<
"CRITICAL CONVERSION MISMATCH: UNKNOWN 0x" << QString::number(value, 16);
129 return QLatin1String();
132 return QLatin1String(
name);
142 [[nodiscard]]
static QVector<EnumTypeT>
getList()
144 QVector<EnumTypeT> list;
147 list.reserve(metaEnum.keyCount());
148 for (
int i = 0; i < metaEnum.keyCount(); ++i)
150 list << static_cast<EnumTypeT>(metaEnum.value(i));
157 [[nodiscard]]
static EnumTypeT
fromString(
const char*
const pValue, EnumTypeT pDefault)
163 return static_cast<EnumTypeT
>(key);
169 [[nodiscard]]
static EnumTypeT
fromString(
const QString& pValue, EnumTypeT pDefaultType)
171 return fromString(pValue.toUtf8().constData(), pDefaultType);
181 [[nodiscard]]
static bool isValue(ushort pValue)
183 return isValue(
static_cast<int>(pValue));
187 [[nodiscard]]
static EnumBaseTypeT
getValue(EnumTypeT pType)
189 return static_cast<EnumBaseTypeT
>(pType);
Definition: EnumHelper.h:100
static bool isValue(int pValue)
Definition: EnumHelper.h:175
static QLatin1String getName()
Definition: EnumHelper.h:116
static QLatin1String getName(EnumTypeT pType)
Definition: EnumHelper.h:122
static EnumTypeT fromString(const char *const pValue, EnumTypeT pDefault)
Definition: EnumHelper.h:157
static EnumTypeT fromString(const QString &pValue, EnumTypeT pDefaultType)
Definition: EnumHelper.h:169
static bool isValue(ushort pValue)
Definition: EnumHelper.h:181
static QVector< EnumTypeT > getList()
Definition: EnumHelper.h:142
static int getCount()
Definition: EnumHelper.h:136
static EnumBaseTypeT getValue(EnumTypeT pType)
Definition: EnumHelper.h:187
static QMetaEnum getQtEnumMetaEnum()
Definition: EnumHelper.h:110
const char * name
Definition: http_parser.cpp:473
#define T(v)
Definition: http_parser.cpp:237
A simple template renderer.
Definition: ActivationContext.h:15
QLatin1String getEnumName(T pType)
Definition: EnumHelper.h:196