12b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org//
23ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// GTMDefines.h
33ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//
43ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//  Copyright 2008 Google Inc.
53ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//
63ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
73ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//  use this file except in compliance with the License.  You may obtain a copy
83ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//  of the License at
92b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org//
103ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//  http://www.apache.org/licenses/LICENSE-2.0
112b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org//
123ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//  Unless required by applicable law or agreed to in writing, software
133ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
143ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
153ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//  License for the specific language governing permissions and limitations under
163ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//  the License.
173ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//
182b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
193ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// ============================================================================
203ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
213ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#include <AvailabilityMacros.h>
223ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#include <TargetConditionals.h>
233ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
242b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifdef __OBJC__
252b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#include <Foundation/NSObjCRuntime.h>
262b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif  // __OBJC__
272b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
282b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#if TARGET_OS_IPHONE
292b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#include <Availability.h>
302b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif  // TARGET_OS_IPHONE
312b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
323ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Not all MAC_OS_X_VERSION_10_X macros defined in past SDKs
333ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#ifndef MAC_OS_X_VERSION_10_5
343ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define MAC_OS_X_VERSION_10_5 1050
353ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif
363ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#ifndef MAC_OS_X_VERSION_10_6
373ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define MAC_OS_X_VERSION_10_6 1060
383ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif
392b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef MAC_OS_X_VERSION_10_7
402b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define MAC_OS_X_VERSION_10_7 1070
412b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
422b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
432b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Not all __IPHONE_X macros defined in past SDKs
442b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef __IPHONE_3_0
452b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define __IPHONE_3_0 30000
462b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
472b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef __IPHONE_3_1
482b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define __IPHONE_3_1 30100
492b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
502b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef __IPHONE_3_2
512b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define __IPHONE_3_2 30200
522b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
532b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef __IPHONE_4_0
542b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define __IPHONE_4_0 40000
552b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
562b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef __IPHONE_4_3
572b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define __IPHONE_4_3 40300
582b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
592b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef __IPHONE_5_0
602b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define __IPHONE_5_0 50000
612b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
623ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
633ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// ----------------------------------------------------------------------------
643ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// CPP symbols that can be overridden in a prefix to control how the toolbox
653ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// is compiled.
663ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// ----------------------------------------------------------------------------
673ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
683ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
692b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and
703ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens
713ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// when a validation fails. If you implement your own validators, you may want
723ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// to control their internals using the same macros for consistency.
733ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
743ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 0
753ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif
763ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
773ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Give ourselves a consistent way to do inlines.  Apple's macros even use
783ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// a few different actual definitions, so we're based off of the foundation
793ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// one.
803ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#if !defined(GTM_INLINE)
812b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #if (defined (__GNUC__) && (__GNUC__ == 4)) || defined (__clang__)
823ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #define GTM_INLINE static __inline__ __attribute__((always_inline))
833ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #else
843ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #define GTM_INLINE static __inline__
853ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #endif
863ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif
873ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
883ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Give ourselves a consistent way of doing externs that links up nicely
893ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// when mixing objc and objc++
903ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#if !defined (GTM_EXTERN)
913ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #if defined __cplusplus
923ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #define GTM_EXTERN extern "C"
932b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_EXTERN_C_BEGIN extern "C" {
942b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_EXTERN_C_END }
953ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #else
963ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #define GTM_EXTERN extern
972b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_EXTERN_C_BEGIN
982b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_EXTERN_C_END
993ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #endif
1003ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif
1013ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1023ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Give ourselves a consistent way of exporting things if we have visibility
1033ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// set to hidden.
1043ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#if !defined (GTM_EXPORT)
1053ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define GTM_EXPORT __attribute__((visibility("default")))
1063ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif
1073ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1082b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Give ourselves a consistent way of declaring something as unused. This
1092b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// doesn't use __unused because that is only supported in gcc 4.2 and greater.
1102b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#if !defined (GTM_UNUSED)
1112b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#define GTM_UNUSED(x) ((void)(x))
1122b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
1132b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
1143ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// _GTMDevLog & _GTMDevAssert
1153ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//
1163ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// _GTMDevLog & _GTMDevAssert are meant to be a very lightweight shell for
1173ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// developer level errors.  This implementation simply macros to NSLog/NSAssert.
1183ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// It is not intended to be a general logging/reporting system.
1193ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//
1203ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Please see http://code.google.com/p/google-toolbox-for-mac/wiki/DevLogNAssert
1213ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// for a little more background on the usage of these macros.
1223ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//
1233ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//    _GTMDevLog           log some error/problem in debug builds
1243ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//    _GTMDevAssert        assert if conditon isn't met w/in a method/function
1253ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid//                           in all builds.
1262b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org//
1273ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// To replace this system, just provide different macro definitions in your
1283ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// prefix header.  Remember, any implementation you provide *must* be thread
1293ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// safe since this could be called by anything in what ever situtation it has
1303ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// been placed in.
1312b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org//
1323ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1333ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// We only define the simple macros if nothing else has defined this.
1343ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#ifndef _GTMDevLog
1353ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1363ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#ifdef DEBUG
1373ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define _GTMDevLog(...) NSLog(__VA_ARGS__)
1383ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#else
1393ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define _GTMDevLog(...) do { } while (0)
1403ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif
1413ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1423ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif // _GTMDevLog
1433ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1443ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#ifndef _GTMDevAssert
1453ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// we directly invoke the NSAssert handler so we can pass on the varargs
1463ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// (NSAssert doesn't have a macro we can use that takes varargs)
1473ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#if !defined(NS_BLOCK_ASSERTIONS)
1483ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define _GTMDevAssert(condition, ...)                                       \
1493ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    do {                                                                      \
1503ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      if (!(condition)) {                                                     \
1513ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid        [[NSAssertionHandler currentHandler]                                  \
1523ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid            handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \
1533ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid                               file:[NSString stringWithUTF8String:__FILE__]  \
1543ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid                         lineNumber:__LINE__                                  \
1553ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid                        description:__VA_ARGS__];                             \
1563ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      }                                                                       \
1573ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    } while(0)
1583ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#else // !defined(NS_BLOCK_ASSERTIONS)
1593ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define _GTMDevAssert(condition, ...) do { } while (0)
1603ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif // !defined(NS_BLOCK_ASSERTIONS)
1613ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1623ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif // _GTMDevAssert
1633ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1643ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// _GTMCompileAssert
1653ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// _GTMCompileAssert is an assert that is meant to fire at compile time if you
1663ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// want to check things at compile instead of runtime. For example if you
1673ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// want to check that a wchar is 4 bytes instead of 2 you would use
1683ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// _GTMCompileAssert(sizeof(wchar_t) == 4, wchar_t_is_4_bytes_on_OS_X)
1693ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Note that the second "arg" is not in quotes, and must be a valid processor
1703ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// symbol in it's own right (no spaces, punctuation etc).
1713ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1723ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Wrapping this in an #ifndef allows external groups to define their own
1733ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// compile time assert scheme.
1743ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#ifndef _GTMCompileAssert
1753ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // We got this technique from here:
1763ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // http://unixjunkie.blogspot.com/2007/10/better-compile-time-asserts_29.html
1773ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1783ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define _GTMCompileAssertSymbolInner(line, msg) _GTMCOMPILEASSERT ## line ## __ ## msg
1793ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define _GTMCompileAssertSymbol(line, msg) _GTMCompileAssertSymbolInner(line, msg)
1803ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define _GTMCompileAssert(test, msg) \
1813ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    typedef char _GTMCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
1823ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif // _GTMCompileAssert
1833ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1843ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// ----------------------------------------------------------------------------
1853ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// CPP symbols defined based on the project settings so the GTM code has
1863ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// simple things to test against w/o scattering the knowledge of project
1873ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// setting through all the code.
1883ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// ----------------------------------------------------------------------------
1893ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
1903ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// Provide a single constant CPP symbol that all of GTM uses for ifdefing
1913ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// iPhone code.
1923ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#if TARGET_OS_IPHONE // iPhone SDK
1933ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // For iPhone specific stuff
1943ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define GTM_IPHONE_SDK 1
1953ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #if TARGET_IPHONE_SIMULATOR
196afa2f35658261c6b2a0da236138bcae6f4664811dmaclach    #define GTM_IPHONE_DEVICE 0
1973ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #define GTM_IPHONE_SIMULATOR 1
1983ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #else
1993ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #define GTM_IPHONE_DEVICE 1
200afa2f35658261c6b2a0da236138bcae6f4664811dmaclach    #define GTM_IPHONE_SIMULATOR 0
2013ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #endif  // TARGET_IPHONE_SIMULATOR
2022b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  // By default, GTM has provided it's own unittesting support, define this
2032b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  // to use the support provided by Xcode, especially for the Xcode4 support
2042b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  // for unittesting.
2052b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #ifndef GTM_IPHONE_USE_SENTEST
2062b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_IPHONE_USE_SENTEST 0
2072b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #endif
208afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #define GTM_MACOS_SDK 0
2093ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#else
2103ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // For MacOS specific stuff
2113ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #define GTM_MACOS_SDK 1
212afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #define GTM_IPHONE_SDK 0
213afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #define GTM_IPHONE_SIMULATOR 0
214afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #define GTM_IPHONE_DEVICE 0
215afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #define GTM_IPHONE_USE_SENTEST 0
2163ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif
2173ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
2182b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Some of our own availability macros
2192b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#if GTM_MACOS_SDK
2202b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#define GTM_AVAILABLE_ONLY_ON_IPHONE UNAVAILABLE_ATTRIBUTE
2212b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#define GTM_AVAILABLE_ONLY_ON_MACOS
2222b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#else
2232b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#define GTM_AVAILABLE_ONLY_ON_IPHONE
2242b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#define GTM_AVAILABLE_ONLY_ON_MACOS UNAVAILABLE_ATTRIBUTE
2252b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
2262b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
227afa2f35658261c6b2a0da236138bcae6f4664811dmaclach// GC was dropped by Apple, define the old constant incase anyone still keys
228afa2f35658261c6b2a0da236138bcae6f4664811dmaclach// off of it.
2293ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#ifndef GTM_SUPPORT_GC
230afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #define GTM_SUPPORT_GC 0
2313ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid#endif
2323ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid
2333ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// To simplify support for 64bit (and Leopard in general), we provide the type
2343ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid// defines for non Leopard SDKs
2352b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#if !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
2363ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid // NSInteger/NSUInteger and Max/Mins
2373ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #ifndef NSINTEGER_DEFINED
238afa2f35658261c6b2a0da236138bcae6f4664811dmaclach    #if (defined(__LP64__) && __LP64__) || NS_BUILD_32_LIKE_64
2393ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      typedef long NSInteger;
2403ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      typedef unsigned long NSUInteger;
2413ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #else
2423ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      typedef int NSInteger;
2433ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      typedef unsigned int NSUInteger;
2443ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #endif
2453ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #define NSIntegerMax    LONG_MAX
2463ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #define NSIntegerMin    LONG_MIN
2473ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #define NSUIntegerMax   ULONG_MAX
2483ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #define NSINTEGER_DEFINED 1
2493ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #endif  // NSINTEGER_DEFINED
2503ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  // CGFloat
2513ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #ifndef CGFLOAT_DEFINED
2523ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #if defined(__LP64__) && __LP64__
2533ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      // This really is an untested path (64bit on Tiger?)
2543ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      typedef double CGFloat;
2553ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      #define CGFLOAT_MIN DBL_MIN
2563ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      #define CGFLOAT_MAX DBL_MAX
2573ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      #define CGFLOAT_IS_DOUBLE 1
2583ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #else /* !defined(__LP64__) || !__LP64__ */
2593ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      typedef float CGFloat;
2603ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      #define CGFLOAT_MIN FLT_MIN
2613ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      #define CGFLOAT_MAX FLT_MAX
2623ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid      #define CGFLOAT_IS_DOUBLE 0
2633ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #endif /* !defined(__LP64__) || !__LP64__ */
2643ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid    #define CGFLOAT_DEFINED 1
2653ebdb1bd7ae38bf0fb205dfaa2f5fde3d67ea141nealsid  #endif // CGFLOAT_DEFINED
2662b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif  // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
2672b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
2682b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Some support for advanced clang static analysis functionality
2692b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// See http://clang-analyzer.llvm.org/annotations.html
2702b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef __has_feature      // Optional.
2712b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define __has_feature(x) 0 // Compatibility with non-clang compilers.
2722b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
2732b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
2742b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef NS_RETURNS_RETAINED
2752b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #if __has_feature(attribute_ns_returns_retained)
2762b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define NS_RETURNS_RETAINED __attribute__((ns_returns_retained))
2772b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #else
2782b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define NS_RETURNS_RETAINED
2792b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #endif
2802b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
2812b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
2822b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef NS_RETURNS_NOT_RETAINED
2832b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #if __has_feature(attribute_ns_returns_not_retained)
2842b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
2852b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #else
2862b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define NS_RETURNS_NOT_RETAINED
2872b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #endif
2882b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
2892b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
2902b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef CF_RETURNS_RETAINED
2912b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #if __has_feature(attribute_cf_returns_retained)
2922b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
2932b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #else
2942b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define CF_RETURNS_RETAINED
2952b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #endif
2962b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
2972b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
2982b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef CF_RETURNS_NOT_RETAINED
2992b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #if __has_feature(attribute_cf_returns_not_retained)
3002b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained))
3012b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #else
3022b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define CF_RETURNS_NOT_RETAINED
3032b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #endif
3042b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
3052b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
3062b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef NS_CONSUMED
3072b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #if __has_feature(attribute_ns_consumed)
3082b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define NS_CONSUMED __attribute__((ns_consumed))
3092b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #else
3102b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define NS_CONSUMED
3112b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #endif
3122b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
3132b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
3142b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef CF_CONSUMED
3152b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #if __has_feature(attribute_cf_consumed)
3162b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define CF_CONSUMED __attribute__((cf_consumed))
3172b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #else
3182b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define CF_CONSUMED
3192b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #endif
3202b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
3212b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
3222b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef NS_CONSUMES_SELF
3232b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #if __has_feature(attribute_ns_consumes_self)
3242b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define NS_CONSUMES_SELF __attribute__((ns_consumes_self))
3252b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #else
3262b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define NS_CONSUMES_SELF
3272b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #endif
3282b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
3292b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
3302b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Defined on 10.6 and above.
3312b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef NS_FORMAT_ARGUMENT
3322b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define NS_FORMAT_ARGUMENT(A)
3332b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
3342b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
3352b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Defined on 10.6 and above.
3362b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef NS_FORMAT_FUNCTION
3372b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define NS_FORMAT_FUNCTION(F,A)
3382b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
3392b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
3402b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Defined on 10.6 and above.
3412b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef CF_FORMAT_ARGUMENT
3422b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define CF_FORMAT_ARGUMENT(A)
3432b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
3442b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
3452b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Defined on 10.6 and above.
3462b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef CF_FORMAT_FUNCTION
3472b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define CF_FORMAT_FUNCTION(F,A)
3482b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
3492b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
3502b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef GTM_NONNULL
351afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #if defined(__has_attribute)
352afa2f35658261c6b2a0da236138bcae6f4664811dmaclach    #if __has_attribute(nonnull)
353afa2f35658261c6b2a0da236138bcae6f4664811dmaclach      #define GTM_NONNULL(x) __attribute__((nonnull x))
354afa2f35658261c6b2a0da236138bcae6f4664811dmaclach    #else
355afa2f35658261c6b2a0da236138bcae6f4664811dmaclach      #define GTM_NONNULL(x)
356afa2f35658261c6b2a0da236138bcae6f4664811dmaclach    #endif
357afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #else
358afa2f35658261c6b2a0da236138bcae6f4664811dmaclach    #define GTM_NONNULL(x)
359afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #endif
3602b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
3612b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
3622b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Invalidates the initializer from which it's called.
3632b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef GTMInvalidateInitializer
3642b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #if __has_feature(objc_arc)
3652b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTMInvalidateInitializer() \
3662b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org      do { \
3672b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org        [self class]; /* Avoid warning of dead store to |self|. */ \
3682b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org        _GTMDevAssert(NO, @"Invalid initializer."); \
3692b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org        return nil; \
3702b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org      } while (0)
3712b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #else
3722b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTMInvalidateInitializer() \
3732b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org      do { \
3742b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org        [self release]; \
3752b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org        _GTMDevAssert(NO, @"Invalid initializer."); \
3762b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org        return nil; \
3772b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org      } while (0)
3782b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #endif
3792b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
3802b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
381afa2f35658261c6b2a0da236138bcae6f4664811dmaclach#ifndef GTMCFAutorelease
382afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #if __has_feature(objc_arc)
383afa2f35658261c6b2a0da236138bcae6f4664811dmaclach    #define GTMCFAutorelease(x) CFBridgingRelease(x)
384afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #else
385afa2f35658261c6b2a0da236138bcae6f4664811dmaclach    #define GTMCFAutorelease(x) ([(id)x autorelease])
386afa2f35658261c6b2a0da236138bcae6f4664811dmaclach  #endif
387afa2f35658261c6b2a0da236138bcae6f4664811dmaclach#endif
388afa2f35658261c6b2a0da236138bcae6f4664811dmaclach
3892b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifdef __OBJC__
3902b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
3912b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Declared here so that it can easily be used for logging tracking if
3922b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// necessary. See GTMUnitTestDevLog.h for details.
3932b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org@class NSString;
3942b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.orgGTM_EXTERN void _GTMUnitTestDevLog(NSString *format, ...) NS_FORMAT_FUNCTION(1, 2);
3952b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
3962b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Macro to allow you to create NSStrings out of other macros.
3972b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// #define FOO foo
3982b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// NSString *fooString = GTM_NSSTRINGIFY(FOO);
3992b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#if !defined (GTM_NSSTRINGIFY)
4002b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define GTM_NSSTRINGIFY_INNER(x) @#x
4012b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #define GTM_NSSTRINGIFY(x) GTM_NSSTRINGIFY_INNER(x)
4022b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
4032b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
4042b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// Macro to allow fast enumeration when building for 10.5 or later, and
4052b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// reliance on NSEnumerator for 10.4.  Remember, NSDictionary w/ FastEnumeration
4062b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// does keys, so pick the right thing, nothing is done on the FastEnumeration
4072b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// side to be sure you're getting what you wanted.
4082b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef GTM_FOREACH_OBJECT
4092b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #if TARGET_OS_IPHONE || !(MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
4102b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_FOREACH_ENUMEREE(element, enumeration) \
4112b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org      for (element in enumeration)
4122b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_FOREACH_OBJECT(element, collection) \
4132b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org      for (element in collection)
4142b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_FOREACH_KEY(element, collection) \
4152b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org      for (element in collection)
4162b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #else
4172b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_FOREACH_ENUMEREE(element, enumeration) \
4182b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org      for (NSEnumerator *_ ## element ## _enum = enumeration; \
4192b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org           (element = [_ ## element ## _enum nextObject]) != nil; )
4202b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_FOREACH_OBJECT(element, collection) \
4212b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org      GTM_FOREACH_ENUMEREE(element, [collection objectEnumerator])
4222b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_FOREACH_KEY(element, collection) \
4232b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org      GTM_FOREACH_ENUMEREE(element, [collection keyEnumerator])
4242b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #endif
4252b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif
4262b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
4272b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// ============================================================================
4282b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
4292b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// To simplify support for both Leopard and Snow Leopard we declare
4302b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// the Snow Leopard protocols that we need here.
4312b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#if !defined(GTM_10_6_PROTOCOLS_DEFINED) && !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
4322b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#define GTM_10_6_PROTOCOLS_DEFINED 1
4332b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org@protocol NSConnectionDelegate
4342b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org@end
4352b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org@protocol NSAnimationDelegate
4362b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org@end
4372b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org@protocol NSImageDelegate
4382b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org@end
4392b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org@protocol NSTabViewDelegate
4402b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org@end
4412b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif  // !defined(GTM_10_6_PROTOCOLS_DEFINED) && !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
4422b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
4432b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// GTM_SEL_STRING is for specifying selector (usually property) names to KVC
4442b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// or KVO methods.
4452b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// In debug it will generate warnings for undeclared selectors if
4462b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// -Wunknown-selector is turned on.
4472b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org// In release it will have no runtime overhead.
4482b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#ifndef GTM_SEL_STRING
4492b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #ifdef DEBUG
4502b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_SEL_STRING(selName) NSStringFromSelector(@selector(selName))
4512b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #else
4522b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org    #define GTM_SEL_STRING(selName) @#selName
4532b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org  #endif  // DEBUG
4542b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif  // GTM_SEL_STRING
4552b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org
4562b18e3c814d6e233ef2205026b9bc521044822abqsr@chromium.org#endif  // __OBJC__
457