1*9712c20fSFrederick Mayle // 2*9712c20fSFrederick Mayle // GTMDefines.h 3*9712c20fSFrederick Mayle // 4*9712c20fSFrederick Mayle // Copyright 2008 Google LLC 5*9712c20fSFrederick Mayle // 6*9712c20fSFrederick Mayle // Licensed under the Apache License, Version 2.0 (the "License"); you may not 7*9712c20fSFrederick Mayle // use this file except in compliance with the License. You may obtain a copy 8*9712c20fSFrederick Mayle // of the License at 9*9712c20fSFrederick Mayle // 10*9712c20fSFrederick Mayle // http://www.apache.org/licenses/LICENSE-2.0 11*9712c20fSFrederick Mayle // 12*9712c20fSFrederick Mayle // Unless required by applicable law or agreed to in writing, software 13*9712c20fSFrederick Mayle // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 14*9712c20fSFrederick Mayle // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 15*9712c20fSFrederick Mayle // License for the specific language governing permissions and limitations under 16*9712c20fSFrederick Mayle // the License. 17*9712c20fSFrederick Mayle // 18*9712c20fSFrederick Mayle 19*9712c20fSFrederick Mayle // ============================================================================ 20*9712c20fSFrederick Mayle 21*9712c20fSFrederick Mayle #include <AvailabilityMacros.h> 22*9712c20fSFrederick Mayle #include <TargetConditionals.h> 23*9712c20fSFrederick Mayle 24*9712c20fSFrederick Mayle #ifdef __OBJC__ 25*9712c20fSFrederick Mayle #include <Foundation/NSObjCRuntime.h> 26*9712c20fSFrederick Mayle #endif // __OBJC__ 27*9712c20fSFrederick Mayle 28*9712c20fSFrederick Mayle #if TARGET_OS_IPHONE 29*9712c20fSFrederick Mayle #include <Availability.h> 30*9712c20fSFrederick Mayle #endif // TARGET_OS_IPHONE 31*9712c20fSFrederick Mayle 32*9712c20fSFrederick Mayle // Not all MAC_OS_X_VERSION_10_X macros defined in past SDKs 33*9712c20fSFrederick Mayle #ifndef MAC_OS_X_VERSION_10_5 34*9712c20fSFrederick Mayle #define MAC_OS_X_VERSION_10_5 1050 35*9712c20fSFrederick Mayle #endif 36*9712c20fSFrederick Mayle #ifndef MAC_OS_X_VERSION_10_6 37*9712c20fSFrederick Mayle #define MAC_OS_X_VERSION_10_6 1060 38*9712c20fSFrederick Mayle #endif 39*9712c20fSFrederick Mayle #ifndef MAC_OS_X_VERSION_10_7 40*9712c20fSFrederick Mayle #define MAC_OS_X_VERSION_10_7 1070 41*9712c20fSFrederick Mayle #endif 42*9712c20fSFrederick Mayle 43*9712c20fSFrederick Mayle // Not all __IPHONE_X macros defined in past SDKs 44*9712c20fSFrederick Mayle #ifndef __IPHONE_3_0 45*9712c20fSFrederick Mayle #define __IPHONE_3_0 30000 46*9712c20fSFrederick Mayle #endif 47*9712c20fSFrederick Mayle #ifndef __IPHONE_3_1 48*9712c20fSFrederick Mayle #define __IPHONE_3_1 30100 49*9712c20fSFrederick Mayle #endif 50*9712c20fSFrederick Mayle #ifndef __IPHONE_3_2 51*9712c20fSFrederick Mayle #define __IPHONE_3_2 30200 52*9712c20fSFrederick Mayle #endif 53*9712c20fSFrederick Mayle #ifndef __IPHONE_4_0 54*9712c20fSFrederick Mayle #define __IPHONE_4_0 40000 55*9712c20fSFrederick Mayle #endif 56*9712c20fSFrederick Mayle #ifndef __IPHONE_4_3 57*9712c20fSFrederick Mayle #define __IPHONE_4_3 40300 58*9712c20fSFrederick Mayle #endif 59*9712c20fSFrederick Mayle #ifndef __IPHONE_5_0 60*9712c20fSFrederick Mayle #define __IPHONE_5_0 50000 61*9712c20fSFrederick Mayle #endif 62*9712c20fSFrederick Mayle 63*9712c20fSFrederick Mayle // ---------------------------------------------------------------------------- 64*9712c20fSFrederick Mayle // CPP symbols that can be overridden in a prefix to control how the toolbox 65*9712c20fSFrederick Mayle // is compiled. 66*9712c20fSFrederick Mayle // ---------------------------------------------------------------------------- 67*9712c20fSFrederick Mayle 68*9712c20fSFrederick Mayle 69*9712c20fSFrederick Mayle // By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and 70*9712c20fSFrederick Mayle // GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens 71*9712c20fSFrederick Mayle // when a validation fails. If you implement your own validators, you may want 72*9712c20fSFrederick Mayle // to control their internals using the same macros for consistency. 73*9712c20fSFrederick Mayle #ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 74*9712c20fSFrederick Mayle #define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 0 75*9712c20fSFrederick Mayle #endif 76*9712c20fSFrederick Mayle 77*9712c20fSFrederick Mayle // Give ourselves a consistent way to do inlines. Apple's macros even use 78*9712c20fSFrederick Mayle // a few different actual definitions, so we're based off of the foundation 79*9712c20fSFrederick Mayle // one. 80*9712c20fSFrederick Mayle #if !defined(GTM_INLINE) 81*9712c20fSFrederick Mayle #if (defined (__GNUC__) && (__GNUC__ == 4)) || defined (__clang__) 82*9712c20fSFrederick Mayle #define GTM_INLINE static __inline__ __attribute__((always_inline)) 83*9712c20fSFrederick Mayle #else 84*9712c20fSFrederick Mayle #define GTM_INLINE static __inline__ 85*9712c20fSFrederick Mayle #endif 86*9712c20fSFrederick Mayle #endif 87*9712c20fSFrederick Mayle 88*9712c20fSFrederick Mayle // Give ourselves a consistent way of doing externs that links up nicely 89*9712c20fSFrederick Mayle // when mixing objc and objc++ 90*9712c20fSFrederick Mayle #if !defined (GTM_EXTERN) 91*9712c20fSFrederick Mayle #if defined __cplusplus 92*9712c20fSFrederick Mayle #define GTM_EXTERN extern "C" 93*9712c20fSFrederick Mayle #define GTM_EXTERN_C_BEGIN extern "C" { 94*9712c20fSFrederick Mayle #define GTM_EXTERN_C_END } 95*9712c20fSFrederick Mayle #else 96*9712c20fSFrederick Mayle #define GTM_EXTERN extern 97*9712c20fSFrederick Mayle #define GTM_EXTERN_C_BEGIN 98*9712c20fSFrederick Mayle #define GTM_EXTERN_C_END 99*9712c20fSFrederick Mayle #endif 100*9712c20fSFrederick Mayle #endif 101*9712c20fSFrederick Mayle 102*9712c20fSFrederick Mayle // Give ourselves a consistent way of exporting things if we have visibility 103*9712c20fSFrederick Mayle // set to hidden. 104*9712c20fSFrederick Mayle #if !defined (GTM_EXPORT) 105*9712c20fSFrederick Mayle #define GTM_EXPORT __attribute__((visibility("default"))) 106*9712c20fSFrederick Mayle #endif 107*9712c20fSFrederick Mayle 108*9712c20fSFrederick Mayle // Give ourselves a consistent way of declaring something as unused. This 109*9712c20fSFrederick Mayle // doesn't use __unused because that is only supported in gcc 4.2 and greater. 110*9712c20fSFrederick Mayle #if !defined (GTM_UNUSED) 111*9712c20fSFrederick Mayle #define GTM_UNUSED(x) ((void)(x)) 112*9712c20fSFrederick Mayle #endif 113*9712c20fSFrederick Mayle 114*9712c20fSFrederick Mayle // _GTMDevLog & _GTMDevAssert 115*9712c20fSFrederick Mayle // 116*9712c20fSFrederick Mayle // _GTMDevLog & _GTMDevAssert are meant to be a very lightweight shell for 117*9712c20fSFrederick Mayle // developer level errors. This implementation simply macros to NSLog/NSAssert. 118*9712c20fSFrederick Mayle // It is not intended to be a general logging/reporting system. 119*9712c20fSFrederick Mayle // 120*9712c20fSFrederick Mayle // Please see https://github.com/google/google-toolbox-for-mac/wiki/DevLogNAssert 121*9712c20fSFrederick Mayle // for a little more background on the usage of these macros. 122*9712c20fSFrederick Mayle // 123*9712c20fSFrederick Mayle // _GTMDevLog log some error/problem in debug builds 124*9712c20fSFrederick Mayle // _GTMDevAssert assert if conditon isn't met w/in a method/function 125*9712c20fSFrederick Mayle // in all builds. 126*9712c20fSFrederick Mayle // 127*9712c20fSFrederick Mayle // To replace this system, just provide different macro definitions in your 128*9712c20fSFrederick Mayle // prefix header. Remember, any implementation you provide *must* be thread 129*9712c20fSFrederick Mayle // safe since this could be called by anything in what ever situtation it has 130*9712c20fSFrederick Mayle // been placed in. 131*9712c20fSFrederick Mayle // 132*9712c20fSFrederick Mayle 133*9712c20fSFrederick Mayle // We only define the simple macros if nothing else has defined this. 134*9712c20fSFrederick Mayle #ifndef _GTMDevLog 135*9712c20fSFrederick Mayle 136*9712c20fSFrederick Mayle #ifdef DEBUG 137*9712c20fSFrederick Mayle #define _GTMDevLog(...) NSLog(__VA_ARGS__) 138*9712c20fSFrederick Mayle #else 139*9712c20fSFrederick Mayle #define _GTMDevLog(...) do { } while (0) 140*9712c20fSFrederick Mayle #endif 141*9712c20fSFrederick Mayle 142*9712c20fSFrederick Mayle #endif // _GTMDevLog 143*9712c20fSFrederick Mayle 144*9712c20fSFrederick Mayle #ifndef _GTMDevAssert 145*9712c20fSFrederick Mayle // we directly invoke the NSAssert handler so we can pass on the varargs 146*9712c20fSFrederick Mayle // (NSAssert doesn't have a macro we can use that takes varargs) 147*9712c20fSFrederick Mayle #if !defined(NS_BLOCK_ASSERTIONS) 148*9712c20fSFrederick Mayle #define _GTMDevAssert(condition, ...) \ 149*9712c20fSFrederick Mayle do { \ 150*9712c20fSFrederick Mayle if (!(condition)) { \ 151*9712c20fSFrederick Mayle [[NSAssertionHandler currentHandler] \ 152*9712c20fSFrederick Mayle handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \ 153*9712c20fSFrederick Mayle file:[NSString stringWithUTF8String:__FILE__] \ 154*9712c20fSFrederick Mayle lineNumber:__LINE__ \ 155*9712c20fSFrederick Mayle description:__VA_ARGS__]; \ 156*9712c20fSFrederick Mayle } \ 157*9712c20fSFrederick Mayle } while(0) 158*9712c20fSFrederick Mayle #else // !defined(NS_BLOCK_ASSERTIONS) 159*9712c20fSFrederick Mayle #define _GTMDevAssert(condition, ...) do { } while (0) 160*9712c20fSFrederick Mayle #endif // !defined(NS_BLOCK_ASSERTIONS) 161*9712c20fSFrederick Mayle 162*9712c20fSFrederick Mayle #endif // _GTMDevAssert 163*9712c20fSFrederick Mayle 164*9712c20fSFrederick Mayle // _GTMCompileAssert 165*9712c20fSFrederick Mayle // _GTMCompileAssert is an assert that is meant to fire at compile time if you 166*9712c20fSFrederick Mayle // want to check things at compile instead of runtime. For example if you 167*9712c20fSFrederick Mayle // want to check that a wchar is 4 bytes instead of 2 you would use 168*9712c20fSFrederick Mayle // _GTMCompileAssert(sizeof(wchar_t) == 4, wchar_t_is_4_bytes_on_OS_X) 169*9712c20fSFrederick Mayle // Note that the second "arg" is not in quotes, and must be a valid processor 170*9712c20fSFrederick Mayle // symbol in it's own right (no spaces, punctuation etc). 171*9712c20fSFrederick Mayle 172*9712c20fSFrederick Mayle // Wrapping this in an #ifndef allows external groups to define their own 173*9712c20fSFrederick Mayle // compile time assert scheme. 174*9712c20fSFrederick Mayle #ifndef _GTMCompileAssert 175*9712c20fSFrederick Mayle // We got this technique from here: 176*9712c20fSFrederick Mayle // http://unixjunkie.blogspot.com/2007/10/better-compile-time-asserts_29.html 177*9712c20fSFrederick Mayle 178*9712c20fSFrederick Mayle #define _GTMCompileAssertSymbolInner(line, msg) _GTMCOMPILEASSERT ## line ## __ ## msg 179*9712c20fSFrederick Mayle #define _GTMCompileAssertSymbol(line, msg) _GTMCompileAssertSymbolInner(line, msg) 180*9712c20fSFrederick Mayle #define _GTMCompileAssert(test, msg) \ 181*9712c20fSFrederick Mayle typedef char _GTMCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ] 182*9712c20fSFrederick Mayle #endif // _GTMCompileAssert 183*9712c20fSFrederick Mayle 184*9712c20fSFrederick Mayle // ---------------------------------------------------------------------------- 185*9712c20fSFrederick Mayle // CPP symbols defined based on the project settings so the GTM code has 186*9712c20fSFrederick Mayle // simple things to test against w/o scattering the knowledge of project 187*9712c20fSFrederick Mayle // setting through all the code. 188*9712c20fSFrederick Mayle // ---------------------------------------------------------------------------- 189*9712c20fSFrederick Mayle 190*9712c20fSFrederick Mayle // Provide a single constant CPP symbol that all of GTM uses for ifdefing 191*9712c20fSFrederick Mayle // iPhone code. 192*9712c20fSFrederick Mayle #if TARGET_OS_IPHONE // iPhone SDK 193*9712c20fSFrederick Mayle // For iPhone specific stuff 194*9712c20fSFrederick Mayle #define GTM_IPHONE_SDK 1 195*9712c20fSFrederick Mayle #if TARGET_IPHONE_SIMULATOR 196*9712c20fSFrederick Mayle #define GTM_IPHONE_DEVICE 0 197*9712c20fSFrederick Mayle #define GTM_IPHONE_SIMULATOR 1 198*9712c20fSFrederick Mayle #else 199*9712c20fSFrederick Mayle #define GTM_IPHONE_DEVICE 1 200*9712c20fSFrederick Mayle #define GTM_IPHONE_SIMULATOR 0 201*9712c20fSFrederick Mayle #endif // TARGET_IPHONE_SIMULATOR 202*9712c20fSFrederick Mayle // By default, GTM has provided it's own unittesting support, define this 203*9712c20fSFrederick Mayle // to use the support provided by Xcode, especially for the Xcode4 support 204*9712c20fSFrederick Mayle // for unittesting. 205*9712c20fSFrederick Mayle #ifndef GTM_IPHONE_USE_SENTEST 206*9712c20fSFrederick Mayle #define GTM_IPHONE_USE_SENTEST 0 207*9712c20fSFrederick Mayle #endif 208*9712c20fSFrederick Mayle #define GTM_MACOS_SDK 0 209*9712c20fSFrederick Mayle #else 210*9712c20fSFrederick Mayle // For MacOS specific stuff 211*9712c20fSFrederick Mayle #define GTM_MACOS_SDK 1 212*9712c20fSFrederick Mayle #define GTM_IPHONE_SDK 0 213*9712c20fSFrederick Mayle #define GTM_IPHONE_SIMULATOR 0 214*9712c20fSFrederick Mayle #define GTM_IPHONE_DEVICE 0 215*9712c20fSFrederick Mayle #define GTM_IPHONE_USE_SENTEST 0 216*9712c20fSFrederick Mayle #endif 217*9712c20fSFrederick Mayle 218*9712c20fSFrederick Mayle // Some of our own availability macros 219*9712c20fSFrederick Mayle #if GTM_MACOS_SDK 220*9712c20fSFrederick Mayle #define GTM_AVAILABLE_ONLY_ON_IPHONE UNAVAILABLE_ATTRIBUTE 221*9712c20fSFrederick Mayle #define GTM_AVAILABLE_ONLY_ON_MACOS 222*9712c20fSFrederick Mayle #else 223*9712c20fSFrederick Mayle #define GTM_AVAILABLE_ONLY_ON_IPHONE 224*9712c20fSFrederick Mayle #define GTM_AVAILABLE_ONLY_ON_MACOS UNAVAILABLE_ATTRIBUTE 225*9712c20fSFrederick Mayle #endif 226*9712c20fSFrederick Mayle 227*9712c20fSFrederick Mayle // GC was dropped by Apple, define the old constant incase anyone still keys 228*9712c20fSFrederick Mayle // off of it. 229*9712c20fSFrederick Mayle #ifndef GTM_SUPPORT_GC 230*9712c20fSFrederick Mayle #define GTM_SUPPORT_GC 0 231*9712c20fSFrederick Mayle #endif 232*9712c20fSFrederick Mayle 233*9712c20fSFrederick Mayle // To simplify support for 64bit (and Leopard in general), we provide the type 234*9712c20fSFrederick Mayle // defines for non Leopard SDKs 235*9712c20fSFrederick Mayle #if !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) 236*9712c20fSFrederick Mayle // NSInteger/NSUInteger and Max/Mins 237*9712c20fSFrederick Mayle #ifndef NSINTEGER_DEFINED 238*9712c20fSFrederick Mayle #if (defined(__LP64__) && __LP64__) || NS_BUILD_32_LIKE_64 239*9712c20fSFrederick Mayle typedef long NSInteger; 240*9712c20fSFrederick Mayle typedef unsigned long NSUInteger; 241*9712c20fSFrederick Mayle #else 242*9712c20fSFrederick Mayle typedef int NSInteger; 243*9712c20fSFrederick Mayle typedef unsigned int NSUInteger; 244*9712c20fSFrederick Mayle #endif 245*9712c20fSFrederick Mayle #define NSIntegerMax LONG_MAX 246*9712c20fSFrederick Mayle #define NSIntegerMin LONG_MIN 247*9712c20fSFrederick Mayle #define NSUIntegerMax ULONG_MAX 248*9712c20fSFrederick Mayle #define NSINTEGER_DEFINED 1 249*9712c20fSFrederick Mayle #endif // NSINTEGER_DEFINED 250*9712c20fSFrederick Mayle // CGFloat 251*9712c20fSFrederick Mayle #ifndef CGFLOAT_DEFINED 252*9712c20fSFrederick Mayle #if defined(__LP64__) && __LP64__ 253*9712c20fSFrederick Mayle // This really is an untested path (64bit on Tiger?) 254*9712c20fSFrederick Mayle typedef double CGFloat; 255*9712c20fSFrederick Mayle #define CGFLOAT_MIN DBL_MIN 256*9712c20fSFrederick Mayle #define CGFLOAT_MAX DBL_MAX 257*9712c20fSFrederick Mayle #define CGFLOAT_IS_DOUBLE 1 258*9712c20fSFrederick Mayle #else /* !defined(__LP64__) || !__LP64__ */ 259*9712c20fSFrederick Mayle typedef float CGFloat; 260*9712c20fSFrederick Mayle #define CGFLOAT_MIN FLT_MIN 261*9712c20fSFrederick Mayle #define CGFLOAT_MAX FLT_MAX 262*9712c20fSFrederick Mayle #define CGFLOAT_IS_DOUBLE 0 263*9712c20fSFrederick Mayle #endif /* !defined(__LP64__) || !__LP64__ */ 264*9712c20fSFrederick Mayle #define CGFLOAT_DEFINED 1 265*9712c20fSFrederick Mayle #endif // CGFLOAT_DEFINED 266*9712c20fSFrederick Mayle #endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 267*9712c20fSFrederick Mayle 268*9712c20fSFrederick Mayle // Some support for advanced clang static analysis functionality 269*9712c20fSFrederick Mayle // See http://clang-analyzer.llvm.org/annotations.html 270*9712c20fSFrederick Mayle #ifndef __has_feature // Optional. 271*9712c20fSFrederick Mayle #define __has_feature(x) 0 // Compatibility with non-clang compilers. 272*9712c20fSFrederick Mayle #endif 273*9712c20fSFrederick Mayle 274*9712c20fSFrederick Mayle #ifndef NS_RETURNS_RETAINED 275*9712c20fSFrederick Mayle #if __has_feature(attribute_ns_returns_retained) 276*9712c20fSFrederick Mayle #define NS_RETURNS_RETAINED __attribute__((ns_returns_retained)) 277*9712c20fSFrederick Mayle #else 278*9712c20fSFrederick Mayle #define NS_RETURNS_RETAINED 279*9712c20fSFrederick Mayle #endif 280*9712c20fSFrederick Mayle #endif 281*9712c20fSFrederick Mayle 282*9712c20fSFrederick Mayle #ifndef NS_RETURNS_NOT_RETAINED 283*9712c20fSFrederick Mayle #if __has_feature(attribute_ns_returns_not_retained) 284*9712c20fSFrederick Mayle #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) 285*9712c20fSFrederick Mayle #else 286*9712c20fSFrederick Mayle #define NS_RETURNS_NOT_RETAINED 287*9712c20fSFrederick Mayle #endif 288*9712c20fSFrederick Mayle #endif 289*9712c20fSFrederick Mayle 290*9712c20fSFrederick Mayle #ifndef CF_RETURNS_RETAINED 291*9712c20fSFrederick Mayle #if __has_feature(attribute_cf_returns_retained) 292*9712c20fSFrederick Mayle #define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) 293*9712c20fSFrederick Mayle #else 294*9712c20fSFrederick Mayle #define CF_RETURNS_RETAINED 295*9712c20fSFrederick Mayle #endif 296*9712c20fSFrederick Mayle #endif 297*9712c20fSFrederick Mayle 298*9712c20fSFrederick Mayle #ifndef CF_RETURNS_NOT_RETAINED 299*9712c20fSFrederick Mayle #if __has_feature(attribute_cf_returns_not_retained) 300*9712c20fSFrederick Mayle #define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained)) 301*9712c20fSFrederick Mayle #else 302*9712c20fSFrederick Mayle #define CF_RETURNS_NOT_RETAINED 303*9712c20fSFrederick Mayle #endif 304*9712c20fSFrederick Mayle #endif 305*9712c20fSFrederick Mayle 306*9712c20fSFrederick Mayle #ifndef NS_CONSUMED 307*9712c20fSFrederick Mayle #if __has_feature(attribute_ns_consumed) 308*9712c20fSFrederick Mayle #define NS_CONSUMED __attribute__((ns_consumed)) 309*9712c20fSFrederick Mayle #else 310*9712c20fSFrederick Mayle #define NS_CONSUMED 311*9712c20fSFrederick Mayle #endif 312*9712c20fSFrederick Mayle #endif 313*9712c20fSFrederick Mayle 314*9712c20fSFrederick Mayle #ifndef CF_CONSUMED 315*9712c20fSFrederick Mayle #if __has_feature(attribute_cf_consumed) 316*9712c20fSFrederick Mayle #define CF_CONSUMED __attribute__((cf_consumed)) 317*9712c20fSFrederick Mayle #else 318*9712c20fSFrederick Mayle #define CF_CONSUMED 319*9712c20fSFrederick Mayle #endif 320*9712c20fSFrederick Mayle #endif 321*9712c20fSFrederick Mayle 322*9712c20fSFrederick Mayle #ifndef NS_CONSUMES_SELF 323*9712c20fSFrederick Mayle #if __has_feature(attribute_ns_consumes_self) 324*9712c20fSFrederick Mayle #define NS_CONSUMES_SELF __attribute__((ns_consumes_self)) 325*9712c20fSFrederick Mayle #else 326*9712c20fSFrederick Mayle #define NS_CONSUMES_SELF 327*9712c20fSFrederick Mayle #endif 328*9712c20fSFrederick Mayle #endif 329*9712c20fSFrederick Mayle 330*9712c20fSFrederick Mayle // Defined on 10.6 and above. 331*9712c20fSFrederick Mayle #ifndef NS_FORMAT_ARGUMENT 332*9712c20fSFrederick Mayle #define NS_FORMAT_ARGUMENT(A) 333*9712c20fSFrederick Mayle #endif 334*9712c20fSFrederick Mayle 335*9712c20fSFrederick Mayle // Defined on 10.6 and above. 336*9712c20fSFrederick Mayle #ifndef NS_FORMAT_FUNCTION 337*9712c20fSFrederick Mayle #define NS_FORMAT_FUNCTION(F,A) 338*9712c20fSFrederick Mayle #endif 339*9712c20fSFrederick Mayle 340*9712c20fSFrederick Mayle // Defined on 10.6 and above. 341*9712c20fSFrederick Mayle #ifndef CF_FORMAT_ARGUMENT 342*9712c20fSFrederick Mayle #define CF_FORMAT_ARGUMENT(A) 343*9712c20fSFrederick Mayle #endif 344*9712c20fSFrederick Mayle 345*9712c20fSFrederick Mayle // Defined on 10.6 and above. 346*9712c20fSFrederick Mayle #ifndef CF_FORMAT_FUNCTION 347*9712c20fSFrederick Mayle #define CF_FORMAT_FUNCTION(F,A) 348*9712c20fSFrederick Mayle #endif 349*9712c20fSFrederick Mayle 350*9712c20fSFrederick Mayle #ifndef GTM_NONNULL 351*9712c20fSFrederick Mayle #if defined(__has_attribute) 352*9712c20fSFrederick Mayle #if __has_attribute(nonnull) 353*9712c20fSFrederick Mayle #define GTM_NONNULL(x) __attribute__((nonnull x)) 354*9712c20fSFrederick Mayle #else 355*9712c20fSFrederick Mayle #define GTM_NONNULL(x) 356*9712c20fSFrederick Mayle #endif 357*9712c20fSFrederick Mayle #else 358*9712c20fSFrederick Mayle #define GTM_NONNULL(x) 359*9712c20fSFrederick Mayle #endif 360*9712c20fSFrederick Mayle #endif 361*9712c20fSFrederick Mayle 362*9712c20fSFrederick Mayle // Invalidates the initializer from which it's called. 363*9712c20fSFrederick Mayle #ifndef GTMInvalidateInitializer 364*9712c20fSFrederick Mayle #if __has_feature(objc_arc) 365*9712c20fSFrederick Mayle #define GTMInvalidateInitializer() \ 366*9712c20fSFrederick Mayle do { \ 367*9712c20fSFrederick Mayle [self class]; /* Avoid warning of dead store to |self|. */ \ 368*9712c20fSFrederick Mayle _GTMDevAssert(NO, @"Invalid initializer."); \ 369*9712c20fSFrederick Mayle return nil; \ 370*9712c20fSFrederick Mayle } while (0) 371*9712c20fSFrederick Mayle #else 372*9712c20fSFrederick Mayle #define GTMInvalidateInitializer() \ 373*9712c20fSFrederick Mayle do { \ 374*9712c20fSFrederick Mayle [self release]; \ 375*9712c20fSFrederick Mayle _GTMDevAssert(NO, @"Invalid initializer."); \ 376*9712c20fSFrederick Mayle return nil; \ 377*9712c20fSFrederick Mayle } while (0) 378*9712c20fSFrederick Mayle #endif 379*9712c20fSFrederick Mayle #endif 380*9712c20fSFrederick Mayle 381*9712c20fSFrederick Mayle #ifndef GTMCFAutorelease 382*9712c20fSFrederick Mayle #if __has_feature(objc_arc) 383*9712c20fSFrederick Mayle #define GTMCFAutorelease(x) CFBridgingRelease(x) 384*9712c20fSFrederick Mayle #else 385*9712c20fSFrederick Mayle #define GTMCFAutorelease(x) ([(id)x autorelease]) 386*9712c20fSFrederick Mayle #endif 387*9712c20fSFrederick Mayle #endif 388*9712c20fSFrederick Mayle 389*9712c20fSFrederick Mayle #ifdef __OBJC__ 390*9712c20fSFrederick Mayle 391*9712c20fSFrederick Mayle // Declared here so that it can easily be used for logging tracking if 392*9712c20fSFrederick Mayle // necessary. See GTMUnitTestDevLog.h for details. 393*9712c20fSFrederick Mayle @class NSString; 394*9712c20fSFrederick Mayle GTM_EXTERN void _GTMUnitTestDevLog(NSString *format, ...) NS_FORMAT_FUNCTION(1, 2); 395*9712c20fSFrederick Mayle 396*9712c20fSFrederick Mayle // Macro to allow you to create NSStrings out of other macros. 397*9712c20fSFrederick Mayle // #define FOO foo 398*9712c20fSFrederick Mayle // NSString *fooString = GTM_NSSTRINGIFY(FOO); 399*9712c20fSFrederick Mayle #if !defined (GTM_NSSTRINGIFY) 400*9712c20fSFrederick Mayle #define GTM_NSSTRINGIFY_INNER(x) @#x 401*9712c20fSFrederick Mayle #define GTM_NSSTRINGIFY(x) GTM_NSSTRINGIFY_INNER(x) 402*9712c20fSFrederick Mayle #endif 403*9712c20fSFrederick Mayle 404*9712c20fSFrederick Mayle // Macro to allow fast enumeration when building for 10.5 or later, and 405*9712c20fSFrederick Mayle // reliance on NSEnumerator for 10.4. Remember, NSDictionary w/ FastEnumeration 406*9712c20fSFrederick Mayle // does keys, so pick the right thing, nothing is done on the FastEnumeration 407*9712c20fSFrederick Mayle // side to be sure you're getting what you wanted. 408*9712c20fSFrederick Mayle #ifndef GTM_FOREACH_OBJECT 409*9712c20fSFrederick Mayle #if TARGET_OS_IPHONE || !(MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) 410*9712c20fSFrederick Mayle #define GTM_FOREACH_ENUMEREE(element, enumeration) \ 411*9712c20fSFrederick Mayle for (element in enumeration) 412*9712c20fSFrederick Mayle #define GTM_FOREACH_OBJECT(element, collection) \ 413*9712c20fSFrederick Mayle for (element in collection) 414*9712c20fSFrederick Mayle #define GTM_FOREACH_KEY(element, collection) \ 415*9712c20fSFrederick Mayle for (element in collection) 416*9712c20fSFrederick Mayle #else 417*9712c20fSFrederick Mayle #define GTM_FOREACH_ENUMEREE(element, enumeration) \ 418*9712c20fSFrederick Mayle for (NSEnumerator *_ ## element ## _enum = enumeration; \ 419*9712c20fSFrederick Mayle (element = [_ ## element ## _enum nextObject]) != nil; ) 420*9712c20fSFrederick Mayle #define GTM_FOREACH_OBJECT(element, collection) \ 421*9712c20fSFrederick Mayle GTM_FOREACH_ENUMEREE(element, [collection objectEnumerator]) 422*9712c20fSFrederick Mayle #define GTM_FOREACH_KEY(element, collection) \ 423*9712c20fSFrederick Mayle GTM_FOREACH_ENUMEREE(element, [collection keyEnumerator]) 424*9712c20fSFrederick Mayle #endif 425*9712c20fSFrederick Mayle #endif 426*9712c20fSFrederick Mayle 427*9712c20fSFrederick Mayle // ============================================================================ 428*9712c20fSFrederick Mayle 429*9712c20fSFrederick Mayle // To simplify support for both Leopard and Snow Leopard we declare 430*9712c20fSFrederick Mayle // the Snow Leopard protocols that we need here. 431*9712c20fSFrederick Mayle #if !defined(GTM_10_6_PROTOCOLS_DEFINED) && !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) 432*9712c20fSFrederick Mayle #define GTM_10_6_PROTOCOLS_DEFINED 1 433*9712c20fSFrederick Mayle @protocol NSConnectionDelegate 434*9712c20fSFrederick Mayle @end 435*9712c20fSFrederick Mayle @protocol NSAnimationDelegate 436*9712c20fSFrederick Mayle @end 437*9712c20fSFrederick Mayle @protocol NSImageDelegate 438*9712c20fSFrederick Mayle @end 439*9712c20fSFrederick Mayle @protocol NSTabViewDelegate 440*9712c20fSFrederick Mayle @end 441*9712c20fSFrederick Mayle #endif // !defined(GTM_10_6_PROTOCOLS_DEFINED) && !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) 442*9712c20fSFrederick Mayle 443*9712c20fSFrederick Mayle // GTM_SEL_STRING is for specifying selector (usually property) names to KVC 444*9712c20fSFrederick Mayle // or KVO methods. 445*9712c20fSFrederick Mayle // In debug it will generate warnings for undeclared selectors if 446*9712c20fSFrederick Mayle // -Wunknown-selector is turned on. 447*9712c20fSFrederick Mayle // In release it will have no runtime overhead. 448*9712c20fSFrederick Mayle #ifndef GTM_SEL_STRING 449*9712c20fSFrederick Mayle #ifdef DEBUG 450*9712c20fSFrederick Mayle #define GTM_SEL_STRING(selName) NSStringFromSelector(@selector(selName)) 451*9712c20fSFrederick Mayle #else 452*9712c20fSFrederick Mayle #define GTM_SEL_STRING(selName) @#selName 453*9712c20fSFrederick Mayle #endif // DEBUG 454*9712c20fSFrederick Mayle #endif // GTM_SEL_STRING 455*9712c20fSFrederick Mayle 456*9712c20fSFrederick Mayle #endif // __OBJC__ 457