X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aa1f2541b616bee54a237c256758b0b320765828..22574b4a9c8a805d2d476aa6f531e408b647523e:/include/wx/object.h diff --git a/include/wx/object.h b/include/wx/object.h index 11ffa2b356..35ff626b4e 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -13,10 +13,6 @@ #ifndef _WX_OBJECTH__ #define _WX_OBJECTH__ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma interface "object.h" -#endif - // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- @@ -156,48 +152,59 @@ inline void wxClassInfo::CleanUpClasses() {} // Dynamic class macros // ---------------------------------------------------------------------------- -#define DECLARE_DYNAMIC_CLASS(name) \ - public: \ - static wxClassInfo ms_classInfo; \ - static wxObject* wxCreateObject(); \ - virtual wxClassInfo *GetClassInfo() const \ - { return &name::ms_classInfo; } +#define DECLARE_ABSTRACT_CLASS(name) \ + public: \ + static wxClassInfo ms_classInfo; \ + virtual wxClassInfo *GetClassInfo() const; -#define DECLARE_DYNAMIC_CLASS_NO_ASSIGN(name) \ - DECLARE_NO_ASSIGN_CLASS(name) \ +#define DECLARE_DYNAMIC_CLASS_NO_ASSIGN(name) \ + DECLARE_NO_ASSIGN_CLASS(name) \ DECLARE_DYNAMIC_CLASS(name) -#define DECLARE_DYNAMIC_CLASS_NO_COPY(name) \ - DECLARE_NO_COPY_CLASS(name) \ +#define DECLARE_DYNAMIC_CLASS_NO_COPY(name) \ + DECLARE_NO_COPY_CLASS(name) \ DECLARE_DYNAMIC_CLASS(name) -#define DECLARE_ABSTRACT_CLASS(name) DECLARE_DYNAMIC_CLASS(name) +#define DECLARE_DYNAMIC_CLASS(name) \ + DECLARE_ABSTRACT_CLASS(name) \ + static wxObject* wxCreateObject(); + #define DECLARE_CLASS(name) DECLARE_DYNAMIC_CLASS(name) + +// common part of the macros below +#define wxIMPLEMENT_CLASS_COMMON(name, basename, baseclsinfo2, func) \ + wxClassInfo name::ms_classInfo(wxT(#name), \ + &basename::ms_classInfo, \ + baseclsinfo2, \ + (int) sizeof(name), \ + (wxObjectConstructorFn) func); \ + \ + wxClassInfo *name::GetClassInfo() const \ + { return &name::ms_classInfo; } + +#define wxIMPLEMENT_CLASS_COMMON1(name, basename, func) \ + wxIMPLEMENT_CLASS_COMMON(name, basename, NULL, func) + +#define wxIMPLEMENT_CLASS_COMMON2(name, basename1, basename2, func) \ + wxIMPLEMENT_CLASS_COMMON(name, basename1, &basename2::ms_classInfo, func) + // ----------------------------------- // for concrete classes // ----------------------------------- // Single inheritance with one base class - -#define IMPLEMENT_DYNAMIC_CLASS(name, basename) \ - wxObject* name::wxCreateObject() \ - { return new name; } \ - wxClassInfo name::ms_classInfo(wxT(#name), \ - &basename::ms_classInfo, NULL, \ - (int) sizeof(name), \ - (wxObjectConstructorFn) name::wxCreateObject); +#define IMPLEMENT_DYNAMIC_CLASS(name, basename) \ + wxIMPLEMENT_CLASS_COMMON1(name, basename, name::wxCreateObject) \ + wxObject* name::wxCreateObject() \ + { return new name; } // Multiple inheritance with two base classes - -#define IMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) \ - wxObject* name::wxCreateObject() \ - { return new name; } \ - wxClassInfo name::ms_classInfo(wxT(#name), \ - &basename1::ms_classInfo, \ - &basename2::ms_classInfo, \ - (int) sizeof(name), \ - (wxObjectConstructorFn) name::wxCreateObject); +#define IMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_CLASS_COMMON2(name, basename1, basename2, \ + name::wxCreateObject) \ + wxObject* name::wxCreateObject() \ + { return new name; } // ----------------------------------- // for abstract classes @@ -205,19 +212,13 @@ inline void wxClassInfo::CleanUpClasses() {} // Single inheritance with one base class -#define IMPLEMENT_ABSTRACT_CLASS(name, basename) \ - wxClassInfo name::ms_classInfo(wxT(#name), \ - &basename::ms_classInfo, NULL, \ - (int) sizeof(name), (wxObjectConstructorFn) 0); +#define IMPLEMENT_ABSTRACT_CLASS(name, basename) \ + wxIMPLEMENT_CLASS_COMMON1(name, basename, NULL) // Multiple inheritance with two base classes -#define IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ - wxClassInfo name::ms_classInfo(wxT(#name), \ - &basename1::ms_classInfo, \ - &basename2::ms_classInfo, \ - (int) sizeof(name), \ - (wxObjectConstructorFn) 0); +#define IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ + wxIMPLEMENT_CLASS_COMMON2(name, basename1, basename2, NULL) #define IMPLEMENT_CLASS IMPLEMENT_ABSTRACT_CLASS #define IMPLEMENT_CLASS2 IMPLEMENT_ABSTRACT_CLASS2 @@ -299,7 +300,11 @@ name##PluginSentinel m_pluginsentinel; // Just seems a bit nicer-looking (pretend it's not a macro) #define wxIsKindOf(obj, className) obj->IsKindOf(&className::ms_classInfo) -// to be replaced by dynamic_cast<> in the future +// this cast does some more checks at compile time as it uses static_cast +// internally +// +// note that it still has different semantics from dynamic_cast<> and so can't +// be replaced by it as long as there are any compilers not supporting it #define wxDynamicCast(obj, className) \ ((className *) wxCheckDynamicCast( \ wx_const_cast(wxObject *, wx_static_cast(const wxObject *, \ @@ -309,7 +314,7 @@ name##PluginSentinel m_pluginsentinel; // The 'this' pointer is always true, so use this version // to cast the this pointer and avoid compiler warnings. #define wxDynamicCastThis(className) \ - (IsKindOf(&className::ms_classInfo) ? (className *)(this) : (className *)0) + (IsKindOf(&className::ms_classInfo) ? (className *)(this) : (className *)0) #ifdef __WXDEBUG__ inline void* wxCheckCast(void *ptr) @@ -321,7 +326,8 @@ inline void* wxCheckCast(void *ptr) ((className *)wxCheckCast(wxDynamicCast(obj, className))) #else // !__WXDEBUG__ -#define wxStaticCast(obj, className) ((className *)(obj)) +#define wxStaticCast(obj, className) \ + wx_const_cast(className *, wx_static_cast(const className *, obj)) #endif // __WXDEBUG__ @@ -381,7 +387,7 @@ inline void* wxCheckCast(void *ptr) #endif // wxUSE_ARRAY_MEMORY_OPERATORS -#endif // WXDEBUG && wxUSE_MEMORY_TRACING +#endif // __WXDEBUG__ && wxUSE_MEMORY_TRACING // ---------------------------------------------------------------------------- // wxObject: the root class of wxWidgets object hierarchy @@ -399,9 +405,9 @@ public: virtual ~wxObject() { UnRef(); } wxObject(const wxObject& other) - { - InitFrom(other); - } + { + InitFrom(other); + } wxObject& operator=(const wxObject& other) { @@ -458,6 +464,18 @@ public: // destroy a reference void UnRef(); + + // Reserved for future use + virtual void ReservedObjectFunc1() {} + virtual void ReservedObjectFunc2() {} + virtual void ReservedObjectFunc3() {} + virtual void ReservedObjectFunc4() {} + virtual void ReservedObjectFunc5() {} + virtual void ReservedObjectFunc6() {} + virtual void ReservedObjectFunc7() {} + virtual void ReservedObjectFunc8() {} + virtual void ReservedObjectFunc9() {} + protected: // ensure that our data is not shared with anybody else: if we have no // data, it is created using CreateRefData() below, if we have shared data