xref: /aosp_15_r20/external/google-breakpad/src/common/mac/GTMDefines.h (revision 9712c20fc9bbfbac4935993a2ca0b3958c5adad2)
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