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