1/*
2 * Copyright (c) 1999-2006 Apple Inc.  All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23// Copyright 1988-1996 NeXT Software, Inc.
24
25#ifndef _OBJC_OBJC_API_H_
26#define _OBJC_OBJC_API_H_
27
28#include <Availability.h>
29#include <AvailabilityMacros.h>
30#include <TargetConditionals.h>
31
32#ifndef __has_feature
33#   define __has_feature(x) 0
34#endif
35
36#ifndef __has_extension
37#   define __has_extension __has_feature
38#endif
39
40#ifndef __has_attribute
41#   define __has_attribute(x) 0
42#endif
43
44
45/*
46 * OBJC_API_VERSION 0 or undef: Tiger and earlier API only
47 * OBJC_API_VERSION 2: Leopard and later API available
48 */
49#if !defined(OBJC_API_VERSION)
50#   if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)  &&  __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_5
51#       define OBJC_API_VERSION 0
52#   else
53#       define OBJC_API_VERSION 2
54#   endif
55#endif
56
57
58/* OBJC_OLD_DISPATCH_PROTOTYPES == 0 enforces the rule that the dispatch
59 * functions must be cast to an appropriate function pointer type. */
60#if !defined(OBJC_OLD_DISPATCH_PROTOTYPES)
61#   define OBJC_OLD_DISPATCH_PROTOTYPES 1
62#endif
63
64
65/* OBJC_ISA_AVAILABILITY: `isa` will be deprecated or unavailable
66 * in the future */
67#if !defined(OBJC_ISA_AVAILABILITY)
68#   if __OBJC2__
69#       define OBJC_ISA_AVAILABILITY  __attribute__((deprecated))
70#   else
71#       define OBJC_ISA_AVAILABILITY  /* still available */
72#   endif
73#endif
74
75
76/* OBJC2_UNAVAILABLE: unavailable in objc 2.0, deprecated in Leopard */
77#if !defined(OBJC2_UNAVAILABLE)
78#   if __OBJC2__
79#       define OBJC2_UNAVAILABLE UNAVAILABLE_ATTRIBUTE
80#   else
81        /* plain C code also falls here, but this is close enough */
82#       define OBJC2_UNAVAILABLE __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_5, __IPHONE_2_0,__IPHONE_2_0)
83#   endif
84#endif
85
86/* OBJC_ARC_UNAVAILABLE: unavailable with -fobjc-arc */
87#if !defined(OBJC_ARC_UNAVAILABLE)
88#   if __has_feature(objc_arc)
89#       if __has_extension(attribute_unavailable_with_message)
90#           define OBJC_ARC_UNAVAILABLE __attribute__((unavailable("not available in automatic reference counting mode")))
91#       else
92#           define OBJC_ARC_UNAVAILABLE __attribute__((unavailable))
93#       endif
94#   else
95#       define OBJC_ARC_UNAVAILABLE
96#   endif
97#endif
98
99#if !defined(OBJC_HIDE_64)
100/* OBJC_ARM64_UNAVAILABLE: unavailable on arm64 (i.e. stret dispatch) */
101#if !defined(OBJC_ARM64_UNAVAILABLE)
102#   if defined(__arm64__)
103#       define OBJC_ARM64_UNAVAILABLE __attribute__((unavailable("not available in arm64")))
104#   else
105#       define OBJC_ARM64_UNAVAILABLE
106#   endif
107#endif
108#endif
109
110/* OBJC_GC_UNAVAILABLE: unavailable with -fobjc-gc or -fobjc-gc-only */
111#if !defined(OBJC_GC_UNAVAILABLE)
112#   if __OBJC_GC__
113#       if __has_extension(attribute_unavailable_with_message)
114#           define OBJC_GC_UNAVAILABLE __attribute__((unavailable("not available in garbage collecting mode")))
115#       else
116#           define OBJC_GC_UNAVAILABLE __attribute__((unavailable))
117#       endif
118#   else
119#       define OBJC_GC_UNAVAILABLE
120#   endif
121#endif
122
123#if !defined(OBJC_EXTERN)
124#   if defined(__cplusplus)
125#       define OBJC_EXTERN extern "C"
126#   else
127#       define OBJC_EXTERN extern
128#   endif
129#endif
130
131#if !defined(OBJC_VISIBLE)
132#   if TARGET_OS_WIN32
133#       if defined(BUILDING_OBJC)
134#           define OBJC_VISIBLE __declspec(dllexport)
135#       else
136#           define OBJC_VISIBLE __declspec(dllimport)
137#       endif
138#   else
139#       define OBJC_VISIBLE  __attribute__((visibility("default")))
140#   endif
141#endif
142
143#if !defined(OBJC_EXPORT)
144#   define OBJC_EXPORT  OBJC_EXTERN OBJC_VISIBLE
145#endif
146
147#if !defined(OBJC_IMPORT)
148#   define OBJC_IMPORT extern
149#endif
150
151#if !defined(OBJC_ROOT_CLASS)
152#   if __has_attribute(objc_root_class)
153#       define OBJC_ROOT_CLASS __attribute__((objc_root_class))
154#   else
155#       define OBJC_ROOT_CLASS
156#   endif
157#endif
158
159#ifndef __DARWIN_NULL
160#define __DARWIN_NULL NULL
161#endif
162
163#if !defined(OBJC_INLINE)
164#   define OBJC_INLINE __inline
165#endif
166
167#endif
168