DCL 4.0
Loading...
Searching...
No Matches
Object.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#if __DCL_WINDOWS
4#include <windows.h> // for dcl/Thread.h
5#endif
6
7#ifdef __GNUC__
8#include <cxxabi.h>
9#endif
10
11#include <dcl/Object.h>
12#include <dcl/String.h>
13#include <dcl/Charset.h>
14#include <dcl/Thread.h>
15#include <dcl/Writer.h>
16
17#if __DCL_DEBUG
18#undef __THIS_FILE__
19static const char_t __THIS_FILE__[] = __T("dcl/Object.cpp");
20#endif
21
22__DCL_BEGIN_NAMESPACE
23
24#ifdef __DCL_NO_RTTI
25const Object::ClassInfo Object::m_classInfo =
26{
27 __T(__DCL_NAMESPACE_STRING) __T("Object"), sizeof(Object), NULL
28};
29
30const Object::ClassInfo* Object::classInfo() const
31{
32 return CLASSINFO(Object);
33}
34
35String Object::className() const
36{
37 return String(classInfo()->pszClassName);
38}
39
40bool Object::isKindOf(const Object::ClassInfo* pClassInfo) const
41{
42 const ClassInfo* pChildInfo = classInfo();
43 do
44 {
45 if (pChildInfo == pClassInfo)
46 return true;
47
48 pChildInfo = pChildInfo->pBaseClassInfo;
49 } while (pChildInfo);
50
51 return false;
52}
53
54bool Object::isInstanceOf(const Object::ClassInfo* pClassInfo) const
55{
56 return classInfo() == pClassInfo;
57}
58
59#else // __DCL_NO_RTTI
60
61/*
62class Object
63{
64 ...
65 virtual bool isKindOf(const std::type_info& typeInfo) const;
66};
67
68#ifdef __DCL_NO_RTTI
69#define CLASSINFO_REF const Object::ClassInfo*
70#define CLASSINFO(class_name) (&class_name::m_classInfo)
71#define DECLARE_CLASSINFO(class_name) \
72public: \
73 static const ClassInfo m_classInfo; \
74 virtual const ClassInfo* classInfo() const;
75#else
76#define CLASSINFO_REF const std::type_info&
77#define CLASSINFO(class_name) (typeid(class_name))
78#define DECLARE_CLASSINFO(class_name) \
79public: \
80 virtual bool isKindOf(const std::type_info& typeInfo) const; \
81 virtual const std::type_info& typeInfo() const;
82#endif
83
84#ifdef __DCL_NO_RTTI
85#define IMPLEMENT_CLASSINFO(class_name, base_class_name) \
86const Object::ClassInfo class_name::m_classInfo = \
87{ \
88 __DCL_NAMESPACE_STRING #class_name, \
89 sizeof(class class_name), \
90 &base_class_name::m_classInfo \
91}; \
92const Object::ClassInfo* class_name::classInfo() const \
93{ \
94 return CLASSINFO(class_name); \
95}
96#else
97#define IMPLEMENT_CLASSINFO(class_name, base_class_name) \
98bool class_name::isKindOf(const std::type_info& typeInfo) const \
99{ \
100 if (typeid(class_name) == typeInfo) \
101 return true; \
102 return base_class_name::isKindOf(typeInfo); \
103} \
104const std::type_info& class_name::typeInfo() const \
105{ \
106 return typeid(class_name); \
107}
108
109bool class_name::isKindOf(const std::type_info& typeInfo) const \
110{ \
111 if (typeid(class_name) == typeInfo) \
112 return true; \
113 return base_class_name::isKindOf(typeInfo); \
114} \
115
116bool Object::isKindOf(const std::type_info& info) const
117{
118#if _MSC_VER <= 1200
119 return (typeid(Object) == info) != 0;
120#else
121 return typeid(Object) == info;
122#endif
123}
124*/
125
126const std::type_info& Object::typeInfo() const
127{
128// return typeid(*this);
129 return typeid(Object);
130}
131
132static String __getDemangledTypeName(const std::type_info& info)
133{
134 const char* demangled = NULL;
135
136#ifdef _MSC_VER
137 // MSC "class foo::a"
138 const char* _p = strchr(info.name(), ' ');
139 if (_p) {
140 while(*_p == ' ') _p++;
141 demangled = _p;
142 }
143 else
144 demangled = info.name();
145
146#elif defined(__GNUC__)
147 // GNUC mangled
148 char buf[1024];
149 size_t n = __countof(buf, char);
150 int status = 0;
151 demangled = __cxxabiv1::__cxa_demangle(info.name(), buf, &n, &status);
152#endif
153
154 String r;
155 if (demangled) {
156 // demangled is NULL terminated
157 r = AsciiDecoder::decode(demangled);
158 }
159
160 return r;
161}
162
163String Object::className() const
164{
165 return __getDemangledTypeName(typeInfo());
166}
167
168bool Object::isInstanceOf(const std::type_info& info) const
169{
170#if _MSC_VER <= 1200
171 return (typeInfo() == info) != 0;
172#else // __GNUC__,
173 return (typeInfo() == info);
174#endif
175}
176
177#endif // __DCL_NO_RTTI
178
180{
181}
182
184{
185}
186
187String Object::toString() const
188{
189 return className();
190}
191
193{
194 delete this;
195}
196
197#if __DCL_DEBUG
198void Object::dump(Writer& out) const
199{
200 out << L"\n==========================\n"
201 << className()
202 << L"\n--------------------------\n";
203}
204#endif
205
206#if __DCL_HAVE_ALLOC_DEBUG
207#undef new
208
209void* Object::operator new(
210 size_t _size,
211 bool _check,
212 const char_t* _filename,
213 unsigned int _line
214 )
215{
216 if (_size == 0)
217 _size = 1;
218
219 return DCLDebugMalloc(
220 _size,
221 _check,
222 DCL_ALLOC_NEW_OBJECT,
223 _filename,
224 _line
225 );
226}
227
228void* Object::operator new[](
229 size_t _size,
230 bool _check,
231 const char_t* _filename,
232 unsigned int _line
233 )
234{
235 if (_size == 0)
236 _size = 1;
237
238 return DCLDebugMalloc(
239 _size,
240 _check,
241 DCL_ALLOC_NEW_OBJECT_ARRAY,
242 _filename,
243 _line
244 );
245}
246
247void Object::operator delete(
248 void* _p,
249 bool, // _check
250 const char_t* _filename,
251 unsigned int _line
252 )
253{
254 DCLDebugFree(
255 _p,
256 DCL_ALLOC_DELETE_OBJECT,
257 _filename,
258 _line
259 );
260}
261
262void Object::operator delete[](
263 void* _p,
264 bool, // _check
265 const char_t* _filename,
266 unsigned int _line
267 )
268{
269 DCLDebugFree(
270 _p,
271 DCL_ALLOC_DELETE_OBJECT_ARRAY,
272 _filename,
273 _line
274 );
275}
276
277
278void* Object::operator new(size_t)
279{
280 __DCL_ASSERT_EX(false, L"디버그 버전으로 빌드된 라이브러리에서 호출될 수 없습니다.!");
281 return (void*)0; // GCC에서 new는 NULL을 리턴하지 않고 예외를 발생시킨다.
282}
283
284void* Object::operator new[](size_t)
285{
286 __DCL_ASSERT_EX(false, L"디버그 버전으로 빌드된 라이브러리에서 호출될 수 없습니다.!");
287 return (void*)0;
288}
289
290
291void Object::operator delete(void* _p)
292{
293 Object::operator delete(_p, true, NULL, 0);
294}
295
296void Object::operator delete[](void* _p)
297{
298 Object::operator delete[](_p, true, NULL, 0);
299}
300
301#endif // __DCL_HAVE_ALLOC_DEBUG
302
303__DCL_END_NAMESPACE
#define __THIS_FILE__
Definition _trace.h:14
#define NULL
Definition Config.h:340
#define __countof(array, type)
Definition Config.h:365
wchar_t char_t
Definition Config.h:275
#define CLASSINFO(class_name)
Definition Object.h:209
#define __DCL_ASSERT_EX(expr, msg)
Definition Object.h:372
#define __T(str)
Definition Object.h:44
ByteString r
ByteBuffer * buf
void CharsetConvertException *size_t n
Definition SQLField.cpp:253
static String decode(const char *_mbs, size_t _mbslen=(size_t) -1)
Object()
Definition Object.cpp:183
virtual const std::type_info & typeInfo() const
Definition Object.cpp:126
virtual String toString() const
Definition Object.cpp:187
virtual void destroy()
Definition Object.cpp:192
virtual ~Object()
Definition Object.cpp:179
bool isInstanceOf(const std::type_info &typeinfo) const
Definition Object.cpp:168
String className() const
Definition Object.cpp:163