AusweisApp2
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 
15 namespace 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 
99 template<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 
196 template<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 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
Implementation of GeneralAuthenticate response APDUs.
Definition: CommandApdu.h:16
QLatin1String getEnumName(T pType)
Definition: EnumHelper.h:196