QxOrm 1.4.9
C++ Object Relational Mapping library
Loading...
Searching...
No Matches
get_class_name.h
Go to the documentation of this file.
1/****************************************************************************
2**
3** https://www.qxorm.com/
4** Copyright (C) 2013 Lionel Marty (contact@qxorm.com)
5**
6** This file is part of the QxOrm library
7**
8** This software is provided 'as-is', without any express or implied
9** warranty. In no event will the authors be held liable for any
10** damages arising from the use of this software
11**
12** Commercial Usage
13** Licensees holding valid commercial QxOrm licenses may use this file in
14** accordance with the commercial license agreement provided with the
15** Software or, alternatively, in accordance with the terms contained in
16** a written agreement between you and Lionel Marty
17**
18** GNU General Public License Usage
19** Alternatively, this file may be used under the terms of the GNU
20** General Public License version 3.0 as published by the Free Software
21** Foundation and appearing in the file 'license.gpl3.txt' included in the
22** packaging of this file. Please review the following information to
23** ensure the GNU General Public License version 3.0 requirements will be
24** met : http://www.gnu.org/copyleft/gpl.html
25**
26** If you are unsure which license is appropriate for your use, or
27** if you have questions regarding the use of this file, please contact :
28** contact@qxorm.com
29**
30****************************************************************************/
31
32#ifndef _QX_GET_CLASS_NAME_H_
33#define _QX_GET_CLASS_NAME_H_
34
35#ifdef _MSC_VER
36#pragma once
37#endif
38
46#ifndef _QX_NO_RTTI
47#include <typeinfo>
48#endif // _QX_NO_RTTI
49
51
52#define QX_REGISTER_CLASS_NAME_SEP_INF "<"
53#define QX_REGISTER_CLASS_NAME_SEP_SUP ">"
54#define QX_REGISTER_CLASS_NAME_SEP_NXT ", "
55
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 "_"
59
60#define QX_GET_CLASS_NAME(TYPE) \
61qx::trait::get_class_name< qx::trait::remove_attr< TYPE >::type >::get()
62
63#define QX_GET_CLASS_NAME_STD_STR(TYPE) \
64std::string(qx::trait::get_class_name< qx::trait::remove_attr< TYPE >::type >::get())
65
66#define QX_GET_CLASS_NAME_XML_TAG(TYPE) \
67qx::trait::get_class_name< qx::trait::remove_attr< TYPE >::type >::get_xml_tag()
68
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())
71
72#define QX_GET_CLASS_NAME_WITH_TYPENAME(TYPE) \
73qx::trait::get_class_name< typename qx::trait::remove_attr< TYPE >::type >::get()
74
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())
77
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()
80
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())
83
84#define QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG() \
85static inline const char * get_xml_tag() \
86{ \
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(); \
97}
98
99#ifdef _QX_NO_RTTI
100#define QX_REGISTER_CLASS_NAME_NO_RTTI(className) std::string(#className)
101#endif // _QX_NO_RTTI
102
103namespace qx {
104namespace trait {
105
110template <typename T>
112{
113
114 static inline const char * get()
115 {
116 static std::string result;
117 if (! result.empty()) { return result.c_str(); }
118
119#ifndef _QX_NO_RTTI
120 T * dummy = NULL; Q_UNUSED(dummy);
121 result = std::string(typeid(dummy).name());
122#else // _QX_NO_RTTI
123 result = QX_REGISTER_CLASS_NAME_NO_RTTI(T);
124#endif // _QX_NO_RTTI
125
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();
128 }
129
131
132};
133
134} // namespace trait
135} // namespace qx
136
137#define QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className) \
138static std::string result; \
139if (! result.empty()) { return result.c_str(); } \
140result = std::string(#className);
141
142#define QX_REGISTER_CLASS_NAME(className) \
143namespace qx { namespace trait { \
144template <> \
145struct get_class_name< className > \
146{ \
147 static inline const char * get() \
148 { \
149 QX_REGISTER_CLASS_NAME_TEMPLATE_INIT(className); \
150 return result.c_str(); \
151 } \
152 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
153}; \
154} } // namespace qx::trait
155
156#define QX_REGISTER_CLASS_NAME_TEMPLATE_1(className) \
157namespace qx { namespace trait { \
158template <typename T> \
159struct get_class_name< className<T> > \
160{ \
161 static inline const char * get() \
162 { \
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(); \
166 } \
167 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
168}; \
169} } // namespace qx::trait
170
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> > \
175{ \
176 static inline const char * get() \
177 { \
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(); \
182 } \
183 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
184}; \
185} } // namespace qx::trait
186
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> > \
191{ \
192 static inline const char * get() \
193 { \
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(); \
199 } \
200 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
201}; \
202} } // namespace qx::trait
203
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> > \
208{ \
209 static inline const char * get() \
210 { \
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(); \
217 } \
218 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
219}; \
220} } // namespace qx::trait
221
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> > \
226{ \
227 static inline const char * get() \
228 { \
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(); \
236 } \
237 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
238}; \
239} } // namespace qx::trait
240
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> > \
245{ \
246 static inline const char * get() \
247 { \
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(); \
256 } \
257 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
258}; \
259} } // namespace qx::trait
260
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> > \
265{ \
266 static inline const char * get() \
267 { \
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(); \
277 } \
278 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
279}; \
280} } // namespace qx::trait
281
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> > \
286{ \
287 static inline const char * get() \
288 { \
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(); \
299 } \
300 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
301}; \
302} } // namespace qx::trait
303
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> > \
308{ \
309 static inline const char * get() \
310 { \
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(); \
322 } \
323 QX_GET_CLASS_NAME_IMPLEMENT_FCT_GET_XML_TAG(); \
324}; \
325} } // namespace qx::trait
326
327#endif // _QX_GET_CLASS_NAME_H_
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,...
static const char * get()