32#ifndef _QX_GET_CLASS_NAME_H_
33#define _QX_GET_CLASS_NAME_H_
52#define QX_REGISTER_CLASS_NAME_SEP_INF "<"
53#define QX_REGISTER_CLASS_NAME_SEP_SUP ">"
54#define QX_REGISTER_CLASS_NAME_SEP_NXT ", "
56#define QX_REGISTER_CLASS_NAME_SEP_INF_XML_TAG "-"
57#define QX_REGISTER_CLASS_NAME_SEP_SUP_XML_TAG "-"
58#define QX_REGISTER_CLASS_NAME_SEP_NXT_XML_TAG "_"
60#define QX_GET_CLASS_NAME(TYPE) \
61qx::trait::get_class_name< qx::trait::remove_attr< TYPE >::type >::get()
63#define QX_GET_CLASS_NAME_STD_STR(TYPE) \
64std::string(qx::trait::get_class_name< qx::trait::remove_attr< TYPE >::type >::get())
66#define QX_GET_CLASS_NAME_XML_TAG(TYPE) \
67qx::trait::get_class_name< qx::trait::remove_attr< TYPE >::type >::get_xml_tag()
69#define QX_GET_CLASS_NAME_XML_TAG_STD_STR(TYPE) \
70std::string(qx::trait::get_class_name< qx::trait::remove_attr< TYPE >::type >::get_xml_tag())
72#define QX_GET_CLASS_NAME_WITH_TYPENAME(TYPE) \
73qx::trait::get_class_name< typename qx::trait::remove_attr< TYPE >::type >::get()
75#define QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(TYPE) \
76std::string(qx::trait::get_class_name< typename qx::trait::remove_attr< TYPE >::type >::get())
78#define QX_GET_CLASS_NAME_XML_TAG_WITH_TYPENAME(TYPE) \
79qx::trait::get_class_name< typename qx::trait::remove_attr< TYPE >::type >::get_xml_tag()
81#define QX_GET_CLASS_NAME_XML_TAG_STD_STR_WITH_TYPENAME(TYPE) \
82std::string(qx::trait::get_class_name< typename qx::trait::remove_attr< TYPE >::type >::get_xml_tag())
84#define QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG() \
85static inline const char * get_xml_tag() \
87 static std::string result_xml; \
88 if (! result_xml.empty()) { return result_xml.c_str(); } \
89 QString tmp = get_class_name::get(); \
90 tmp.replace(QX_REGISTER_CLASS_NAME_SEP_INF, QX_REGISTER_CLASS_NAME_SEP_INF_XML_TAG); \
91 tmp.replace(QX_REGISTER_CLASS_NAME_SEP_SUP, QX_REGISTER_CLASS_NAME_SEP_SUP_XML_TAG); \
92 tmp.replace(QX_REGISTER_CLASS_NAME_SEP_NXT, QX_REGISTER_CLASS_NAME_SEP_NXT_XML_TAG); \
93 tmp.replace("::", "."); \
94 tmp.replace(" ", ""); \
95 result_xml = tmp.toLatin1().constData(); \
96 return result_xml.c_str(); \
100#define QX_REGISTER_CLASS_NAME_NO_RTTI(className) std::string(#className)
114 static inline const char *
get()
116 static std::string result;
117 if (! result.empty()) {
return result.c_str(); }
120 T * dummy = NULL; Q_UNUSED(dummy);
121 result = std::string(
typeid(dummy).name());
123 result = QX_REGISTER_CLASS_NAME_NO_RTTI(T);
126 qDebug(
"[QxOrm] Unable to define correct class name : '%s' => use macro 'QX_REGISTER_CLASS_NAME()' or 'QX_REGISTER_CLASS_NAME_TEMPLATE_X()'", result.c_str());
127 return result.c_str();
137#define QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className) \
138static std::string result; \
139if (! result.empty()) { return result.c_str(); } \
140result = std::string(#className);
142#define QX_REGISTER_CLASS_NAME(className) \
143namespace qx { namespace trait { \
145struct get_class_name< className > \
147 static inline const char * get() \
149 QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className); \
150 return result.c_str(); \
152 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
156#define QX_REGISTER_CLASS_NAME_TEMPLATE_1(className) \
157namespace qx { namespace trait { \
158template <typename T> \
159struct get_class_name< className<T> > \
161 static inline const char * get() \
163 QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className); \
164 result += QX_REGISTER_CLASS_NAME_SEP_INF + QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T) + QX_REGISTER_CLASS_NAME_SEP_SUP; \
165 return result.c_str(); \
167 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
171#define QX_REGISTER_CLASS_NAME_TEMPLATE_2(className) \
172namespace qx { namespace trait { \
173template <typename T1, typename T2> \
174struct get_class_name< className<T1, T2> > \
176 static inline const char * get() \
178 QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className); \
179 result += QX_REGISTER_CLASS_NAME_SEP_INF + QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T1) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
180 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T2) + QX_REGISTER_CLASS_NAME_SEP_SUP; \
181 return result.c_str(); \
183 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
187#define QX_REGISTER_CLASS_NAME_TEMPLATE_3(className) \
188namespace qx { namespace trait { \
189template <typename T1, typename T2, typename T3> \
190struct get_class_name< className<T1, T2, T3> > \
192 static inline const char * get() \
194 QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className); \
195 result += QX_REGISTER_CLASS_NAME_SEP_INF + QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T1) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
196 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T2) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
197 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T3) + QX_REGISTER_CLASS_NAME_SEP_SUP; \
198 return result.c_str(); \
200 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
204#define QX_REGISTER_CLASS_NAME_TEMPLATE_4(className) \
205namespace qx { namespace trait { \
206template <typename T1, typename T2, typename T3, typename T4> \
207struct get_class_name< className<T1, T2, T3, T4> > \
209 static inline const char * get() \
211 QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className); \
212 result += QX_REGISTER_CLASS_NAME_SEP_INF + QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T1) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
213 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T2) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
214 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T3) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
215 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T4) + QX_REGISTER_CLASS_NAME_SEP_SUP; \
216 return result.c_str(); \
218 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
222#define QX_REGISTER_CLASS_NAME_TEMPLATE_5(className) \
223namespace qx { namespace trait { \
224template <typename T1, typename T2, typename T3, typename T4, typename T5> \
225struct get_class_name< className<T1, T2, T3, T4, T5> > \
227 static inline const char * get() \
229 QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className); \
230 result += QX_REGISTER_CLASS_NAME_SEP_INF + QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T1) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
231 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T2) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
232 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T3) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
233 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T4) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
234 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T5) + QX_REGISTER_CLASS_NAME_SEP_SUP; \
235 return result.c_str(); \
237 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
241#define QX_REGISTER_CLASS_NAME_TEMPLATE_6(className) \
242namespace qx { namespace trait { \
243template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> \
244struct get_class_name< className<T1, T2, T3, T4, T5, T6> > \
246 static inline const char * get() \
248 QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className); \
249 result += QX_REGISTER_CLASS_NAME_SEP_INF + QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T1) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
250 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T2) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
251 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T3) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
252 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T4) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
253 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T5) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
254 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T6) + QX_REGISTER_CLASS_NAME_SEP_SUP; \
255 return result.c_str(); \
257 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
261#define QX_REGISTER_CLASS_NAME_TEMPLATE_7(className) \
262namespace qx { namespace trait { \
263template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \
264struct get_class_name< className<T1, T2, T3, T4, T5, T6, T7> > \
266 static inline const char * get() \
268 QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className); \
269 result += QX_REGISTER_CLASS_NAME_SEP_INF + QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T1) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
270 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T2) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
271 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T3) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
272 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T4) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
273 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T5) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
274 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T6) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
275 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T7) + QX_REGISTER_CLASS_NAME_SEP_SUP; \
276 return result.c_str(); \
278 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
282#define QX_REGISTER_CLASS_NAME_TEMPLATE_8(className) \
283namespace qx { namespace trait { \
284template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \
285struct get_class_name< className<T1, T2, T3, T4, T5, T6, T7, T8> > \
287 static inline const char * get() \
289 QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className); \
290 result += QX_REGISTER_CLASS_NAME_SEP_INF + QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T1) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
291 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T2) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
292 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T3) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
293 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T4) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
294 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T5) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
295 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T6) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
296 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T7) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
297 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T8) + QX_REGISTER_CLASS_NAME_SEP_SUP; \
298 return result.c_str(); \
300 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
304#define QX_REGISTER_CLASS_NAME_TEMPLATE_9(className) \
305namespace qx { namespace trait { \
306template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> \
307struct get_class_name< className<T1, T2, T3, T4, T5, T6, T7, T8, T9> > \
309 static inline const char * get() \
311 QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className); \
312 result += QX_REGISTER_CLASS_NAME_SEP_INF + QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T1) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
313 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T2) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
314 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T3) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
315 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T4) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
316 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T5) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
317 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T6) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
318 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T7) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
319 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T8) + QX_REGISTER_CLASS_NAME_SEP_NXT; \
320 result += QX_GET_CLASS_NAME_STD_STR_WITH_TYPENAME(T9) + QX_REGISTER_CLASS_NAME_SEP_SUP; \
321 return result.c_str(); \
323 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
Root namespace for all QxOrm library features.
qx::trait::remove_attr<T>::type : return a type without pointer, const, reference and/or volatile att...
qx::trait::get_class_name<T>::get() : return class name of type T under const char * format,...
QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG()
static const char * get()