Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
15 changed files
with
1,801 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,241 @@ | ||
// | ||
// GTMDefines.h | ||
// | ||
// Copyright 2008 Google Inc. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); you may not | ||
// use this file except in compliance with the License. You may obtain a copy | ||
// of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
// License for the specific language governing permissions and limitations under | ||
// the License. | ||
// | ||
|
||
// ============================================================================ | ||
|
||
#include <AvailabilityMacros.h> | ||
#include <TargetConditionals.h> | ||
|
||
// Not all MAC_OS_X_VERSION_10_X macros defined in past SDKs | ||
#ifndef MAC_OS_X_VERSION_10_5 | ||
#define MAC_OS_X_VERSION_10_5 1050 | ||
#endif | ||
#ifndef MAC_OS_X_VERSION_10_6 | ||
#define MAC_OS_X_VERSION_10_6 1060 | ||
#endif | ||
|
||
// ---------------------------------------------------------------------------- | ||
// CPP symbols that can be overridden in a prefix to control how the toolbox | ||
// is compiled. | ||
// ---------------------------------------------------------------------------- | ||
|
||
|
||
// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and | ||
// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens | ||
// when a validation fails. If you implement your own validators, you may want | ||
// to control their internals using the same macros for consistency. | ||
#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT | ||
#define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 0 | ||
#endif | ||
|
||
// Give ourselves a consistent way to do inlines. Apple's macros even use | ||
// a few different actual definitions, so we're based off of the foundation | ||
// one. | ||
#if !defined(GTM_INLINE) | ||
#if defined (__GNUC__) && (__GNUC__ == 4) | ||
#define GTM_INLINE static __inline__ __attribute__((always_inline)) | ||
#else | ||
#define GTM_INLINE static __inline__ | ||
#endif | ||
#endif | ||
|
||
// Give ourselves a consistent way of doing externs that links up nicely | ||
// when mixing objc and objc++ | ||
#if !defined (GTM_EXTERN) | ||
#if defined __cplusplus | ||
#define GTM_EXTERN extern "C" | ||
#else | ||
#define GTM_EXTERN extern | ||
#endif | ||
#endif | ||
|
||
// Give ourselves a consistent way of exporting things if we have visibility | ||
// set to hidden. | ||
#if !defined (GTM_EXPORT) | ||
#define GTM_EXPORT __attribute__((visibility("default"))) | ||
#endif | ||
|
||
// _GTMDevLog & _GTMDevAssert | ||
// | ||
// _GTMDevLog & _GTMDevAssert are meant to be a very lightweight shell for | ||
// developer level errors. This implementation simply macros to NSLog/NSAssert. | ||
// It is not intended to be a general logging/reporting system. | ||
// | ||
// Please see http://code.google.com/p/google-toolbox-for-mac/wiki/DevLogNAssert | ||
// for a little more background on the usage of these macros. | ||
// | ||
// _GTMDevLog log some error/problem in debug builds | ||
// _GTMDevAssert assert if conditon isn't met w/in a method/function | ||
// in all builds. | ||
// | ||
// To replace this system, just provide different macro definitions in your | ||
// prefix header. Remember, any implementation you provide *must* be thread | ||
// safe since this could be called by anything in what ever situtation it has | ||
// been placed in. | ||
// | ||
|
||
// We only define the simple macros if nothing else has defined this. | ||
#ifndef _GTMDevLog | ||
|
||
#ifdef DEBUG | ||
#define _GTMDevLog(...) NSLog(__VA_ARGS__) | ||
#else | ||
#define _GTMDevLog(...) do { } while (0) | ||
#endif | ||
|
||
#endif // _GTMDevLog | ||
|
||
// Declared here so that it can easily be used for logging tracking if | ||
// necessary. See GTMUnitTestDevLog.h for details. | ||
@class NSString; | ||
GTM_EXTERN void _GTMUnitTestDevLog(NSString *format, ...); | ||
|
||
#ifndef _GTMDevAssert | ||
// we directly invoke the NSAssert handler so we can pass on the varargs | ||
// (NSAssert doesn't have a macro we can use that takes varargs) | ||
#if !defined(NS_BLOCK_ASSERTIONS) | ||
#define _GTMDevAssert(condition, ...) \ | ||
do { \ | ||
if (!(condition)) { \ | ||
[[NSAssertionHandler currentHandler] \ | ||
handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \ | ||
file:[NSString stringWithUTF8String:__FILE__] \ | ||
lineNumber:__LINE__ \ | ||
description:__VA_ARGS__]; \ | ||
} \ | ||
} while(0) | ||
#else // !defined(NS_BLOCK_ASSERTIONS) | ||
#define _GTMDevAssert(condition, ...) do { } while (0) | ||
#endif // !defined(NS_BLOCK_ASSERTIONS) | ||
|
||
#endif // _GTMDevAssert | ||
|
||
// _GTMCompileAssert | ||
// _GTMCompileAssert is an assert that is meant to fire at compile time if you | ||
// want to check things at compile instead of runtime. For example if you | ||
// want to check that a wchar is 4 bytes instead of 2 you would use | ||
// _GTMCompileAssert(sizeof(wchar_t) == 4, wchar_t_is_4_bytes_on_OS_X) | ||
// Note that the second "arg" is not in quotes, and must be a valid processor | ||
// symbol in it's own right (no spaces, punctuation etc). | ||
|
||
// Wrapping this in an #ifndef allows external groups to define their own | ||
// compile time assert scheme. | ||
#ifndef _GTMCompileAssert | ||
// We got this technique from here: | ||
// http://unixjunkie.blogspot.com/2007/10/better-compile-time-asserts_29.html | ||
|
||
#define _GTMCompileAssertSymbolInner(line, msg) _GTMCOMPILEASSERT ## line ## __ ## msg | ||
#define _GTMCompileAssertSymbol(line, msg) _GTMCompileAssertSymbolInner(line, msg) | ||
#define _GTMCompileAssert(test, msg) \ | ||
typedef char _GTMCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ] | ||
#endif // _GTMCompileAssert | ||
|
||
// Macro to allow fast enumeration when building for 10.5 or later, and | ||
// reliance on NSEnumerator for 10.4. Remember, NSDictionary w/ FastEnumeration | ||
// does keys, so pick the right thing, nothing is done on the FastEnumeration | ||
// side to be sure you're getting what you wanted. | ||
#ifndef GTM_FOREACH_OBJECT | ||
#if TARGET_OS_IPHONE || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) | ||
#define GTM_FOREACH_OBJECT(element, collection) \ | ||
for (element in collection) | ||
#define GTM_FOREACH_KEY(element, collection) \ | ||
for (element in collection) | ||
#else | ||
#define GTM_FOREACH_OBJECT(element, collection) \ | ||
for (NSEnumerator * _ ## element ## _enum = [collection objectEnumerator]; \ | ||
(element = [_ ## element ## _enum nextObject]) != nil; ) | ||
#define GTM_FOREACH_KEY(element, collection) \ | ||
for (NSEnumerator * _ ## element ## _enum = [collection keyEnumerator]; \ | ||
(element = [_ ## element ## _enum nextObject]) != nil; ) | ||
#endif | ||
#endif | ||
|
||
// ============================================================================ | ||
|
||
// ---------------------------------------------------------------------------- | ||
// CPP symbols defined based on the project settings so the GTM code has | ||
// simple things to test against w/o scattering the knowledge of project | ||
// setting through all the code. | ||
// ---------------------------------------------------------------------------- | ||
|
||
// Provide a single constant CPP symbol that all of GTM uses for ifdefing | ||
// iPhone code. | ||
#if TARGET_OS_IPHONE // iPhone SDK | ||
// For iPhone specific stuff | ||
#define GTM_IPHONE_SDK 1 | ||
#if TARGET_IPHONE_SIMULATOR | ||
#define GTM_IPHONE_SIMULATOR 1 | ||
#else | ||
#define GTM_IPHONE_DEVICE 1 | ||
#endif // TARGET_IPHONE_SIMULATOR | ||
#else | ||
// For MacOS specific stuff | ||
#define GTM_MACOS_SDK 1 | ||
#endif | ||
|
||
// Provide a symbol to include/exclude extra code for GC support. (This mainly | ||
// just controls the inclusion of finalize methods). | ||
#ifndef GTM_SUPPORT_GC | ||
#if GTM_IPHONE_SDK | ||
// iPhone never needs GC | ||
#define GTM_SUPPORT_GC 0 | ||
#else | ||
// We can't find a symbol to tell if GC is supported/required, so best we | ||
// do on Mac targets is include it if we're on 10.5 or later. | ||
#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 | ||
#define GTM_SUPPORT_GC 0 | ||
#else | ||
#define GTM_SUPPORT_GC 1 | ||
#endif | ||
#endif | ||
#endif | ||
|
||
// To simplify support for 64bit (and Leopard in general), we provide the type | ||
// defines for non Leopard SDKs | ||
#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 | ||
// NSInteger/NSUInteger and Max/Mins | ||
#ifndef NSINTEGER_DEFINED | ||
#if __LP64__ || NS_BUILD_32_LIKE_64 | ||
typedef long NSInteger; | ||
typedef unsigned long NSUInteger; | ||
#else | ||
typedef int NSInteger; | ||
typedef unsigned int NSUInteger; | ||
#endif | ||
#define NSIntegerMax LONG_MAX | ||
#define NSIntegerMin LONG_MIN | ||
#define NSUIntegerMax ULONG_MAX | ||
#define NSINTEGER_DEFINED 1 | ||
#endif // NSINTEGER_DEFINED | ||
// CGFloat | ||
#ifndef CGFLOAT_DEFINED | ||
#if defined(__LP64__) && __LP64__ | ||
// This really is an untested path (64bit on Tiger?) | ||
typedef double CGFloat; | ||
#define CGFLOAT_MIN DBL_MIN | ||
#define CGFLOAT_MAX DBL_MAX | ||
#define CGFLOAT_IS_DOUBLE 1 | ||
#else /* !defined(__LP64__) || !__LP64__ */ | ||
typedef float CGFloat; | ||
#define CGFLOAT_MIN FLT_MIN | ||
#define CGFLOAT_MAX FLT_MAX | ||
#define CGFLOAT_IS_DOUBLE 0 | ||
#endif /* !defined(__LP64__) || !__LP64__ */ | ||
#define CGFLOAT_DEFINED 1 | ||
#endif // CGFLOAT_DEFINED | ||
#endif // MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
// | ||
// GTMObjC2Runtime.h | ||
// | ||
// Copyright 2007-2008 Google Inc. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); you may not | ||
// use this file except in compliance with the License. You may obtain a copy | ||
// of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
// License for the specific language governing permissions and limitations under | ||
// the License. | ||
// | ||
|
||
#import <objc/objc-api.h> | ||
#import "GTMDefines.h" | ||
|
||
// These functions exist for code that we want to compile on both the < 10.5 | ||
// sdks and on the >= 10.5 sdks without warnings. It basically reimplements | ||
// certain parts of the objc2 runtime in terms of the objc1 runtime. It is not | ||
// a complete implementation as I've only implemented the routines I know we | ||
// use. Feel free to add more as necessary. | ||
// These functions are not documented because they conform to the documentation | ||
// for the ObjC2 Runtime. | ||
|
||
#if OBJC_API_VERSION >= 2 // Only have optional and req'd keywords in ObjC2. | ||
#define AT_OPTIONAL @optional | ||
#define AT_REQUIRED @required | ||
#else | ||
#define AT_OPTIONAL | ||
#define AT_REQUIRED | ||
#endif | ||
|
||
// The file objc-runtime.h was moved to runtime.h and in Leopard, objc-runtime.h | ||
// was just a wrapper around runtime.h. For the iPhone SDK, this objc-runtime.h | ||
// is removed in the iPhoneOS2.0 SDK. | ||
// | ||
// The |Object| class was removed in the iPhone2.0 SDK too. | ||
#if GTM_IPHONE_SDK | ||
#import <objc/runtime.h> | ||
#else | ||
#import <objc/objc-runtime.h> | ||
#import <objc/Object.h> | ||
#endif | ||
|
||
#import <libkern/OSAtomic.h> | ||
|
||
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 | ||
#import "objc/Protocol.h" | ||
|
||
OBJC_EXPORT Class object_getClass(id obj); | ||
OBJC_EXPORT const char *class_getName(Class cls); | ||
OBJC_EXPORT BOOL class_conformsToProtocol(Class cls, Protocol *protocol); | ||
OBJC_EXPORT Class class_getSuperclass(Class cls); | ||
OBJC_EXPORT Method *class_copyMethodList(Class cls, unsigned int *outCount); | ||
OBJC_EXPORT SEL method_getName(Method m); | ||
OBJC_EXPORT void method_exchangeImplementations(Method m1, Method m2); | ||
OBJC_EXPORT IMP method_getImplementation(Method method); | ||
OBJC_EXPORT IMP method_setImplementation(Method method, IMP imp); | ||
OBJC_EXPORT struct objc_method_description protocol_getMethodDescription(Protocol *p, | ||
SEL aSel, | ||
BOOL isRequiredMethod, | ||
BOOL isInstanceMethod); | ||
|
||
// If building for 10.4 but using the 10.5 SDK, don't include these. | ||
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 | ||
// atomics | ||
// On Leopard these are GC aware | ||
// Intentionally did not include the non-barrier versions, because I couldn't | ||
// come up with a case personally where you wouldn't want to use the | ||
// barrier versions. | ||
GTM_INLINE bool OSAtomicCompareAndSwapPtrBarrier(void *predicate, | ||
void *replacement, | ||
volatile void *theValue) { | ||
#if defined(__LP64__) && __LP64__ | ||
return OSAtomicCompareAndSwap64Barrier((int64_t)predicate, | ||
(int64_t)replacement, | ||
(int64_t *)theValue); | ||
#else // defined(__LP64__) && __LP64__ | ||
return OSAtomicCompareAndSwap32Barrier((int32_t)predicate, | ||
(int32_t)replacement, | ||
(int32_t *)theValue); | ||
#endif // defined(__LP64__) && __LP64__ | ||
} | ||
|
||
GTM_INLINE BOOL objc_atomicCompareAndSwapGlobalBarrier(id predicate, | ||
id replacement, | ||
volatile id *objectLocation) { | ||
return OSAtomicCompareAndSwapPtrBarrier(predicate, | ||
replacement, | ||
objectLocation); | ||
} | ||
GTM_INLINE BOOL objc_atomicCompareAndSwapInstanceVariableBarrier(id predicate, | ||
id replacement, | ||
volatile id *objectLocation) { | ||
return OSAtomicCompareAndSwapPtrBarrier(predicate, | ||
replacement, | ||
objectLocation); | ||
} | ||
#endif | ||
|
||
#endif // OBJC2_UNAVAILABLE |
Oops, something went wrong.