text: /*
   * Copyright (c) 1999-2007 Apple Inc.  All Rights Reserved.
   * 
   * @APPLE_LICENSE_HEADER_START@
   * 
   * This file contains Original Code and/or Modifications of Original Code
   * as defined in and that are subject to the Apple Public Source License
   * Version 2.0 (the 'License'). You may not use this file except in
   * compliance with the License. Please obtain a copy of the License at
   * http://www.opensource.apple.com/apsl/ and read it before using this
   * file.
   * 
   * The Original Code and all software distributed under the License are
   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
   * Please see the License for the specific language governing rights and
   * limitations under the License.
   * 
   * @APPLE_LICENSE_HEADER_END@
   */
  /*
   *	objc.h
   *	Copyright 1988-1996, NeXT Software, Inc.
   */
  
  #ifndef _OBJC_OBJC_H_
  #define _OBJC_OBJC_H_
  
  #include <sys/types.h>      // for __DARWIN_NULL
  #include <Availability.h>
  #include <objc/objc-api.h>
  
  
  typedef struct objc_class *Class;
  typedef struct objc_object {
      Class isa;
  } *id;
  
  
  typedef struct objc_selector 	*SEL;    
  typedef id 			(*IMP)(id, SEL, ...); 
  typedef signed char		BOOL; 
  // BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
  // even if -funsigned-char is used.
  #define OBJC_BOOL_DEFINED
  
  
  #define YES             (BOOL)1
  #define NO              (BOOL)0
  
  #ifndef Nil
  #define Nil __DARWIN_NULL	/* id of Nil class */
  #endif
  
  #ifndef nil
  #define nil __DARWIN_NULL	/* id of Nil instance */
  #endif
  
  #if ! (defined(__OBJC_GC__)  ||  __has_feature(objc_arr))
  #define __strong /* empty */
  #endif
  
  #if !__has_feature(objc_arr)
  #define __unsafe_unretained /* empty */
  #define __autoreleasing /* empty */
  #endif
  
  
  OBJC_EXPORT const char *sel_getName(SEL sel)
      __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
  OBJC_EXPORT SEL sel_registerName(const char *str)
      __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
  OBJC_EXPORT const char *object_getClassName(id obj)
      __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
  OBJC_EXPORT void *object_getIndexedIvars(id obj)
      __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
  OBJC_EXPORT BOOL sel_isMapped(SEL sel)
      __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
  OBJC_EXPORT SEL sel_getUid(const char *str)
      __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
  
  
  
  #ifndef CF_CONSUMED
  #if __has_feature(attribute_cf_consumed)
  #define CF_CONSUMED __attribute__((cf_consumed))
  #else
  #define CF_CONSUMED
  #endif
  #endif
  
  #ifndef CF_RETURNS_NOT_RETAINED
  #if __has_feature(attribute_cf_not_retained)
  #define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained))
  #else
  #define CF_RETURNS_NOT_RETAINED
  #endif
  #endif
  
  #ifndef NS_RETURNS_RETAINED
  #if __has_feature(attribute_ns_returns_retained)
  #define NS_RETURNS_RETAINED __attribute__((ns_returns_retained))
  #else
  #define NS_RETURNS_RETAINED
  #endif
  #endif
  
  #ifndef NS_RETURNS_NOT_RETAINED
  #if __has_feature(attribute_ns_returns_not_retained)
  #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
  #else
  #define NS_RETURNS_NOT_RETAINED
  #endif
  #endif
  
  typedef const void* objc_objectptr_t;
  
  OBJC_EXPORT NS_RETURNS_RETAINED id objc_retainedObject(objc_objectptr_t CF_CONSUMED pointer)
      __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0);
  OBJC_EXPORT NS_RETURNS_NOT_RETAINED id objc_unretainedObject(objc_objectptr_t pointer)
      __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0);
  OBJC_EXPORT CF_RETURNS_NOT_RETAINED objc_objectptr_t objc_unretainedPointer(id object)
      __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0);
  
  #if !__has_feature(objc_arr)
  static OBJC_INLINE NS_RETURNS_RETAINED id ___inline_objc_retainedObject(objc_objectptr_t CF_CONSUMED pointer) { return (id)pointer; }
  static OBJC_INLINE NS_RETURNS_NOT_RETAINED id ___inline_objc_unretainedObject(objc_objectptr_t pointer) { return (id)pointer; }
  static OBJC_INLINE CF_RETURNS_NOT_RETAINED objc_objectptr_t ___inline_objc_unretainedPointer(id object) { return (objc_objectptr_t)object; }
  #define objc_retainedObject ___inline_objc_retainedObject
  #define objc_unretainedObject ___inline_objc_unretainedObject
  #define objc_unretainedPointer ___inline_objc_unretainedPointer
  #endif
  
  
  #if !__OBJC2__
  
  // The following declarations are provided here for source compatibility.
  
  #if defined(__LP64__)
      typedef long arith_t;
      typedef unsigned long uarith_t;
  #   define ARITH_SHIFT 32
  #else
      typedef int arith_t;
      typedef unsigned uarith_t;
  #   define ARITH_SHIFT 16
  #endif
  
  typedef char *STR;
  
  #define ISSELECTOR(sel) sel_isMapped(sel)
  #define SELNAME(sel)	sel_getName(sel)
  #define SELUID(str)	sel_getUid(str)
  #define NAMEOF(obj)     object_getClassName(obj)
  #define IV(obj)         object_getIndexedIvars(obj)
  
  #endif
  
  #endif  /* _OBJC_OBJC_H_ */
  