AusweisApp2
Lade ...
Suche ...
Keine Treffer
EnumHelper.h
gehe zur Dokumentation dieser Datei
1
7#pragma once
8
9#include "Initializer.h"
10
11#include <QDebug>
12#include <QMetaEnum>
13#include <type_traits>
14
15namespace governikus
16{
17#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
18 #define defineQHash(enumName)\
19 inline size_t qHash(enumName pKey, size_t pSeed)\
20 {\
21 return ::qHash(static_cast<std::underlying_type_t<enumName>>(pKey), pSeed);\
22 }
23#else
24 #define defineQHash(enumName)\
25 inline uint qHash(enumName pKey, uint pSeed)\
26 {\
27 return ::qHash(static_cast<std::underlying_type_t<enumName>>(pKey), pSeed);\
28 }
29#endif
30
31#define defineEnumOperators(enumName)\
32 inline QDebug operator<<(QDebug pDbg, enumName pType)\
33 {\
34 QDebugStateSaver saver(pDbg);\
35 return pDbg.noquote() << Enum<enumName>::getName(pType);\
36 }\
37\
38 inline QString& operator+=(QString & pStr, enumName pType)\
39 {\
40 pStr += Enum<enumName>::getName(pType);\
41 return pStr;\
42 }\
43\
44 inline QString operator+(const QString& pStr, enumName pType)\
45 {\
46 return pStr + Enum<enumName>::getName(pType);\
47 }\
48\
49 inline QString operator+(enumName pType, const QString& pStr)\
50 {\
51 return Enum<enumName>::getName(pType) + pStr;\
52 }\
53\
54 inline bool operator==(std::underlying_type_t<enumName> pType, enumName pName)\
55 {\
56 return static_cast<std::underlying_type_t<enumName>>(pName) == pType;\
57 }\
58 inline bool operator!=(std::underlying_type_t<enumName> pType, enumName pName)\
59 {\
60 return !(pType == pName);\
61 }\
62 defineQHash(enumName)
63
64
65#define defineTypedEnumType(enumName, enumType, ...)\
66 class Enum##enumName\
67 {\
68 Q_GADGET\
69\
70 Q_DISABLE_COPY(Enum##enumName)\
71\
72 private:\
73 Enum##enumName();\
74\
75 public:\
76 enum class enumName : enumType\
77 {\
78 __VA_ARGS__\
79 };\
80\
81 Q_ENUM(enumName)\
82 };\
83\
84 using enumName = Enum##enumName::enumName;\
85 namespace governikusEnum##enumName\
86 {\
87 INIT_FUNCTION([]\
88 {\
89 qRegisterMetaType<enumType>(#enumName);\
90 })\
91 }\
92\
93 defineEnumOperators(enumName)
94
95
96#define defineEnumType(enumName, ...) defineTypedEnumType(enumName, int, __VA_ARGS__)
97
98
99template<typename EnumTypeT> class Enum
100{
101 using EnumBaseTypeT = std::underlying_type_t<EnumTypeT>;
102
103 Q_DISABLE_COPY(Enum)
104
105 private:
106 Enum() = delete;
107 ~Enum() = delete;
108
109 public:
110 [[nodiscard]] static inline QMetaEnum getQtEnumMetaEnum()
111 {
112 return QMetaEnum::fromType<EnumTypeT>();
113 }
114
115
116 [[nodiscard]] static QLatin1String getName()
117 {
118 return QLatin1String(getQtEnumMetaEnum().name());
119 }
120
121
122 [[nodiscard]] static QLatin1String getName(EnumTypeT pType)
123 {
124 const auto value = static_cast<int>(pType);
125 const char* const name = getQtEnumMetaEnum().valueToKey(value);
126 if (Q_UNLIKELY(name == nullptr))
127 {
128 qCritical().noquote().nospace() << "CRITICAL CONVERSION MISMATCH: UNKNOWN 0x" << QString::number(value, 16);
129 return QLatin1String();
130 }
131
132 return QLatin1String(name);
133 }
134
135
136 [[nodiscard]] static int getCount()
137 {
138 return getQtEnumMetaEnum().keyCount();
139 }
140
141
142 [[nodiscard]] static QVector<EnumTypeT> getList()
143 {
144 QVector<EnumTypeT> list;
145
146 const QMetaEnum metaEnum = getQtEnumMetaEnum();
147 list.reserve(metaEnum.keyCount());
148 for (int i = 0; i < metaEnum.keyCount(); ++i)
149 {
150 list << static_cast<EnumTypeT>(metaEnum.value(i));
151 }
152
153 return list;
154 }
155
156
157 [[nodiscard]] static EnumTypeT fromString(const char* const pValue, EnumTypeT pDefault)
158 {
159 bool ok = false;
160 int key = getQtEnumMetaEnum().keyToValue(pValue, &ok);
161 if (ok)
162 {
163 return static_cast<EnumTypeT>(key);
164 }
165 return pDefault;
166 }
167
168
169 [[nodiscard]] static EnumTypeT fromString(const QString& pValue, EnumTypeT pDefaultType)
170 {
171 return fromString(pValue.toUtf8().constData(), pDefaultType);
172 }
173
174
175 [[nodiscard]] static bool isValue(int pValue)
176 {
177 return getQtEnumMetaEnum().valueToKey(pValue) != nullptr;
178 }
179
180
181 [[nodiscard]] static bool isValue(ushort pValue)
182 {
183 return isValue(static_cast<int>(pValue));
184 }
185
186
187 [[nodiscard]] static EnumBaseTypeT getValue(EnumTypeT pType)
188 {
189 return static_cast<EnumBaseTypeT>(pType);
190 }
191
192
193};
194
195
196template<typename T> inline QLatin1String getEnumName(T pType)
197{
198 return Enum<T>::getName(pType);
199}
200
201
202} // namespace governikus
Definition: EnumHelper.h:100
static bool isValue(int pValue)
Definition: EnumHelper.h:175
static QVector< EnumTypeT > getList()
Definition: EnumHelper.h:142
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 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