X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b2aef89b7a675805b601e757492c982031f38d21..06cfab17389f4bbd38560dd86ee39931e979bb1e:/include/wx/object.h?ds=sidebyside diff --git a/include/wx/object.h b/include/wx/object.h index 3d502ef930..ca3ade770a 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -9,18 +9,19 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef __OBJECTH__ -#define __OBJECTH__ +#ifndef _WX_OBJECTH__ +#define _WX_OBJECTH__ #ifdef __GNUG__ #pragma interface "object.h" #endif #include "wx/defs.h" +#include "wx/memory.h" class WXDLLEXPORT wxObject; -#if USE_DYNAMIC_CLASSES +#if wxUSE_DYNAMIC_CLASSES #ifdef __GNUWIN32__ #ifdef GetClassName @@ -29,9 +30,21 @@ class WXDLLEXPORT wxObject; #endif class WXDLLEXPORT wxClassInfo; - -class WXDLLIMPORT istream; -class WXDLLIMPORT ostream; +class WXDLLEXPORT wxInputStream; +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 +#endif /* * Dynamic object system declarations @@ -39,74 +52,65 @@ class WXDLLIMPORT ostream; typedef wxObject * (*wxObjectConstructorFn) (void); -#ifdef USE_STORABLE_CLASSES -typedef wxObject* (*wxStorableConstructorFn) ( istream &stream, char *data ); -#endif - class WXDLLEXPORT wxClassInfo { public: - char *className; - char *baseClassName1; - char *baseClassName2; - int objectSize; - wxObjectConstructorFn objectConstructor; + wxClassInfo(char *cName, char *baseName1, char *baseName2, int sz, wxObjectConstructorFn fn); + + wxObject *CreateObject(void); -#ifdef USE_STORABLE_CLASSES - wxStorableConstructorFn storableConstructor; -#endif + 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; - // Pointers to base wxClassInfos: set in InitializeClasses - // called from wx_main.cc - wxClassInfo *baseInfo1; - wxClassInfo *baseInfo2; + static wxClassInfo *FindClass(char *c); - static wxClassInfo *first; - wxClassInfo *next; + // Initializes parent pointers and hash table for fast searching. + static void InitializeClasses(void); -#ifdef USE_STORABLE_CLASSES - wxClassInfo(char *cName, char *baseName1, char *baseName2, int sz, wxObjectConstructorFn fn, - wxStorableConstructorFn stoFn = NULL ); -#else - wxClassInfo(char *cName, char *baseName1, char *baseName2, int sz, wxObjectConstructorFn fn); -#endif + // Cleans up hash table used for fast searching. + static void CleanUpClasses(void); - wxObject *CreateObject(void); +public: + char* m_className; + char* m_baseClassName1; + char* m_baseClassName2; + int m_objectSize; + wxObjectConstructorFn m_objectConstructor; -#ifdef USE_STORABLE_CLASSES - wxObject* CreateObject( istream &stream, char *data ); -#endif + // Pointers to base wxClassInfos: set in InitializeClasses + // called from wx_main.cc + wxClassInfo* m_baseInfo1; + wxClassInfo* m_baseInfo2; - inline char *GetClassName(void) const { return className; } - inline char *GetBaseClassName1(void) const { return baseClassName1; } - inline char *GetBaseClassName2(void) const { return baseClassName2; } - inline int GetSize(void) const { return objectSize; } - bool IsKindOf(wxClassInfo *info); + static wxClassInfo* sm_first; + wxClassInfo* m_next; - static wxClassInfo *FindClass(char *c); - // Initializes parent pointers for fast searching. - static void InitializeClasses(void); + static wxHashTable* sm_classTable; }; -wxObject* WXDLLEXPORT wxCreateDynamicObject(char *name); +WXDLLEXPORT wxObject* wxCreateDynamicObject(const char *name); -#ifdef USE_STORABLE_CLASSES -wxObject* WXDLLEXPORT wxCreateStoredObject( char *name, istream &stream, char *data ); +#ifdef wxUSE_SERIAL +WXDLLEXPORT wxObject* wxCreateStoredObject( wxInputStream& stream ); #endif #define DECLARE_DYNAMIC_CLASS(name) \ public:\ - static wxClassInfo class##name;\ - wxClassInfo *GetClassInfo() \ - { return &name::class##name; } + static wxClassInfo sm_class##name;\ + wxClassInfo *GetClassInfo() const \ + { return &name::sm_class##name; } #define DECLARE_ABSTRACT_CLASS(name) DECLARE_DYNAMIC_CLASS(name) #define DECLARE_CLASS(name) DECLARE_DYNAMIC_CLASS(name) -#ifdef USE_STORABLE_CLASSES -#define DECLARE_STORABLECLASS(name) DECLARE_DYNAMIC_CLASS(name) -#endif - ////// ////// for concrete classes ////// @@ -115,54 +119,31 @@ wxObject* WXDLLEXPORT wxCreateStoredObject( char *name, istream &stream, char *d #define IMPLEMENT_DYNAMIC_CLASS(name, basename) \ wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void) \ { return new name; }\ - wxClassInfo name::class##name(#name, #basename, NULL, sizeof(name), wxConstructorFor##name); + wxClassInfo name::sm_class##name((char *) #name, (char *) #basename, (char *) 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::class##name(#name, #basename1, #basename2, sizeof(name), wxConstructorFor##name); - -////// -////// for storable classes -////// - -#ifdef USE_STORABLE_CLASSES - -#define IMPLEMENT_STORABLE_CLASS(name, basename) \ -wxObject* WXDLLEXPORT_CTORFN wxStorableConstructorFor##name( istream* stream, char* data )\ - { return new name( stream, data ); }\ -wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void)\ - { return new name; }\ - wxClassInfo name::class##name(#name, #basename, NULL, sizeof(name), wxConstructorFor##name,\ - wxStorableConstructorFor##name ); - -#define IMPLEMENT_STORABLE_CLASS2(name, basename1, basename2) \ -wxObject* WXDLLEXPORT_CTORFN wxStorableConstructorFor##name( istream* stream, char* data )\ - { return new name( stream, data ); }\ -wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void)\ - { return new name; }\ - wxClassInfo name::class##name(#name, #basename1, basename2, sizeof(name), wxConstructorFor##name,\ - wxStorableConstructorFor##name ); + wxClassInfo name::sm_class##name((char *) #name, (char *) #basename1, (char *) #basename2, (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name); -#endif - ////// ////// for abstract classes ////// // Single inheritance with one base class #define IMPLEMENT_ABSTRACT_CLASS(name, basename) \ - wxClassInfo name::class##name(#name, #basename, NULL, sizeof(name), NULL); + wxClassInfo name::sm_class##name((char *) #name, (char *) #basename, \ + (char *) NULL, (int) sizeof(name), (wxObjectConstructorFn) NULL); // Multiple inheritance with two base classes #define IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ - wxClassInfo name::class##name(#name, #basename1, #basename2, sizeof(name), NULL); + wxClassInfo name::sm_class##name((char *) #name, (char *) #basename1, (char *) #basename2, (int) sizeof(name), (wxObjectConstructorFn) NULL); #define IMPLEMENT_CLASS IMPLEMENT_ABSTRACT_CLASS #define IMPLEMENT_CLASS2 IMPLEMENT_ABSTRACT_CLASS2 -#define CLASSINFO(name) (&name::class##name) +#define CLASSINFO(name) (&name::sm_class##name) #else @@ -179,11 +160,14 @@ wxObject* WXDLLEXPORT_CTORFN wxConstructorFor##name(void)\ #endif -#define IS_KIND_OF(obj, className) obj->IsKindOf(&className::class##name) +#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) // Unfortunately Borland seems to need this include. #ifdef __BORLANDC__ -#if USE_IOSTREAMH +#if wxUSE_IOSTREAMH #include #else #include @@ -197,33 +181,47 @@ class WXDLLEXPORT wxObject public: // This is equivalent to using the macro DECLARE_ABSTRACT_CLASS - static wxClassInfo classwxObject; + static wxClassInfo sm_classwxObject; wxObject(void); virtual ~wxObject(void); - virtual wxClassInfo *GetClassInfo(void) { return &classwxObject; } + virtual wxClassInfo *GetClassInfo(void) const { return &sm_classwxObject; } - bool IsKindOf(wxClassInfo *info); + bool IsKindOf(wxClassInfo *info) const; -#if WXDEBUG && USE_MEMORY_TRACING +#if defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING void * operator new (size_t size, char * fileName = NULL, int lineNum = 0); void operator delete (void * buf); - + +// VC++ 6.0 +#if _MSC_VER >= 1200 + void operator delete(void *buf, char*, int); +#endif + // Cause problems for VC++ -#ifndef _MSC_VER +// #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 +/* +#ifdef __MWERKS__ + void * operator new[] (size_t size, char * fileName , int lineNum = 0); + void operator delete[] (void * buf); +#endif +*/ + #endif -#if WXDEBUG || USE_WXDEBUG_CONTEXT +#if defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT virtual void Dump(ostream& str); #endif -#ifdef USE_STORABLE_CLASSES - virtual void StoreObject( ostream &WXUNUSED(stream) ) {}; +#ifdef wxUSE_SERIAL + virtual void StoreObject( wxObjectOutputStream &stream ); + virtual void LoadObject( wxObjectInputStream &stream ); #endif // make a 'clone' of the object @@ -236,7 +234,10 @@ class WXDLLEXPORT wxObject inline void SetRefData(wxObjectRefData *data) { m_refData = data; } protected: - wxObjectRefData *m_refData; + wxObjectRefData* m_refData; +#ifdef wxUSE_SERIAL + wxObject_Serialize* m_serialObj; +#endif }; /* @@ -256,14 +257,23 @@ private: int m_count; }; -#if WXDEBUG && USE_GLOBAL_MEMORY_OPERATORS +#ifdef __WXDEBUG__ #ifndef WXDEBUG_NEW #define WXDEBUG_NEW new(__FILE__,__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(__FILE__,__LINE__) #endif #endif - // __OBJECTH__ + // _WX_OBJECTH__