X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0c32066b58849e52e4d76e30982414d9f4daae6a..6c7873e1a58afbdef698e092db0852ed490ea9e1:/include/wx/object.h diff --git a/include/wx/object.h b/include/wx/object.h index 83b86a7d08..458f5e78e6 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -6,7 +6,7 @@ // Created: 01/02/97 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_OBJECTH__ @@ -17,25 +17,33 @@ #endif #include "wx/defs.h" +#include "wx/memory.h" class WXDLLEXPORT wxObject; -#if USE_DYNAMIC_CLASSES +#if wxUSE_DYNAMIC_CLASSES -#ifdef __GNUWIN32__ +// #ifdef __GNUWIN32__ #ifdef GetClassName #undef GetClassName #endif +#ifdef GetClassInfo +#undef GetClassInfo #endif +// #endif class WXDLLEXPORT wxClassInfo; -class WXDLLIMPORT ostream; class WXDLLEXPORT wxInputStream; +class WXDLLEXPORT wxOutputStream; class WXDLLEXPORT wxObjectInputStream; class WXDLLEXPORT wxObjectOutputStream; class WXDLLEXPORT wxHashTable; class WXDLLEXPORT wxObject_Serialize; +#if wxUSE_STD_IOSTREAM && (defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT) + #include "wx/ioswrap.h" +#endif + /* * Dynamic object system declarations */ @@ -45,22 +53,22 @@ typedef wxObject * (*wxObjectConstructorFn) (void); class WXDLLEXPORT wxClassInfo { public: - wxClassInfo(char *cName, char *baseName1, char *baseName2, int sz, wxObjectConstructorFn fn); + wxClassInfo(wxChar *cName, wxChar *baseName1, wxChar *baseName2, int sz, wxObjectConstructorFn fn); wxObject *CreateObject(void); - - inline char *GetClassName(void) const { return m_className; } - inline char *GetBaseClassName1(void) const { return m_baseClassName1; } - inline char *GetBaseClassName2(void) const { return m_baseClassName2; } + + inline wxChar *GetClassName(void) const { return m_className; } + inline wxChar *GetBaseClassName1(void) const { return m_baseClassName1; } + inline wxChar *GetBaseClassName2(void) const { return m_baseClassName2; } inline wxClassInfo* GetBaseClass1() const { return m_baseInfo1; } inline wxClassInfo* GetBaseClass2() const { return m_baseInfo2; } inline int GetSize(void) const { return m_objectSize; } inline wxObjectConstructorFn GetConstructor() const { return m_objectConstructor; } - inline wxClassInfo* GetFirst() const { return sm_first; } + static inline wxClassInfo* GetFirst() { return sm_first; } inline wxClassInfo* GetNext() const { return m_next; } - bool IsKindOf(wxClassInfo *info); + bool IsKindOf(wxClassInfo *info) const; - static wxClassInfo *FindClass(char *c); + static wxClassInfo *FindClass(wxChar *c); // Initializes parent pointers and hash table for fast searching. static void InitializeClasses(void); @@ -69,12 +77,12 @@ class WXDLLEXPORT wxClassInfo static void CleanUpClasses(void); public: - char* m_className; - char* m_baseClassName1; - char* m_baseClassName2; + wxChar* m_className; + wxChar* m_baseClassName1; + wxChar* m_baseClassName2; int m_objectSize; wxObjectConstructorFn m_objectConstructor; - + // Pointers to base wxClassInfos: set in InitializeClasses // called from wx_main.cc wxClassInfo* m_baseInfo1; @@ -86,16 +94,16 @@ public: static wxHashTable* sm_classTable; }; -wxObject* WXDLLEXPORT wxCreateDynamicObject(const char *name); +WXDLLEXPORT wxObject* wxCreateDynamicObject(const wxChar *name); -#ifdef USE_SERIAL -wxObject* WXDLLEXPORT wxCreateStoredObject( wxInputStream& stream ); +#if wxUSE_SERIAL +WXDLLEXPORT wxObject* wxCreateStoredObject( wxInputStream& stream ); #endif #define DECLARE_DYNAMIC_CLASS(name) \ public:\ static wxClassInfo sm_class##name;\ - wxClassInfo *GetClassInfo() \ + wxClassInfo *GetClassInfo() const \ { return &name::sm_class##name; } #define DECLARE_ABSTRACT_CLASS(name) DECLARE_DYNAMIC_CLASS(name) @@ -109,13 +117,13 @@ wxObject* WXDLLEXPORT wxCreateStoredObject( wxInputStream& stream ); #define IMPLEMENT_DYNAMIC_CLASS(name, basename) \ wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void) \ { return new name; }\ - wxClassInfo name::sm_class##name((char *) #name, (char *) #basename, (char *) NULL, (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name); + wxClassInfo name::sm_class##name((wxChar *) wxT(#name), (wxChar *) wxT(#basename), (wxChar *) NULL, (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name); // Multiple inheritance with two base classes #define IMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) \ wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void) \ { return new name; }\ - wxClassInfo name::sm_class##name((char *) #name, (char *) #basename1, (char *) #basename2, (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name); + wxClassInfo name::sm_class##name((wxChar *) wxT(#name), (wxChar *) wxT(#basename1), (wxChar *) wxT(#basename2), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name); ////// ////// for abstract classes @@ -123,19 +131,20 @@ wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void) \ // Single inheritance with one base class #define IMPLEMENT_ABSTRACT_CLASS(name, basename) \ - wxClassInfo name::sm_class##name((char *) #name, (char *) #basename, \ - (char *) NULL, (int) sizeof(name), (wxObjectConstructorFn) NULL); + wxClassInfo name::sm_class##name((wxChar *) wxT(#name), (wxChar *) wxT(#basename), \ + (wxChar *) NULL, (int) sizeof(name), (wxObjectConstructorFn) NULL); // Multiple inheritance with two base classes #define IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ - wxClassInfo name::sm_class##name((char *) #name, (char *) #basename1, (char *) #basename2, (int) sizeof(name), (wxObjectConstructorFn) NULL); + wxClassInfo name::sm_class##name((wxChar *) wxT(#name), (wxChar *) wxT(#basename1), \ + (wxChar *) wxT(#basename2), (int) sizeof(name), (wxObjectConstructorFn) NULL); #define IMPLEMENT_CLASS IMPLEMENT_ABSTRACT_CLASS #define IMPLEMENT_CLASS2 IMPLEMENT_ABSTRACT_CLASS2 #define CLASSINFO(name) (&name::sm_class##name) -#else +#else // !wxUSE_DYNAMIC_CLASSES // No dynamic class system: so stub out the macros #define DECLARE_DYNAMIC_CLASS(name) @@ -148,17 +157,41 @@ wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void) \ #define IMPLEMENT_CLASS IMPLEMENT_ABSTRACT_CLASS #define IMPLEMENT_CLASS2 IMPLEMENT_ABSTRACT_CLASS2 -#endif +#endif // wxUSE_DYNAMIC_CLASSES/!wxUSE_DYNAMIC_CLASSES + +#define wxIS_KIND_OF(obj, className) obj->IsKindOf(&className::sm_class##className) -#define IS_KIND_OF(obj, className) obj->IsKindOf(&className::sm_class##className) +// Just seems a bit nicer-looking (pretend it's not a macro) +#define wxIsKindOf(obj, className) obj->IsKindOf(&className::sm_class##className) + +// to be replaced by dynamic_cast<> in the future +#define wxDynamicCast(obj, className) \ + ((obj) && ((obj)->IsKindOf(&className::sm_class##className)) \ + ? (className *)(obj) \ + : (className *)0) + +#define wxConstCast(obj, className) ((className *)(obj)) + +#ifdef __WXDEBUG__ + inline void wxCheckCast(void *ptr) + { + wxASSERT_MSG( ptr, _T("wxStaticCast() used incorrectly") ); + } + + #define wxStaticCast(obj, className) \ + (wxCheckCast(wxDynamicCast(obj, className)), ((className *)(obj))) + +#else // !Debug + #define wxStaticCast(obj, className) ((className *)(obj)) +#endif // Debug/!Debug // Unfortunately Borland seems to need this include. #ifdef __BORLANDC__ -#if USE_IOSTREAMH -#include -#else -#include -#endif + #if wxUSE_IOSTREAMH + #include + #else + #include + #endif #endif class WXDLLEXPORT wxObjectRefData; @@ -173,27 +206,48 @@ class WXDLLEXPORT wxObject wxObject(void); virtual ~wxObject(void); - virtual wxClassInfo *GetClassInfo(void) { return &sm_classwxObject; } + virtual wxClassInfo *GetClassInfo(void) const { return &sm_classwxObject; } + wxObject *Clone(void) const; + virtual void CopyObject(wxObject& object_dest) const; - bool IsKindOf(wxClassInfo *info); + bool IsKindOf(wxClassInfo *info) const; -#if WXDEBUG && USE_MEMORY_TRACING - void * operator new (size_t size, char * fileName = NULL, int lineNum = 0); +#if defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING + void * operator new (size_t size, wxChar * fileName = NULL, int lineNum = 0); + +#if defined(__VISAGECPP__) + #if __DEBUG_ALLOC__ + void operator delete (void * buf,const char * _fname, size_t _line); + #endif //__DEBUG_ALLOC__ +#else void operator delete (void * buf); - - // Cause problems for VC++ -#ifndef _MSC_VER - void * operator new[] (size_t size, char * fileName = NULL, int lineNum = 0); +#endif + // defined(__VISAGECPP__) + +// VC++ 6.0 +#if defined(__VISUALC__) && (__VISUALC__ >= 1200) + void operator delete(void *buf, wxChar*, int); +#endif + + // Causes problems for VC++ +#if wxUSE_ARRAY_MEMORY_OPERATORS && !defined(__VISUALC__) && !defined( __MWERKS__) + void * operator new[] (size_t size, wxChar * fileName = NULL, int lineNum = 0); void operator delete[] (void * buf); #endif +#ifdef __MWERKS__ + void * operator new[] (size_t size, wxChar * fileName , int lineNum = 0); + void * operator new[] (size_t size) { return operator new[] ( size , NULL , 0 ) ; } + void operator delete[] (void * buf); #endif -#if WXDEBUG || USE_DEBUG_CONTEXT +#endif // Debug & memory tracing + +#if wxUSE_STD_IOSTREAM && (defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT) virtual void Dump(ostream& str); #endif -#ifdef USE_SERIAL +#if wxUSE_SERIAL virtual void StoreObject( wxObjectOutputStream &stream ); virtual void LoadObject( wxObjectInputStream &stream ); #endif @@ -207,9 +261,17 @@ class WXDLLEXPORT wxObject inline wxObjectRefData *GetRefData(void) const { return m_refData; } inline void SetRefData(wxObjectRefData *data) { m_refData = data; } +//EK +#if defined(__WXDEBUG__) && defined(__VISAGECPP__) +public: + static int N; + static int Nid; // total number of objects and serial counter + int id; // serial number for current object +#endif // __WXDEBUG__ + protected: wxObjectRefData* m_refData; -#ifdef USE_SERIAL +#if wxUSE_SERIAL wxObject_Serialize* m_serialObj; #endif }; @@ -231,11 +293,20 @@ private: int m_count; }; -#if WXDEBUG && USE_GLOBAL_MEMORY_OPERATORS +#ifdef __WXDEBUG__ #ifndef WXDEBUG_NEW -#define WXDEBUG_NEW new(__FILE__,__LINE__) +#define WXDEBUG_NEW new(__TFILE__,__LINE__) #endif -#define new WXDEBUG_NEW +#else +#define WXDEBUG_NEW new +#endif + +// Redefine new to be the debugging version. This doesn't +// work with all compilers, in which case you need to +// use WXDEBUG_NEW explicitly if you wish to use the debugging version. + +#if defined(__WXDEBUG__) && wxUSE_GLOBAL_MEMORY_OPERATORS && wxUSE_DEBUG_NEW_ALWAYS +#define new new(__TFILE__,__LINE__) #endif #endif