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