DCL 3.7.6
Loading...
Searching...
No Matches
Object.h
Go to the documentation of this file.
1#ifndef __DCL_OBJECT_H__
2#define __DCL_OBJECT_H__ 20050517
3
4#ifndef __cplusplus
5#error "dcl/Object.h requires C++ Complilation"
6#endif
7
8#ifndef __DCL_CONFIG_H__
9#include <dcl/Config.h>
10#endif
11
12#ifdef __WINNT__
13 #if __DCL_PTHREAD
14 #include <pthread.h>
15 typedef pthread_t thread_t;
16 #else
17 typedef unsigned long thread_t;
18 #endif
19#else
20 #if defined(__ANDROID__)
21 #include <bits/pthread_types.h>
22 #elif !defined(__DEFINED_pthread_t) && defined(__linux__)
23 #include <bits/pthreadtypes.h>
24 #elif defined(__APPLE__)
25 #include <sys/_pthread/_pthread_types.h>
26 #else
27 #include <pthread.h>
28 #endif
29 typedef pthread_t thread_t;
30#endif
31
32#ifndef __DCL_NO_RTTI
33#include <typeinfo>
34#endif
35
36#if __DCL_HAVE_ALLOC_DEBUG && !(__DCL_DEBUG)
37#error "dcl/_Config.h incorrect"
38#endif
39
40#ifdef __DCL_DEBUG_NEW
41#error "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
42#undef new
43#endif
44
45#undef __CONCAT__
46#undef __CONCAT
47
48#undef __STRING__
49
50#undef __TEXT__
51#undef __TEXT
52#undef __T
53#undef _T
54
55#define __CONCAT__(x, y) x ## y
56#define __CONCAT(x, y) __CONCAT__(x, y)
57
58#define __STRING__(expr) #expr
59
60#define __TEXT__(str) L ## str
61#define __TEXT(str) __TEXT__(str)
62#define __T(str) __TEXT__(str)
63#define _T(str) __TEXT__(str)
64
65#define __CONCAT_TEXT(str, expr) __TEXT(str) __STRING__(expr)
66
67#if 0
68// Test text-macros
69#define BB bb
70
71__CONCAT(aa, BB)
72__STRING__(aa == b)
73
74__TEXT("aa")
75__T("aa")
76
77__CONCAT_TEXT("aa", BB)
78#endif
79
80__DCL_BEGIN_NAMESPACE
81
82/*
83DCLCore classes
84
85Object;
86 Exception;
87 IOException;
88 DllException;
89 AssertError;
90 SQLException;
91 InputStream;
92 FileInputStream;
93 OutputStream;
94 ByteOutputStream;
95 XByteOutputStream;
96 FileOutputStream;
97 XFileOutputStream;
98 File;
99 StdFile;
100 Thread;
101 MThread; // Message
102 Dll;
103 SQLDriver;
104 SQLField;
105 SQLParam;
106 SQLQuery;
107 SQLConnection;
108 SQLConnectionPool;
109 HtmlTemplate;
110 IniFile;
111#ifdef __WINNT__
112 Registry;
113#endif
114 Regex;
115 Writer;
116
117String;
118Date;
119Time;
120DateTime;
121Interval;
122Int32;
123Int64;
124Single;
125Double;
126Decimal;
127
128SyncObject;
129 Mutex;
130 ThreadCond;
131*/
132
133class String;
134class Writer;
135
137{
138protected:
139 virtual ~Object();
140 Object();
141
142public:
143 virtual String toString() const;
144
145#ifdef __DCL_DEBUG
146 virtual void dump(Writer& _out) const;
147#endif
152 virtual void destroy();
153
154#if __DCL_HAVE_ALLOC_DEBUG
155 void* operator new(
156 size_t _size,
157 bool _check,
158 const char_t* _filename,
159 unsigned int _line
160 );
161
162 void* operator new[](
163 size_t _size,
164 bool _check,
165 const char_t* _filename,
166 unsigned int _line
167 );
168
169 void operator delete(
170 void* _ptr,
171 bool, // _check
172 const char_t* _filename,
173 unsigned int _line
174 ) noexcept;
175
176 void operator delete[](
177 void* _ptr,
178 bool, // _check
179 const char_t* _filename,
180 unsigned int _line
181 ) noexcept;
182
183 void* operator new(size_t);
184 void* operator new[](size_t);
185
186 void operator delete(void* _ptr) noexcept;
187 void operator delete[](void* _ptr) noexcept;
188
189 // default placement
190 void* operator new(size_t, void* _ptr) { return _ptr; }
191 void* operator new[](size_t, void* _ptr) { return _ptr; }
192 void operator delete(void*, void*) noexcept { }
193 void operator delete[](void*, void*) noexcept { }
194#endif
195
196public:
197 String className() const;
198
199#ifdef __DCL_NO_RTTI
200 struct DCLCAPI ClassInfo
201 {
202 const wchar_t* pszClassName;
203 size_t nObjectSize;
204 const ClassInfo* pBaseClassInfo;
205 };
206 static const ClassInfo __classInfo;
207
208 // 인스턴스의 클래스가 pClassInfo이거나 pClassInfo로부터 상속받은 클래스이면 true
209 bool isKindOf(const ClassInfo* pClassInfo) const;
210 // pClassInfo의 인스턴스이면 true
211 bool isInstanceOf(const ClassInfo* pClassInfo) const;
212 virtual const ClassInfo* classInfo() const;
213#else
214 bool isInstanceOf(const std::type_info& typeinfo) const;
215 virtual const std::type_info& typeInfo() const;
216#endif
217};
218
219#ifdef __DCL_NO_RTTI
220#define CLASSINFO_REF const Object::ClassInfo*
221#define CLASSINFO(class_name) (&class_name::__classInfo)
222#define DECLARE_CLASSINFO(class_name) \
223public: \
224 static const ClassInfo __classInfo; \
225 virtual const ClassInfo* classInfo() const;
226#else
227#define CLASSINFO_REF const std::type_info&
228#define CLASSINFO(class_name) (typeid(class_name))
229#define DECLARE_CLASSINFO(class_name) \
230public: \
231 virtual const std::type_info& typeInfo() const;
232#endif
233
234#ifdef __DCL_NO_RTTI
235#define IMPLEMENT_CLASSINFO(class_name, base_class_name) \
236const Object::ClassInfo class_name::__classInfo = \
237{ \
238 __DCL_NAMESPACE_STRING __S(class_name), \
239 sizeof(class class_name), \
240 &base_class_name::__classInfo \
241}; \
242const Object::ClassInfo* class_name::classInfo() const \
243{ \
244 return CLASSINFO(class_name); \
245}
246#else
247#define IMPLEMENT_CLASSINFO(class_name, base_class_name) \
248const std::type_info& class_name::typeInfo() const \
249{ \
250 return typeid(class_name); \
251}
252#endif
253
254__DCL_END_NAMESPACE
255
256#ifdef __DCL_DEBUG
257#define DCLInitialize DCLInitializeD
258#define DCLCleanup DCLCleanupD
259#endif
260
261#if __DCL_HAVE_MANUAL_INITIALIZE
270DCLCAPI int DCLInitialize();
271
282DCLCAPI void DCLCleanup();
283
284#define __DCL_INITIALIZE DCLInitialize();
285#define __DCL_CLEANUP DCLCleanup();
286#else
287#define __DCL_INITIALIZE
288#define __DCL_CLEANUP
289#endif
290
291//typedef void (* DCLCleanupCallback)(void*);
292typedef void (* DCLCleanupCallback)();
293
294#ifdef __DCL_DEBUG
304DCLCAPI __DCL_NAMESPACE Writer* DCLDebugSetGlobalReport(
305 __DCL_NAMESPACE Writer* __noclose__ _pWriter
306);
307
315DCLCAPI __DCL_NAMESPACE Writer* DCLDebugSetThreadReport(
316 thread_t _threadId,
317 __DCL_NAMESPACE Writer* __noclose__ _pWriter
318);
319
323DCLCAPI void DCLDebugAssert(
324 const char_t* _filename,
325 unsigned int _line,
326 const char_t* _expr,
327 const char_t* _message
328) __DCL_THROWS1(__DCL_NAMESPACE AssertError*);
329
333DCLCAPI void DCLDebugTrace(
334 const char_t* _filename,
335 unsigned int _line,
336 const char_t* _format,
337 ...
338);
339#endif /* __DCL_DEBUG */
340
341/*****************************************************
342 MACRO FOR ASSERT/TRACE
343*****************************************************/
344
345#undef ASSERT
346#undef ASSERT_EX
347#undef VERIFY
348
349#define ASSERT __DCL_ASSERT
350#define ASSERT_EX __DCL_ASSERT_EX
351#define VERIFY __DCL_VERIFY
352
353#undef TRACE0
354#undef TRACE1
355#undef TRACE2
356#undef TRACE3
357#undef TRACE4
358#undef TRACE5
359#undef TRACE6
360
361#define TRACE0 __DCL_TRACE0
362#define TRACE1 __DCL_TRACE1
363#define TRACE2 __DCL_TRACE2
364#define TRACE3 __DCL_TRACE3
365#define TRACE4 __DCL_TRACE4
366#define TRACE5 __DCL_TRACE5
367#define TRACE6 __DCL_TRACE6
368
369#ifdef __DCL_DEBUG
370
371#define __DCL_ASSERT(expr) \
372 (expr) ? (void) 0 : DCLDebugAssert(__THIS_FILE__, __LINE__, __T(#expr), NULL)
373
374#define __DCL_ASSERT_EX(expr, msg) \
375 (expr) ? (void) 0 : DCLDebugAssert(__THIS_FILE__, __LINE__, __T(#expr), msg)
376
377#define __DCL_VERIFY(expr) __DCL_ASSERT(expr)
378
379#define __DCL_TRACE0(psz) \
380 DCLDebugTrace(__THIS_FILE__, __LINE__, psz)
381#define __DCL_TRACE1(fmt, arg1) \
382 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1)
383#define __DCL_TRACE2(fmt, arg1, arg2) \
384 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2)
385#define __DCL_TRACE3(fmt, arg1, arg2, arg3) \
386 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2, arg3)
387#define __DCL_TRACE4(fmt, arg1, arg2, arg3, arg4) \
388 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2, arg3, arg4)
389#define __DCL_TRACE5(fmt, arg1, arg2, arg3, arg4, arg5) \
390 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2, arg3, arg4, arg5)
391#define __DCL_TRACE6(fmt, arg1, arg2, arg3, arg4, arg5, arg6) \
392 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
393
394#else /* __DCL_DEBUG */
395
396#define __DCL_ASSERT(expr) ((void)0)
397#define __DCL_ASSERT_EX(expr, msg) ((void)0)
398#define __DCL_VERIFY(expr) ((void)(expr))
399
400#define __DCL_TRACE0(psz)
401#define __DCL_TRACE1(fmt, arg1)
402#define __DCL_TRACE2(fmt, arg1, arg2)
403#define __DCL_TRACE3(fmt, arg1, arg2, arg3)
404#define __DCL_TRACE4(fmt, arg1, arg2, arg3, arg4)
405#define __DCL_TRACE5(fmt, arg1, arg2, arg3, arg4, arg5)
406#define __DCL_TRACE6(fmt, arg1, arg2, arg3, arg4, arg5, arg6)
407
408#endif /* __DCL_DEBUG */
409
410#define __DCL_ASSERT_HANDLE(expr) __DCL_ASSERT(expr)
411#define __DCL_ASSERT_PARAM(expr) __DCL_ASSERT(expr)
412
413#include <new>
414
415#if __DCL_HAVE_ALLOC_DEBUG
416
417typedef enum {
418 DCL_ALLOC_DEFAULT = (short) 0, /* malloc, calloc, reallc, free */
419 DCL_ALLOC_NEW, /* new char, new int, new struct, ... */
420 DCL_ALLOC_NEW_ARRAY, /* new char[], new int[], ... */
421 DCL_ALLOC_NEW_OBJECT, /* new Object */
422 DCL_ALLOC_NEW_OBJECT_ARRAY, /* new Object[] */
423 DCL_ALLOC_DELETE, /* delete ptr */
424 DCL_ALLOC_DELETE_ARRAY, /* delete[] ptr */
425 DCL_ALLOC_DELETE_OBJECT, /* delete (Object*) */
426 DCL_ALLOC_DELETE_OBJECT_ARRAY /* delete[] (Object*) */
427} DCLAllocFunc;
428
432DCLCAPI void DCLDebugAllocEnterNear(
433 const char_t* _filename,
434 unsigned int _line
435);
436
437DCLCAPI void* DCLDebugMalloc(
438 size_t _size,
439 bool _check,
440 DCLAllocFunc _func,
441 const char_t* _filename,
442 unsigned int _line
443);
444
445DCLCAPI void DCLDebugFree(
446 void* _ptr,
447 DCLAllocFunc _func,
448 const char_t* _filename,
449 unsigned int _line
450);
451
452DCLCAPI void* DCLDebugCalloc(
453 size_t _count,
454 size_t _size,
455 bool _check,
456 const char_t* _filename,
457 unsigned int _line
458);
459
460DCLCAPI void* DCLDebugRealloc(
461 void* _ptr,
462 size_t _size,
463 bool _check,
464 const char_t* _filename,
465 unsigned int _line
466);
467
468DCLCAPI bool DCLDebugAllocIsValid(
469 const void* _ptr
470);
471
472DCLCAPI void DCLDebugAllocSetCheckFlag(
473 const void* _ptr,
474 bool _check
475);
476
480DCLCAPI bool DCLDebugAllocGetPosition(
481 const void* _ptr,
482 char_t* _filename,
483 size_t _buflen,
484 unsigned int* _line
485);
486
490DCLCAPI const void* DCLDebugGetLastAllocPosition(
491 thread_t _threadId
492);
493
494typedef enum {
495 DCL_ALLOC_DUMP_ALL = 0,
496 DCL_ALLOC_DUMP_INTERNAL,
497 DCL_ALLOC_DUMP_USER
498} DCLAllocLeakDumpLevel;
499
500/*
501uThreadId가 할당한 _startPosition에서 최근까지의 메모리 누출 보고
502return : 성공하면 메모리 누출 항목의 갯수 >= 0, 실패(-1) 출력을 위한 버퍼할당 오류
503*/
504DCLCAPI size_t DCLDebugDumpThreadMemoryLeak(
505 thread_t _threadId,
506 const void* _startPosition,
507 DCLAllocLeakDumpLevel _level,
508 __DCL_NAMESPACE Writer* _writer
509);
510
511/*
512프로세스가 할당한 전체 메모리 누출 보고
513return : 성공하면 메모리 누출 항목의 갯수 >= 0, 실패(-1) 출력을 위한 버퍼할당 오류
514*/
515DCLCAPI size_t DCLDebugDumpGlobalMemoryLeak(
516 DCLAllocLeakDumpLevel _level,
517 __DCL_NAMESPACE Writer* _writer
518);
519
520/*****************************************************
521 NEW/DELETE FOR ALLOC DEBUG
522*****************************************************/
523
524// Global new/delete Operator Overload
525DCLCAPI void* operator new(
526 size_t _size,
527 bool _check,
528 const char_t* _filename,
529 unsigned int _line
530);
531
532DCLCAPI void* operator new[](
533 size_t _size,
534 bool _check,
535 const char_t* _filename,
536 unsigned int _line
537);
538
539DCLCAPI void operator delete(
540 void* _ptr,
541 bool _check,
542 const char_t* _filename,
543 unsigned int _line
544) noexcept;
545
546DCLCAPI void operator delete[](
547 void* _ptr,
548 bool _check,
549 const char_t* _filename,
550 unsigned int _line
551) noexcept;
552
553#define __DCL_TRACE_INTNAL_ 0
554
555#ifdef __WINNT__
556
557#if __DCL_TRACE_INTNAL_
558 #include <stdio.h>
559 #define __DCL_TRACE_INTNAL_DELETE_FN__ \
560 fprintf(stderr, "%s:%d __delete__ %zX\n", __FILE__, __LINE__, _ptr);
561 #define __DCL_TRACE_INTNAL_NEW_A__ \
562 fprintf(stderr, "%s:%d new[] %zd %zX\n", __FILE__, __LINE__, _size, r);
563 #define __DCL_TRACE_INTNAL_DELETE_A__ \
564 fprintf(stderr, "%s:%d delete[] %zX\n", __FILE__, __LINE__, _ptr);
565 #define __DCL_TRACE_INTNAL_NEW__ \
566 fprintf(stderr, "%s:%d new %zd %zX\n", __FILE__, __LINE__, _size, r);
567 #define __DCL_TRACE_INTNAL_DELETE__ \
568 fprintf(stderr, "%s:%d delete %zX\n", __FILE__, __LINE__, _ptr);
569#else
570 #define __DCL_TRACE_INTNAL_DELETE_FN__
571 #define __DCL_TRACE_INTNAL_NEW_A__
572 #define __DCL_TRACE_INTNAL_DELETE_A__
573 #define __DCL_TRACE_INTNAL_NEW__
574 #define __DCL_TRACE_INTNAL_DELETE__
575#endif
576 // MSC에서 다음 4개의 new, delete는 dllexport, dllimport 할 수 없다.
577 #ifdef __WINNT_GCC__
578 // MinGW g++에서는 overrided delete가 호출되지 않는다.
579 template<typename TYPE>
580 void __delete__(TYPE* _ptr, const char_t* _filename, unsigned int _line) {
581 _ptr->~TYPE();
582 __DCL_TRACE_INTNAL_DELETE_FN__
583 DCLDebugFree(_ptr, DCL_ALLOC_DELETE, _filename, _line);
584 }
585
586 void* operator new[](size_t _size);
587 void operator delete[](void* _ptr) noexcept;
588
589 #define __WINNT_NEW_DELETE_OVERRIDE \
590 void* operator new[](size_t _size)\
591 {\
592 void* r = DCLDebugMalloc(\
593 _size == 0 ? 1 : _size, true, DCL_ALLOC_NEW_ARRAY, NULL, 0\
594 );\
595 __DCL_TRACE_INTNAL_NEW_A__\
596 return r;\
597 }\
598 void operator delete[](void* _ptr) noexcept\
599 {\
600 __DCL_TRACE_INTNAL_DELETE_A__\
601 DCLDebugFree(_ptr, DCL_ALLOC_DELETE_ARRAY, NULL, 0);\
602 }
603 #else // __WINNT_GCC__
604 void* operator new(size_t _size);
605 void operator delete(void* _ptr) noexcept;
606 void* operator new[](size_t _size);
607 void operator delete[](void* _ptr) noexcept;
608
609 #define __WINNT_NEW_DELETE_OVERRIDE\
610 void* operator new(size_t _size)\
611 {\
612 void* r = DCLDebugMalloc(\
613 _size == 0 ? 1 : _size, true, DCL_ALLOC_NEW, NULL, 0\
614 );\
615 __DCL_TRACE_INTNAL_NEW__\
616 return r;\
617 }\
618 void operator delete(void* _ptr) noexcept\
619 {\
620 __DCL_TRACE_INTNAL_DELETE__\
621 DCLDebugFree(_ptr, DCL_ALLOC_DELETE, NULL, 0);\
622 }\
623 void* operator new[](size_t _size)\
624 {\
625 void* r = DCLDebugMalloc(\
626 _size == 0 ? 1 : _size, true, DCL_ALLOC_NEW_ARRAY, NULL, 0\
627 );\
628 __DCL_TRACE_INTNAL_NEW_A__\
629 return r;\
630 }\
631 void operator delete[](void* _ptr) noexcept\
632 {\
633 __DCL_TRACE_INTNAL_DELETE_A__\
634 DCLDebugFree(_ptr, DCL_ALLOC_DELETE_ARRAY, NULL, 0);\
635 }
636 #endif // __WINNT_GCC__
637#else // __WINNT__
638 // MinGW clang++ 및 UNIX g++, clang++에서 DSO 구현이 사용가능하다.
639 // GCC에서 delete를 inline으로 하면 컴파일러가 제공하는 delete가 호출된다.
640 DCLCAPI void* operator new(size_t _size);
641 DCLCAPI void* operator new[](size_t _size);
642 DCLCAPI void operator delete(void* _ptr) noexcept;
643 DCLCAPI void operator delete[](void* _ptr) noexcept;
644#endif
645
646// for default placement
647//#if __GNUC__ >=3 || _MSC_VER >= 1200
648/*
649inline void* operator new(size_t, void* _ptr){ return _ptr; }
650inline void* operator new[](size_t, void* _ptr) { return _ptr; }
651inline void operator delete(void*, void*) { }
652inline void operator delete[](void*, void*) { }
653*/
654//#else
655//#include <new>
656//#endif
657
658//#else /* __DCL_HAVE_ALLOC_DEBUG */
659//#include <new>
660
661#endif /* __DCL_HAVE_ALLOC_DEBUG */
662
663/*****************************************************
664 MACRO FOR ALLOC DEBUG
665*****************************************************/
666
667#if __DCL_HAVE_ALLOC_DEBUG
668
669#define __DCL_ALLOC_INTERNAL false
670#define __DCL_ALLOC_USER true
671#define __DCL_ALLOC_LEVEL __DCL_ALLOC_USER
672
673#define __DCL_DEBUG_NEW \
674 new(__DCL_ALLOC_LEVEL, __THIS_FILE__, __LINE__)
675#define __DCL_DEBUG_MALLOC(size) \
676 DCLDebugMalloc(size, __DCL_ALLOC_LEVEL, DCL_ALLOC_DEFAULT, __THIS_FILE__, __LINE__)
677#define __DCL_DEBUG_CALLOC(count, size) \
678 DCLDebugCalloc(count, size, __DCL_ALLOC_LEVEL, __THIS_FILE__, __LINE__)
679#define __DCL_DEBUG_REALLOC(ptr, size) \
680 DCLDebugRealloc(ptr, size, __DCL_ALLOC_LEVEL, __THIS_FILE__, __LINE__)
681#define __DCL_DEBUG_FREE(ptr) \
682 DCLDebugFree(ptr, DCL_ALLOC_DEFAULT, __THIS_FILE__, __LINE__)
683
684#ifdef __WINNT_GCC__
685 #define __DCL_DEBUG_DELETE(_p) __delete__(_p, __THIS_FILE__, __LINE__)
686 // #define delete(_p) __DCL_DEBUG_DELETE(_p)
687#endif
688
689#define new __DCL_DEBUG_NEW
690#define malloc(size) __DCL_DEBUG_MALLOC(size)
691#define calloc(count, size) __DCL_DEBUG_CALLOC(count, size)
692#define realloc(ptr, size) __DCL_DEBUG_REALLOC(ptr, size)
693#define free(ptr) __DCL_DEBUG_FREE(ptr)
694
695/* macro disable
696#undef new
697#undef malloc
698#undef calloc
699#undef realloc
700#undef free
701*/
702
703#endif // __DCL_HAVE_ALLOC_DEBUG
704
705#ifdef __DCL_HAVE_ALLOC_DEBUG
706#define __DCL_DEBUG_ALLOC_ENTER DCLDebugAllocEnterNear(__THIS_FILE__, __LINE__)
707#define __DCL_DEBUG_ALLOC_LEAVE DCLDebugAllocEnterNear(NULL, 0)
708#else
709#define __DCL_DEBUG_ALLOC_ENTER
710#define __DCL_DEBUG_ALLOC_LEAVE
711#endif
712
713#if 0
714#undef __THIS_FILE__
715#define __THIS_FILE__ __T(__FILE__)
716#endif
717
718#endif // __DCL_OBJECT_H__
#define DCLCAPI
Definition Config.h:95
wchar_t char_t
Definition Config.h:251
#define __noclose__
Definition Config.h:335
#define __DCL_THROWS1(e)
Definition Config.h:152
#define __CONCAT_TEXT(str, expr)
Definition Object.h:65
#define __CONCAT(x, y)
Definition Object.h:56
#define __STRING__(expr)
Definition Object.h:58
#define __T(str)
Definition Object.h:62
pthread_t thread_t
Definition Object.h:29
#define __TEXT(str)
Definition Object.h:61
void(* DCLCleanupCallback)()
Definition Object.h:292
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
bool isInstanceOf(const std::type_info &typeinfo) const
Definition Object.cpp:168
String className() const
Definition Object.cpp:163