Add a new macro to the Objective-C uniquifying support that allows a

uniquified class to be a subclasses of another uniquified class.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51891 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Elliott 2008-02-18 20:36:16 +00:00
parent 9eaadb1b8c
commit 83259e23a4

View File

@ -296,6 +296,16 @@ inline objc_class * wxObjcCompilerInformation<ObjcClass>::GetCompiledClass() \
return objc_getClass(#ObjcSuperClass); \ return objc_getClass(#ObjcSuperClass); \
} }
// The WX_IMPLEMENT_OBJC_GET_UNIQUIFIED_SUPERCLASS macro implements the template
// specialization to get the superclass when the superclass is another uniquified
// Objective-C class.
#define WX_IMPLEMENT_OBJC_GET_UNIQUIFIED_SUPERCLASS(ObjcClass,ObjcSuperClass) \
template <> \
inline objc_class* wxObjcCompilerInformation<ObjcClass>::GetSuperclass() \
{ \
return wx_GetObjcClass_ ## ObjcSuperClass(); \
}
// The WX_IMPLEMENT_OBJC_CLASS_NAME macro implements the template specialization // The WX_IMPLEMENT_OBJC_CLASS_NAME macro implements the template specialization
// of the sm_theClassName constant. As soon as this specialization is in place // of the sm_theClassName constant. As soon as this specialization is in place
// sizeof(sm_theClassName) will return the number of bytes at compile time. // sizeof(sm_theClassName) will return the number of bytes at compile time.
@ -303,17 +313,31 @@ inline objc_class * wxObjcCompilerInformation<ObjcClass>::GetCompiledClass() \
template <> \ template <> \
const char wxObjcCompilerInformation<ObjcClass>::sm_theClassName[] = #ObjcClass; const char wxObjcCompilerInformation<ObjcClass>::sm_theClassName[] = #ObjcClass;
// The WX_IMPLEMENT_GET_OBJC_CLASS macro combines all of these together and adds // The WX_IMPLEMENT_OBJC_GET_OBJC_CLASS macro is the final one that actually provides
// a global wx_GetObjcClass_ObjcClass() function. // the wx_GetObjcClass_XXX function that will be called in lieu of asking the Objective-C
#define WX_IMPLEMENT_GET_OBJC_CLASS(ObjcClass,ObjcSuperClass) \ // runtime for the class. All the others are really machinery to make this happen.
WX_IMPLEMENT_OBJC_GET_COMPILED_CLASS(ObjcClass) \ #define WX_IMPLEMENT_OBJC_GET_OBJC_CLASS(ObjcClass) \
WX_IMPLEMENT_OBJC_GET_SUPERCLASS(ObjcClass,ObjcSuperClass) \
WX_IMPLEMENT_OBJC_CLASS_NAME(ObjcClass) \
objc_class* wx_GetObjcClass_ ## ObjcClass() \ objc_class* wx_GetObjcClass_ ## ObjcClass() \
{ \ { \
return wxObjcClassInitializer<ObjcClass>::Get(); \ return wxObjcClassInitializer<ObjcClass>::Get(); \
} }
// The WX_IMPLEMENT_GET_OBJC_CLASS macro combines all of these together
// for the case when the superclass is a non-uniquified class.
#define WX_IMPLEMENT_GET_OBJC_CLASS(ObjcClass,ObjcSuperClass) \
WX_IMPLEMENT_OBJC_GET_COMPILED_CLASS(ObjcClass) \
WX_IMPLEMENT_OBJC_GET_SUPERCLASS(ObjcClass,ObjcSuperClass) \
WX_IMPLEMENT_OBJC_CLASS_NAME(ObjcClass) \
WX_IMPLEMENT_OBJC_GET_OBJC_CLASS(ObjcClass)
// The WX_IMPLEMENT_GET_OBJC_CLASS_WITH_UNIQUIFIED_SUPERCLASS macro combines all
// of these together for the case when the superclass is another uniquified class.
#define WX_IMPLEMENT_GET_OBJC_CLASS_WITH_UNIQUIFIED_SUPERCLASS(ObjcClass,ObjcSuperClass) \
WX_IMPLEMENT_OBJC_GET_COMPILED_CLASS(ObjcClass) \
WX_IMPLEMENT_OBJC_GET_UNIQUIFIED_SUPERCLASS(ObjcClass,ObjcSuperClass) \
WX_IMPLEMENT_OBJC_CLASS_NAME(ObjcClass) \
WX_IMPLEMENT_OBJC_GET_OBJC_CLASS(ObjcClass)
// The WX_GET_OBJC_CLASS macro is intended to wrap the class name when the class // The WX_GET_OBJC_CLASS macro is intended to wrap the class name when the class
// is used as a message receiver (e.g. for calling class methods). When // is used as a message receiver (e.g. for calling class methods). When
// class name uniquifying is used, this calls the global function implemented // class name uniquifying is used, this calls the global function implemented
@ -326,6 +350,8 @@ inline objc_class * wxObjcCompilerInformation<ObjcClass>::GetCompiledClass() \
#define WX_DECLARE_GET_OBJC_CLASS(ObjcClass,ObjcSuperClass) #define WX_DECLARE_GET_OBJC_CLASS(ObjcClass,ObjcSuperClass)
// Define WX_IMPLEMENT_GET_OBJC_CLASS as nothing // Define WX_IMPLEMENT_GET_OBJC_CLASS as nothing
#define WX_IMPLEMENT_GET_OBJC_CLASS(ObjcClass,ObjcSuperClass) #define WX_IMPLEMENT_GET_OBJC_CLASS(ObjcClass,ObjcSuperClass)
// Define WX_IMPLEMENT_GET_OBJC_CLASS_WITH_UNIQUIFIED_SUPERCLASS as nothing
#define WX_IMPLEMENT_GET_OBJC_CLASS_WITH_UNIQUIFIED_SUPERCLASS(ObjcClass,ObjcSuperClass)
// Define WX_GET_OBJC_CLASS macro to output the class name and let the compiler do the normal thing // Define WX_GET_OBJC_CLASS macro to output the class name and let the compiler do the normal thing
// The WX_GET_OBJC_CLASS macro is intended to wrap the class name when the class // The WX_GET_OBJC_CLASS macro is intended to wrap the class name when the class