X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9838df2cefc5b368bb11f98c784ecc78f45ecaf7..b1d66b5415f7befb45e050d7097571642b8bfa56:/include/wx/object.h diff --git a/include/wx/object.h b/include/wx/object.h index b914b190dc..69e3796842 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__ @@ -34,19 +34,14 @@ class WXDLLEXPORT wxObject; class WXDLLEXPORT wxClassInfo; class WXDLLEXPORT wxInputStream; +class WXDLLEXPORT wxOutputStream; class WXDLLEXPORT wxObjectInputStream; class WXDLLEXPORT wxObjectOutputStream; class WXDLLEXPORT wxHashTable; class WXDLLEXPORT wxObject_Serialize; -#if wxUSE_IOSTREAMH -// N.B. BC++ doesn't have istream.h, ostream.h -# include -#else -# include -# ifdef _MSC_VER - using namespace std; -# endif +#if wxUSE_STD_IOSTREAM && (defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT) + #include "wx/ioswrap.h" #endif /* @@ -57,49 +52,54 @@ typedef wxObject * (*wxObjectConstructorFn) (void); class WXDLLEXPORT wxClassInfo { - public: - wxClassInfo(char *cName, char *baseName1, char *baseName2, int sz, wxObjectConstructorFn fn); +public: + wxClassInfo(const wxChar *cName, + const wxChar *baseName1, + const 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 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; } - static inline wxClassInfo* GetFirst() { return sm_first; } - inline wxClassInfo* GetNext() const { return m_next; } - bool IsKindOf(wxClassInfo *info) const; - - static wxClassInfo *FindClass(char *c); + + const wxChar *GetClassName() const { return m_className; } + const wxChar *GetBaseClassName1() const { return m_baseClassName1; } + const wxChar *GetBaseClassName2() const { return m_baseClassName2; } + const wxClassInfo* GetBaseClass1() const { return m_baseInfo1; } + const wxClassInfo* GetBaseClass2() const { return m_baseInfo2; } + int GetSize() const { return m_objectSize; } + wxObjectConstructorFn GetConstructor() const { return m_objectConstructor; } + static const wxClassInfo* GetFirst() { return sm_first; } + const wxClassInfo* GetNext() const { return m_next; } + bool IsKindOf(const wxClassInfo *info) const; + + static wxClassInfo *FindClass(const wxChar *c); // Initializes parent pointers and hash table for fast searching. - static void InitializeClasses(void); + static void InitializeClasses(); // Cleans up hash table used for fast searching. - static void CleanUpClasses(void); + static void CleanUpClasses(); public: - char* m_className; - char* m_baseClassName1; - char* m_baseClassName2; + const wxChar* m_className; + const wxChar* m_baseClassName1; + const wxChar* m_baseClassName2; int m_objectSize; wxObjectConstructorFn m_objectConstructor; - + // Pointers to base wxClassInfos: set in InitializeClasses - // called from wx_main.cc - wxClassInfo* m_baseInfo1; - wxClassInfo* m_baseInfo2; + const wxClassInfo* m_baseInfo1; + const wxClassInfo* m_baseInfo2; + // class info object live in a linked list: pointers to its head and the + // next element in it static wxClassInfo* sm_first; wxClassInfo* m_next; static wxHashTable* sm_classTable; }; -WXDLLEXPORT wxObject* wxCreateDynamicObject(const char *name); +WXDLLEXPORT wxObject* wxCreateDynamicObject(const wxChar *name); #if wxUSE_SERIAL WXDLLEXPORT wxObject* wxCreateStoredObject( wxInputStream& stream ); @@ -122,13 +122,13 @@ WXDLLEXPORT wxObject* 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 @@ -136,19 +136,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) @@ -161,19 +162,47 @@ 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) // 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) \ + (className *) wxCheckDynamicCast((wxObject*)(obj), &className::sm_class##className) + +// The 'this' pointer is always true, so use this version to cast the this +// pointer and avoid compiler warnings. +#define wxDynamicCastThis(className) \ + (IsKindOf(&className::sm_class##className) \ + ? (className *)(this) \ + : (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. +#if wxUSE_STD_IOSTREAM && (defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT) #ifdef __BORLANDC__ -#if wxUSE_IOSTREAMH -#include -#else -#include + #if wxUSE_IOSTREAMH + #include + #else + #include + #endif #endif #endif @@ -194,32 +223,36 @@ class WXDLLEXPORT wxObject bool IsKindOf(wxClassInfo *info) const; #if defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING - void * operator new (size_t size, char * fileName = NULL, int lineNum = 0); - void operator delete (void * buf); + 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 // Everybody else + void operator delete (void * buf); +# endif // end of VISAGECPP // VC++ 6.0 -#if _MSC_VER >= 1200 - void operator delete(void *buf, char*, int); -#endif +# if defined(__VISUALC__) && (__VISUALC__ >= 1200) + void operator delete(void *buf, wxChar*, int); +# endif - // Cause problems for VC++ -// #ifndef _MSC_VER -#if !defined(_MSC_VER) && wxUSE_ARRAY_MEMORY_OPERATORS - void * operator new[] (size_t size, char * fileName = NULL, int lineNum = 0); - void operator delete[] (void * buf); -#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, char * fileName , 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 -#endif +#endif // Debug & memory tracing -#if defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT - virtual void Dump(ostream& str); +#if wxUSE_STD_IOSTREAM && (defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT) + virtual void Dump(wxSTD ostream& str); #endif #if wxUSE_SERIAL @@ -260,9 +293,14 @@ private: int m_count; }; +inline wxObject *wxCheckDynamicCast(wxObject *obj, wxClassInfo *classInfo) +{ + return obj && obj->GetClassInfo()->IsKindOf(classInfo) ? obj : 0; +} + #ifdef __WXDEBUG__ #ifndef WXDEBUG_NEW -#define WXDEBUG_NEW new(__FILE__,__LINE__) +#define WXDEBUG_NEW new(__TFILE__,__LINE__) #endif #else #define WXDEBUG_NEW new @@ -273,7 +311,7 @@ private: // 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(__FILE__,__LINE__) +#define new new(__TFILE__,__LINE__) #endif #endif