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