1#ifndef __DCL_OBJECT_H__
2#define __DCL_OBJECT_H__ 20050517
7#error "dcl/Object.h requires C++ Complilation"
10#ifndef __DCL_CONFIG_H__
18#if __DCL_HAVE_ALLOC_DEBUG && !(__DCL_DEBUG)
19#error "dcl/_Config.h incorrect"
23#error "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
37#define __CONCAT__(x, y) x##y
38#define __CONCAT(x, y) __CONCAT__(x, y)
40#define __STRING__(expr) #expr
42#define __TEXT__(str) L##str
43#define __TEXT(str) __TEXT__(str)
44#define __T(str) __TEXT__(str)
45#define _T(str) __TEXT__(str)
47#define __CONCAT_TEXT(str, expr) __TEXT(str) __STRING__(expr)
127 virtual void dump(
Writer& out)
const;
135#if __DCL_HAVE_ALLOC_DEBUG
143 void*
operator new[](
150 void operator delete(
157 void operator delete[](
164 void*
operator new(size_t);
165 void*
operator new[](size_t);
167 void operator delete(
void* _ptr);
168 void operator delete[](
void* _ptr);
171 void*
operator new(size_t,
void* _ptr){
return _ptr; }
172 void*
operator new[](size_t,
void* _ptr) {
return _ptr; }
173 void operator delete(
void*,
void*) { }
174 void operator delete[](
void*,
void*) { }
183 const wchar_t* pszClassName;
185 const ClassInfo* pBaseClassInfo;
187 static const ClassInfo m_classInfo;
190 bool isKindOf(
const ClassInfo* pClassInfo)
const;
193 virtual const ClassInfo* classInfo()
const;
195 bool isInstanceOf(
const std::type_info& typeinfo)
const;
196 virtual const std::type_info&
typeInfo()
const;
201#define CLASSINFO_REF const Object::ClassInfo*
202#define CLASSINFO(class_name) (&class_name::m_classInfo)
203#define DECLARE_CLASSINFO(class_name) \
205 static const ClassInfo m_classInfo; \
206 virtual const ClassInfo* classInfo() const;
208#define CLASSINFO_REF const std::type_info&
209#define CLASSINFO(class_name) (typeid(class_name))
210#define DECLARE_CLASSINFO(class_name) \
212 virtual const std::type_info& typeInfo() const;
216#define IMPLEMENT_CLASSINFO(class_name, base_class_name) \
217const Object::ClassInfo class_name::m_classInfo = \
219 __DCL_NAMESPACE_STRING __S(class_name), \
220 sizeof(class class_name), \
221 &base_class_name::m_classInfo \
223const Object::ClassInfo* class_name::classInfo() const \
225 return CLASSINFO(class_name); \
228#define IMPLEMENT_CLASSINFO(class_name, base_class_name) \
229const std::type_info& class_name::typeInfo() const \
231 return typeid(class_name); \
238#define DCLInitialize DCLInitializeD
239#define DCLCleanup DCLCleanupD
242#if __DCL_HAVE_MANUAL_INITIALIZE
265#define __DCL_INITIALIZE DCLInitialize();
266#define __DCL_CLEANUP DCLCleanup();
268#define __DCL_INITIALIZE
298 unsigned long uThreadId,
332#define ASSERT __DCL_ASSERT
333#define ASSERT_EX __DCL_ASSERT_EX
334#define VERIFY __DCL_VERIFY
342#define TRACE0 __DCL_TRACE0
343#define TRACE1 __DCL_TRACE1
344#define TRACE2 __DCL_TRACE2
345#define TRACE3 __DCL_TRACE3
346#define TRACE4 __DCL_TRACE4
350#define __DCL_ASSERT(expr) \
351 (expr) ? (void) 0 : DCLDebugAssert(__THIS_FILE__, __LINE__, __T(#expr), NULL)
353#define __DCL_ASSERT_EX(expr, msg) \
354 (expr) ? (void) 0 : DCLDebugAssert(__THIS_FILE__, __LINE__, __T(#expr), msg)
356#define __DCL_VERIFY(expr) __DCL_ASSERT(expr)
358#define __DCL_TRACE0(psz) \
359 DCLDebugTrace(__THIS_FILE__, __LINE__, psz)
360#define __DCL_TRACE1(fmt, arg1) \
361 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1)
362#define __DCL_TRACE2(fmt, arg1, arg2) \
363 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2)
364#define __DCL_TRACE3(fmt, arg1, arg2, arg3) \
365 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2, arg3)
366#define __DCL_TRACE4(fmt, arg1, arg2, arg3, arg4) \
367 DCLDebugTrace(__THIS_FILE__, __LINE__, fmt, arg1, arg2, arg3, arg4)
371#define __DCL_ASSERT(expr) ((void)0)
372#define __DCL_ASSERT_EX(expr, msg) ((void)0)
373#define __DCL_VERIFY(expr) ((void)(expr))
375#define __DCL_TRACE0(psz)
376#define __DCL_TRACE1(fmt, arg1)
377#define __DCL_TRACE2(fmt, arg1, arg2)
378#define __DCL_TRACE3(fmt, arg1, arg2, arg3)
379#define __DCL_TRACE4(fmt, arg1, arg2, arg3, arg4)
383#define __DCL_ASSERT_HANDLE(expr) __DCL_ASSERT(expr)
384#define __DCL_ASSERT_PARAM(expr) __DCL_ASSERT(expr)
388#if __DCL_HAVE_ALLOC_DEBUG
394 DCL_ALLOC_NEW_OBJECT,
395 DCL_ALLOC_NEW_OBJECT_ARRAY,
397 DCL_ALLOC_DELETE_ARRAY,
398 DCL_ALLOC_DELETE_OBJECT,
399 DCL_ALLOC_DELETE_OBJECT_ARRAY
405DCLCAPI void DCLDebugAllocEnterNear(
413 DCLAllocFunction allocFunction,
420 DCLAllocFunction allocFunction,
441DCLCAPI bool DCLDebugAllocIsValid(
445DCLCAPI void DCLDebugAllocSetCheckFlag(
453DCLCAPI bool DCLDebugAllocGetPosition(
463DCLCAPI const void* DCLDebugGetLastAllocPosition(
464 unsigned long uThreadId
468 DCL_ALLOC_DUMP_ALL = 0,
469 DCL_ALLOC_DUMP_INTERNAL,
471} DCLAllocLeakDumpLevel;
477DCLCAPI size_t DCLDebugDumpThreadMemoryLeak(
478 unsigned long uThreadId,
479 const void* pvStartPosition,
480 DCLAllocLeakDumpLevel level,
481 __DCL_NAMESPACE
Writer* pWriter
488DCLCAPI size_t DCLDebugDumpGlobalMemoryLeak(
489 DCLAllocLeakDumpLevel level,
490 __DCL_NAMESPACE
Writer* pWriter
533static const char_t __szObject_h[] =
__T(
"dcl/Object.h");
534#define __THIS_FILE__ __szObject_h
538#pragma warning(disable:4595)
540inline void*
operator new(
size_t _size)
542 void*
r = DCLDebugMalloc(
543 _size == 0 ? 1 : _size,
553inline void*
operator new[](
size_t _size)
555 void*
r = DCLDebugMalloc(
556 _size == 0 ? 1 : _size,
566inline void operator delete(
void* _ptr)
569 DCLDebugFree(_ptr, DCL_ALLOC_DELETE,
NULL, 0);
572inline void operator delete[](
void* _ptr)
575 DCLDebugFree(_ptr, DCL_ALLOC_DELETE_ARRAY,
NULL, 0);
582DCLCAPI void*
operator new(
size_t _size);
583DCLCAPI void*
operator new[](
size_t _size);
584DCLCAPI void operator delete(
void* _ptr);
585DCLCAPI void operator delete[](
void* _ptr);
609#if __DCL_HAVE_ALLOC_DEBUG
611#define __DCL_ALLOC_INTERNAL false
612#define __DCL_ALLOC_USER true
613#define __DCL_ALLOC_LEVEL __DCL_ALLOC_USER
615#define __DCL_DEBUG_NEW \
616 new(__DCL_ALLOC_LEVEL, __THIS_FILE__, __LINE__)
617#define __DCL_DEBUG_MALLOC(size) \
618 DCLDebugMalloc(size, __DCL_ALLOC_LEVEL, DCL_ALLOC_DEFAULT, __THIS_FILE__, __LINE__)
619#define __DCL_DEBUG_CALLOC(count, size) \
620 DCLDebugCalloc(count, size, __DCL_ALLOC_LEVEL, __THIS_FILE__, __LINE__)
621#define __DCL_DEBUG_REALLOC(ptr, size) \
622 DCLDebugRealloc(ptr, size, __DCL_ALLOC_LEVEL, __THIS_FILE__, __LINE__)
623#define __DCL_DEBUG_FREE(ptr) \
624 DCLDebugFree(ptr, DCL_ALLOC_DEFAULT, __THIS_FILE__, __LINE__)
626#define new __DCL_DEBUG_NEW
627#define malloc(size) __DCL_DEBUG_MALLOC(size)
628#define calloc(count, size) __DCL_DEBUG_CALLOC(count, size)
629#define realloc(ptr, size) __DCL_DEBUG_REALLOC(ptr, size)
630#define free(ptr) __DCL_DEBUG_FREE(ptr)
642#ifdef __DCL_HAVE_ALLOC_DEBUG
643#define __DCL_DEBUG_ALLOC_ENTER DCLDebugAllocEnterNear(__THIS_FILE__, __LINE__)
644#define __DCL_DEBUG_ALLOC_LEAVE DCLDebugAllocEnterNear(NULL, 0)
646#define __DCL_DEBUG_ALLOC_ENTER
647#define __DCL_DEBUG_ALLOC_LEAVE
651#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