00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #import <Foundation/NSString.h>
00011
00012 #import <objc/objc.h>
00013 #import <objc/objc-class.h>
00014 #import <objc/objc-runtime.h>
00015 #import <OmniBase/FrameworkDefines.h>
00016 #import <OmniBase/assertions.h>
00017
00018 #if defined(__GNUC__)
00019 #define NORETURN __attribute__ ((noreturn))
00020 #else
00021 #define NORETURN
00022 #endif
00023
00024 OmniBase_EXTERN void OBRequestConcreteImplementation(id self, SEL _cmd) NORETURN;
00025 OmniBase_EXTERN void OBRejectUnusedImplementation(id self, SEL _cmd) NORETURN;
00026 OmniBase_EXTERN void OBRejectInvalidCall(id self, SEL _cmd, NSString *format, ...) NORETURN;
00027 OmniBase_EXTERN NSString *OBAbstractImplementation;
00028 OmniBase_EXTERN NSString *OBUnusedImplementation;
00029
00030 #undef NORETURN
00031
00032 OmniBase_EXTERN IMP OBRegisterInstanceMethodWithSelector(Class aClass, SEL oldSelector, SEL newSelector);
00033
00034
00035
00036
00037 OmniBase_EXTERN IMP OBReplaceMethodImplementation(Class aClass, SEL oldSelector, IMP newImp);
00038
00039
00040
00041
00042 OmniBase_EXTERN IMP OBReplaceMethodImplementationWithSelector(Class aClass, SEL oldSelector, SEL newSelector);
00043
00044
00045
00046
00047 OmniBase_EXTERN IMP OBReplaceMethodImplementationWithSelectorOnClass(Class destClass, SEL oldSelector, Class sourceClass, SEL newSelector);
00048
00049
00050
00051
00052
00053 static inline BOOL OBPointerIsClass(id object)
00054 {
00055 if (object)
00056 return CLS_GETINFO((struct objc_class *)(object->isa), CLS_META);
00057 return NO;
00058 }
00059
00060
00061
00062 static inline Class OBClassForPointer(id object)
00063 {
00064 if (!object)
00065 return object;
00066
00067 if (OBPointerIsClass(object))
00068 return object;
00069 else
00070 return object->isa;
00071 }
00072
00073 static inline BOOL OBClassIsSubclassOfClass(Class subClass, Class superClass)
00074 {
00075 while (subClass) {
00076 if (subClass == superClass)
00077 return YES;
00078 else
00079 subClass = subClass->super_class;
00080 }
00081 return NO;
00082 }
00083
00084
00085 #define OBINITIALIZE \
00086 do { \
00087 static BOOL hasBeenInitialized = NO; \
00088 [super initialize]; \
00089 if (hasBeenInitialized) \
00090 return; \
00091 hasBeenInitialized = YES;\
00092 } while (0);
00093
00094
00095 #ifdef USING_BUGGY_CPP_PRECOMP
00096
00097 #define NSSTRINGIFY(name) @ ## '"' ## name ## '"'
00098 #elif defined(__GNUC__)
00099 #if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 3)
00100
00101 #define NSSTRINGIFY(name) @ ## #name
00102 #else
00103
00104 #define NSSTRINGIFY(name) @#name
00105 #endif
00106 #endif
00107
00108
00109
00110 #define DEFINE_NSSTRING(name) \
00111 NSString *name = NSSTRINGIFY(name)
00112
00113
00114
00115 #define OB_WARN_OBSOLETE_METHOD \
00116 do { \
00117 static BOOL warned = NO; \
00118 if (!warned) { \
00119 warned = YES; \
00120 NSLog(@"Warning: obsolete method %c[%@ %s] invoked", OBPointerIsClass(self)?'+':'-', OBClassForPointer(self), _cmd); \
00121 } \
00122 OBASSERT_NOT_REACHED("obsolete method called"); \
00123 } while(0)