1#ifndef __DCL_OBJECT_H__
2#define __DCL_OBJECT_H__ 20050517
5#error "dcl/Object.h requires C++ Complilation"
8#ifndef __DCL_CONFIG_H__
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>
36#if __DCL_HAVE_ALLOC_DEBUG && !(__DCL_DEBUG)
37#error "dcl/_Config.h incorrect"
41#error "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
55#define __CONCAT__(x, y) x ## y
56#define __CONCAT(x, y) __CONCAT__(x, y)
58#define __STRING__(expr) #expr
60#define __TEXT__(str) L ## str
61#define __TEXT(str) __TEXT__(str)
62#define __T(str) __TEXT__(str)
63#define _T(str) __TEXT__(str)
65#define __CONCAT_TEXT(str, expr) __TEXT(str) __STRING__(expr)
146 virtual void dump(
Writer& _out)
const;
154#if __DCL_HAVE_ALLOC_DEBUG
162 void*
operator new[](
169 void operator delete(
176 void operator delete[](
183 void*
operator new(size_t);
184 void*
operator new[](size_t);
186 void operator delete(
void* _ptr)
noexcept;
187 void operator delete[](
void* _ptr)
noexcept;
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 { }
202 const wchar_t* pszClassName;
204 const ClassInfo* pBaseClassInfo;
206 static const ClassInfo __classInfo;
209 bool isKindOf(
const ClassInfo* pClassInfo)
const;
212 virtual const ClassInfo* classInfo()
const;
214 bool isInstanceOf(
const std::type_info& typeinfo)
const;
215 virtual const std::type_info&
typeInfo()
const;
220#define CLASSINFO_REF const Object::ClassInfo*
221#define CLASSINFO(class_name) (&class_name::__classInfo)
222#define DECLARE_CLASSINFO(class_name) \
224 static const ClassInfo __classInfo; \
225 virtual const ClassInfo* classInfo() const;
227#define CLASSINFO_REF const std::type_info&
228#define CLASSINFO(class_name) (typeid(class_name))
229#define DECLARE_CLASSINFO(class_name) \
231 virtual const std::type_info& typeInfo() const;
235#define IMPLEMENT_CLASSINFO(class_name, base_class_name) \
236const Object::ClassInfo class_name::__classInfo = \
238 __DCL_NAMESPACE_STRING __S(class_name), \
239 sizeof(class class_name), \
240 &base_class_name::__classInfo \
242const Object::ClassInfo* class_name::classInfo() const \
244 return CLASSINFO(class_name); \
247#define IMPLEMENT_CLASSINFO(class_name, base_class_name) \
248const std::type_info& class_name::typeInfo() const \
250 return typeid(class_name); \
257#define DCLInitialize DCLInitializeD
258#define DCLCleanup DCLCleanupD
261#if __DCL_HAVE_MANUAL_INITIALIZE
284#define __DCL_INITIALIZE DCLInitialize();
285#define __DCL_CLEANUP DCLCleanup();
287#define __DCL_INITIALIZE
349#define ASSERT __DCL_ASSERT
350#define ASSERT_EX __DCL_ASSERT_EX
351#define VERIFY __DCL_VERIFY
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
371#define __DCL_ASSERT(expr) \
372 (expr) ? (void) 0 : DCLDebugAssert(__THIS_FILE__, __LINE__, __T(#expr), NULL)
374#define __DCL_ASSERT_EX(expr, msg) \
375 (expr) ? (void) 0 : DCLDebugAssert(__THIS_FILE__, __LINE__, __T(#expr), msg)
377#define __DCL_VERIFY(expr) __DCL_ASSERT(expr)
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)
396#define __DCL_ASSERT(expr) ((void)0)
397#define __DCL_ASSERT_EX(expr, msg) ((void)0)
398#define __DCL_VERIFY(expr) ((void)(expr))
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)
410#define __DCL_ASSERT_HANDLE(expr) __DCL_ASSERT(expr)
411#define __DCL_ASSERT_PARAM(expr) __DCL_ASSERT(expr)
415#if __DCL_HAVE_ALLOC_DEBUG
418 DCL_ALLOC_DEFAULT = (short) 0,
421 DCL_ALLOC_NEW_OBJECT,
422 DCL_ALLOC_NEW_OBJECT_ARRAY,
424 DCL_ALLOC_DELETE_ARRAY,
425 DCL_ALLOC_DELETE_OBJECT,
426 DCL_ALLOC_DELETE_OBJECT_ARRAY
432DCLCAPI void DCLDebugAllocEnterNear(
468DCLCAPI bool DCLDebugAllocIsValid(
472DCLCAPI void DCLDebugAllocSetCheckFlag(
480DCLCAPI bool DCLDebugAllocGetPosition(
490DCLCAPI const void* DCLDebugGetLastAllocPosition(
495 DCL_ALLOC_DUMP_ALL = 0,
496 DCL_ALLOC_DUMP_INTERNAL,
498} DCLAllocLeakDumpLevel;
504DCLCAPI size_t DCLDebugDumpThreadMemoryLeak(
506 const void* _startPosition,
507 DCLAllocLeakDumpLevel _level,
508 __DCL_NAMESPACE
Writer* _writer
515DCLCAPI size_t DCLDebugDumpGlobalMemoryLeak(
516 DCLAllocLeakDumpLevel _level,
517 __DCL_NAMESPACE
Writer* _writer
553#define __DCL_TRACE_INTNAL_ 0
557#if __DCL_TRACE_INTNAL_
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);
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__
579 template<
typename TYPE>
580 void __delete__(TYPE* _ptr,
const char_t* _filename,
unsigned int _line) {
582 __DCL_TRACE_INTNAL_DELETE_FN__
583 DCLDebugFree(_ptr, DCL_ALLOC_DELETE, _filename, _line);
586 void*
operator new[](
size_t _size);
587 void operator delete[](
void* _ptr)
noexcept;
589 #define __WINNT_NEW_DELETE_OVERRIDE \
590 void* operator new[](size_t _size)\
592 void* r = DCLDebugMalloc(\
593 _size == 0 ? 1 : _size, true, DCL_ALLOC_NEW_ARRAY, NULL, 0\
595 __DCL_TRACE_INTNAL_NEW_A__\
598 void operator delete[](void* _ptr) noexcept\
600 __DCL_TRACE_INTNAL_DELETE_A__\
601 DCLDebugFree(_ptr, DCL_ALLOC_DELETE_ARRAY, NULL, 0);\
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;
609 #define __WINNT_NEW_DELETE_OVERRIDE\
610 void* operator new(size_t _size)\
612 void* r = DCLDebugMalloc(\
613 _size == 0 ? 1 : _size, true, DCL_ALLOC_NEW, NULL, 0\
615 __DCL_TRACE_INTNAL_NEW__\
618 void operator delete(void* _ptr) noexcept\
620 __DCL_TRACE_INTNAL_DELETE__\
621 DCLDebugFree(_ptr, DCL_ALLOC_DELETE, NULL, 0);\
623 void* operator new[](size_t _size)\
625 void* r = DCLDebugMalloc(\
626 _size == 0 ? 1 : _size, true, DCL_ALLOC_NEW_ARRAY, NULL, 0\
628 __DCL_TRACE_INTNAL_NEW_A__\
631 void operator delete[](void* _ptr) noexcept\
633 __DCL_TRACE_INTNAL_DELETE_A__\
634 DCLDebugFree(_ptr, DCL_ALLOC_DELETE_ARRAY, NULL, 0);\
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;
667#if __DCL_HAVE_ALLOC_DEBUG
669#define __DCL_ALLOC_INTERNAL false
670#define __DCL_ALLOC_USER true
671#define __DCL_ALLOC_LEVEL __DCL_ALLOC_USER
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__)
685 #define __DCL_DEBUG_DELETE(_p) __delete__(_p, __THIS_FILE__, __LINE__)
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)
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)
709#define __DCL_DEBUG_ALLOC_ENTER
710#define __DCL_DEBUG_ALLOC_LEAVE
715#define __THIS_FILE__ __T(__FILE__)
#define __CONCAT_TEXT(str, expr)
void(* DCLCleanupCallback)()
virtual const std::type_info & typeInfo() const
virtual String toString() const
bool isInstanceOf(const std::type_info &typeinfo) const