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(__linux__)
21 #include <bits/pthreadtypes.h>
22 #elif defined(__APPLE__)
23 #include <sys/_pthread/_pthread_types.h>
34#if __DCL_HAVE_ALLOC_DEBUG && !(__DCL_DEBUG)
35#error "dcl/_Config.h incorrect"
39#error "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
53#define __CONCAT__(x, y) x ## y
54#define __CONCAT(x, y) __CONCAT__(x, y)
56#define __STRING__(expr) #expr
58#define __TEXT__(str) L ## str
59#define __TEXT(str) __TEXT__(str)
60#define __T(str) __TEXT__(str)
61#define _T(str) __TEXT__(str)
63#define __CONCAT_TEXT(str, expr) __TEXT(str) __STRING__(expr)
144 virtual void dump(
Writer& _out)
const;
152#if __DCL_HAVE_ALLOC_DEBUG
160 void*
operator new[](
167 void operator delete(
174 void operator delete[](
181 void*
operator new(size_t);
182 void*
operator new[](size_t);
184 void operator delete(
void* _ptr)
noexcept;
185 void operator delete[](
void* _ptr)
noexcept;
188 void*
operator new(size_t,
void* _ptr) {
return _ptr; }
189 void*
operator new[](size_t,
void* _ptr) {
return _ptr; }
190 void operator delete(
void*,
void*)
noexcept { }
191 void operator delete[](
void*,
void*)
noexcept { }
200 const wchar_t* pszClassName;
202 const ClassInfo* pBaseClassInfo;
204 static const ClassInfo __classInfo;
207 bool isKindOf(
const ClassInfo* pClassInfo)
const;
210 virtual const ClassInfo* classInfo()
const;
212 bool isInstanceOf(
const std::type_info& typeinfo)
const;
213 virtual const std::type_info&
typeInfo()
const;
218#define CLASSINFO_REF const Object::ClassInfo*
219#define CLASSINFO(class_name) (&class_name::__classInfo)
220#define DECLARE_CLASSINFO(class_name) \
222 static const ClassInfo __classInfo; \
223 virtual const ClassInfo* classInfo() const;
225#define CLASSINFO_REF const std::type_info&
226#define CLASSINFO(class_name) (typeid(class_name))
227#define DECLARE_CLASSINFO(class_name) \
229 virtual const std::type_info& typeInfo() const;
233#define IMPLEMENT_CLASSINFO(class_name, base_class_name) \
234const Object::ClassInfo class_name::__classInfo = \
236 __DCL_NAMESPACE_STRING __S(class_name), \
237 sizeof(class class_name), \
238 &base_class_name::__classInfo \
240const Object::ClassInfo* class_name::classInfo() const \
242 return CLASSINFO(class_name); \
245#define IMPLEMENT_CLASSINFO(class_name, base_class_name) \
246const std::type_info& class_name::typeInfo() const \
248 return typeid(class_name); \
255#define DCLInitialize DCLInitializeD
256#define DCLCleanup DCLCleanupD
259#if __DCL_HAVE_MANUAL_INITIALIZE
282#define __DCL_INITIALIZE DCLInitialize();
283#define __DCL_CLEANUP DCLCleanup();
285#define __DCL_INITIALIZE
347#define ASSERT __DCL_ASSERT
348#define ASSERT_EX __DCL_ASSERT_EX
349#define VERIFY __DCL_VERIFY
359#define TRACE0 __DCL_TRACE0
360#define TRACE1 __DCL_TRACE1
361#define TRACE2 __DCL_TRACE2
362#define TRACE3 __DCL_TRACE3
363#define TRACE4 __DCL_TRACE4
364#define TRACE5 __DCL_TRACE5
365#define TRACE6 __DCL_TRACE6
369#define __DCL_ASSERT(expr) \
370 (expr) ? (void) 0 : DCLDebugAssert(__THIS_FILE__, __LINE__, __T(#expr), NULL)
372#define __DCL_ASSERT_EX(expr, msg) \
373 (expr) ? (void) 0 : DCLDebugAssert(__THIS_FILE__, __LINE__, __T(#expr), msg)
375#define __DCL_VERIFY(expr) __DCL_ASSERT(expr)
377#define __DCL_TRACE0(psz) \
378 DCLDebugTrace(__THIS_FILE__, __LINE__, psz)
379#define __DCL_TRACE1(fmt, arg1) \
380 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1)
381#define __DCL_TRACE2(fmt, arg1, arg2) \
382 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2)
383#define __DCL_TRACE3(fmt, arg1, arg2, arg3) \
384 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2, arg3)
385#define __DCL_TRACE4(fmt, arg1, arg2, arg3, arg4) \
386 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2, arg3, arg4)
387#define __DCL_TRACE5(fmt, arg1, arg2, arg3, arg4, arg5) \
388 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2, arg3, arg4, arg5)
389#define __DCL_TRACE6(fmt, arg1, arg2, arg3, arg4, arg5, arg6) \
390 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
394#define __DCL_ASSERT(expr) ((void)0)
395#define __DCL_ASSERT_EX(expr, msg) ((void)0)
396#define __DCL_VERIFY(expr) ((void)(expr))
398#define __DCL_TRACE0(psz)
399#define __DCL_TRACE1(fmt, arg1)
400#define __DCL_TRACE2(fmt, arg1, arg2)
401#define __DCL_TRACE3(fmt, arg1, arg2, arg3)
402#define __DCL_TRACE4(fmt, arg1, arg2, arg3, arg4)
403#define __DCL_TRACE5(fmt, arg1, arg2, arg3, arg4, arg5)
404#define __DCL_TRACE6(fmt, arg1, arg2, arg3, arg4, arg5, arg6)
408#define __DCL_ASSERT_HANDLE(expr) __DCL_ASSERT(expr)
409#define __DCL_ASSERT_PARAM(expr) __DCL_ASSERT(expr)
413#if __DCL_HAVE_ALLOC_DEBUG
416 DCL_ALLOC_DEFAULT = (short) 0,
419 DCL_ALLOC_NEW_OBJECT,
420 DCL_ALLOC_NEW_OBJECT_ARRAY,
422 DCL_ALLOC_DELETE_ARRAY,
423 DCL_ALLOC_DELETE_OBJECT,
424 DCL_ALLOC_DELETE_OBJECT_ARRAY
430DCLCAPI void DCLDebugAllocEnterNear(
466DCLCAPI bool DCLDebugAllocIsValid(
470DCLCAPI void DCLDebugAllocSetCheckFlag(
478DCLCAPI bool DCLDebugAllocGetPosition(
488DCLCAPI const void* DCLDebugGetLastAllocPosition(
493 DCL_ALLOC_DUMP_ALL = 0,
494 DCL_ALLOC_DUMP_INTERNAL,
496} DCLAllocLeakDumpLevel;
502DCLCAPI size_t DCLDebugDumpThreadMemoryLeak(
504 const void* _startPosition,
505 DCLAllocLeakDumpLevel _level,
506 __DCL_NAMESPACE
Writer* _writer
513DCLCAPI size_t DCLDebugDumpGlobalMemoryLeak(
514 DCLAllocLeakDumpLevel _level,
515 __DCL_NAMESPACE
Writer* _writer
551#define __DCL_TRACE_INTNAL_ 0
555#if __DCL_TRACE_INTNAL_
557 #define __DCL_TRACE_INTNAL_DELETE_FN__ \
558 fprintf(stderr, "%s:%d __delete__ %p\n", __FILE__, __LINE__, _ptr);
559 #define __DCL_TRACE_INTNAL_NEW_A__ \
560 fprintf(stderr, "%s:%d new[] %zd %p\n", __FILE__, __LINE__, _size, r);
561 #define __DCL_TRACE_INTNAL_DELETE_A__ \
562 fprintf(stderr, "%s:%d delete[] %p\n", __FILE__, __LINE__, _ptr);
563 #define __DCL_TRACE_INTNAL_NEW__ \
564 fprintf(stderr, "%s:%d new %zd %p\n", __FILE__, __LINE__, _size, r);
565 #define __DCL_TRACE_INTNAL_DELETE__ \
566 fprintf(stderr, "%s:%d delete %p\n", __FILE__, __LINE__, _ptr);
568 #define __DCL_TRACE_INTNAL_DELETE_FN__
569 #define __DCL_TRACE_INTNAL_NEW_A__
570 #define __DCL_TRACE_INTNAL_DELETE_A__
571 #define __DCL_TRACE_INTNAL_NEW__
572 #define __DCL_TRACE_INTNAL_DELETE__
577 template<
typename TYPE>
578 void __delete__(TYPE* _ptr,
const char_t* _filename,
unsigned int _line) {
580 __DCL_TRACE_INTNAL_DELETE_FN__
581 DCLDebugFree(_ptr, DCL_ALLOC_DELETE, _filename, _line);
584 void*
operator new[](
size_t _size);
585 void operator delete[](
void* _ptr)
noexcept;
587 #define __WINNT_NEW_DELETE_OVERRIDE \
588 void* operator new[](size_t _size)\
590 void* r = DCLDebugMalloc(\
591 _size == 0 ? 1 : _size, true, DCL_ALLOC_NEW_ARRAY, NULL, 0\
593 __DCL_TRACE_INTNAL_NEW_A__\
596 void operator delete[](void* _ptr) noexcept\
598 __DCL_TRACE_INTNAL_DELETE_A__\
599 DCLDebugFree(_ptr, DCL_ALLOC_DELETE_ARRAY, NULL, 0);\
602 void*
operator new(
size_t _size);
603 void operator delete(
void* _ptr)
noexcept;
604 void*
operator new[](
size_t _size);
605 void operator delete[](
void* _ptr)
noexcept;
607 #define __WINNT_NEW_DELETE_OVERRIDE\
608 void* operator new(size_t _size)\
610 void* r = DCLDebugMalloc(\
611 _size == 0 ? 1 : _size, true, DCL_ALLOC_NEW, NULL, 0\
613 __DCL_TRACE_INTNAL_NEW__\
616 void operator delete(void* _ptr) noexcept\
618 __DCL_TRACE_INTNAL_DELETE__\
619 DCLDebugFree(_ptr, DCL_ALLOC_DELETE, NULL, 0);\
621 void* operator new[](size_t _size)\
623 void* r = DCLDebugMalloc(\
624 _size == 0 ? 1 : _size, true, DCL_ALLOC_NEW_ARRAY, NULL, 0\
626 __DCL_TRACE_INTNAL_NEW_A__\
629 void operator delete[](void* _ptr) noexcept\
631 __DCL_TRACE_INTNAL_DELETE_A__\
632 DCLDebugFree(_ptr, DCL_ALLOC_DELETE_ARRAY, NULL, 0);\
638 DCLCAPI void*
operator new(
size_t _size);
639 DCLCAPI void*
operator new[](
size_t _size);
640 DCLCAPI void operator delete(
void* _ptr)
noexcept;
641 DCLCAPI void operator delete[](
void* _ptr)
noexcept;
665#if __DCL_HAVE_ALLOC_DEBUG
667#define __DCL_ALLOC_INTERNAL false
668#define __DCL_ALLOC_USER true
669#define __DCL_ALLOC_LEVEL __DCL_ALLOC_USER
671#define __DCL_DEBUG_NEW \
672 new(__DCL_ALLOC_LEVEL, __THIS_FILE__, __LINE__)
673#define __DCL_DEBUG_MALLOC(size) \
674 DCLDebugMalloc(size, __DCL_ALLOC_LEVEL, DCL_ALLOC_DEFAULT, __THIS_FILE__, __LINE__)
675#define __DCL_DEBUG_CALLOC(count, size) \
676 DCLDebugCalloc(count, size, __DCL_ALLOC_LEVEL, __THIS_FILE__, __LINE__)
677#define __DCL_DEBUG_REALLOC(ptr, size) \
678 DCLDebugRealloc(ptr, size, __DCL_ALLOC_LEVEL, __THIS_FILE__, __LINE__)
679#define __DCL_DEBUG_FREE(ptr) \
680 DCLDebugFree(ptr, DCL_ALLOC_DEFAULT, __THIS_FILE__, __LINE__)
683 #define __DCL_DEBUG_DELETE(_p) __delete__(_p, __THIS_FILE__, __LINE__)
687#define new __DCL_DEBUG_NEW
688#define malloc(size) __DCL_DEBUG_MALLOC(size)
689#define calloc(count, size) __DCL_DEBUG_CALLOC(count, size)
690#define realloc(ptr, size) __DCL_DEBUG_REALLOC(ptr, size)
691#define free(ptr) __DCL_DEBUG_FREE(ptr)
703#ifdef __DCL_HAVE_ALLOC_DEBUG
704#define __DCL_DEBUG_ALLOC_ENTER DCLDebugAllocEnterNear(__THIS_FILE__, __LINE__)
705#define __DCL_DEBUG_ALLOC_LEAVE DCLDebugAllocEnterNear(NULL, 0)
707#define __DCL_DEBUG_ALLOC_ENTER
708#define __DCL_DEBUG_ALLOC_LEAVE
713#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