1 /** Interface to ObjC runtime for GNUStep 2 Copyright (C) 1995, 1997, 2000 Free Software Foundation, Inc. 3 4 Written by: Andrew Kachites McCallum <mccallum@gnu.ai.mit.edu> 5 Date: 1995 6 7 This file is part of the GNUstep Base Library. 8 9 This library is free software; you can redistribute it and/or 10 modify it under the terms of the GNU Lesser General Public 11 License as published by the Free Software Foundation; either 12 version 2 of the License, or (at your option) any later version. 13 14 This library is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 Library General Public License for more details. 18 19 You should have received a copy of the GNU Lesser General Public 20 License along with this library; if not, write to the Free 21 Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 22 Boston, MA 02111 USA. 23 24 AutogsdocSource: NSObjCRuntime.m 25 AutogsdocSource: NSLog.m 26 27 */ 28 29 #ifndef __NSObjCRuntime_h_GNUSTEP_BASE_INCLUDE 30 #define __NSObjCRuntime_h_GNUSTEP_BASE_INCLUDE 31 32 #ifdef __cplusplus 33 #ifndef __STDC_LIMIT_MACROS 34 #define __STDC_LIMIT_MACROS 1 35 #endif 36 #endif 37 38 #import "../GNUstepBase/GSVersionMacros.h" 39 #import "../GNUstepBase/GSConfig.h" 40 #import "../GNUstepBase/GNUstep.h" 41 #if __BLOCKS__ 42 #import "../GNUstepBase/GSBlocks.h" 43 #endif 44 45 #include <stdarg.h> 46 #include <limits.h> 47 #include <float.h> 48 49 /* PA HP-UX kludge. */ 50 #if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) 51 #define PRIuPTR "lu" 52 #endif 53 54 /* IRIX kludge. */ 55 #if defined(__sgi) 56 /* IRIX 6.5 <inttypes.h> provides all definitions, but only for C99 57 compilations. */ 58 #define PRId8 "hhd" 59 #define PRIu8 "hhu" 60 #if (_MIPS_SZLONG == 32) 61 #define PRId64 "lld" 62 #define PRIu64 "llu" 63 #endif 64 /* This doesn't match <inttypes.h>, which always has "lld" here, but the 65 arguments are uint64_t, int64_t, which are unsigned long, long for 66 64-bit in <sgidefs.h>. */ 67 #if (_MIPS_SZLONG == 64) 68 #define PRId64 "ld" 69 #define PRIu64 "lu" 70 #endif 71 /* This doesn't match <inttypes.h>, which has "u" here, but the arguments 72 are uintptr_t, which is always unsigned long. */ 73 #define PRIuPTR "lu" 74 #endif 75 76 /* Solaris < 10 kludge. */ 77 #if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) 78 #if defined(__arch64__) || defined (__x86_64__) 79 #define PRIuPTR "lu" 80 #define PRIdPTR "ld" 81 #define PRIxPTR "lx" 82 #else 83 #define PRIuPTR "u" 84 #define PRIdPTR "d" 85 #define PRIxPTR "x" 86 #endif 87 #endif 88 89 90 /* These typedefs must be in place before GSObjCRuntime.h is imported. 91 */ 92 93 #if !defined(NSINTEGER_DEFINED) 94 typedef intptr_t NSInteger; 95 typedef uintptr_t NSUInteger; 96 # define NSIntegerMax INTPTR_MAX 97 # define NSIntegerMin INTPTR_MIN 98 # define NSUIntegerMax UINTPTR_MAX 99 #endif /* !defined(NSINTEGER_DEFINED) */ 100 101 #if !defined(CGFLOAT_DEFINED) 102 #if GS_SIZEOF_VOIDP == 8 103 #define CGFLOAT_IS_DBL 1 104 typedef double CGFloat; 105 #define CGFLOAT_MIN DBL_MIN 106 #define CGFLOAT_MAX DBL_MAX 107 #else 108 typedef float CGFloat; 109 #define CGFLOAT_MIN FLT_MIN 110 #define CGFLOAT_MAX FLT_MAX 111 #endif 112 #endif /* !defined(CGFLOAT_DEFINED) */ 113 114 #define NSINTEGER_DEFINED 1 115 #define CGFLOAT_DEFINED 1 116 #ifndef NS_AUTOMATED_REFCOUNT_UNAVAILABLE 117 # if __has_feature(objc_arc) 118 # define NS_AUTOMATED_REFCOUNT_UNAVAILABLE \ 119 __attribute__((unavailable("Not available with automatic reference counting"))) 120 # else 121 # define NS_AUTOMATED_REFCOUNT_UNAVAILABLE 122 # endif 123 #endif 124 125 126 #if defined(__cplusplus) 127 extern "C" { 128 #endif 129 130 131 /* 132 * We can have strongly typed enums in C++11 mode or when the objc_fixed_enum 133 * feature is availble. 134 */ 135 #if (__has_feature(objc_fixed_enum) || (__cplusplus && (__cplusplus > 199711L) && __has_extension(cxx_strong_enums))) 136 # define _GS_NAMED_ENUM(ty, name) enum name : ty name; enum name : ty 137 # define _GS_ANON_ENUM(ty) enum : ty 138 # if __cplusplus 139 # define NS_OPTIONS(ty,name) ty name; enum : ty 140 # else 141 # define NS_OPTIONS(ty,name) NS_ENUM(ty,name) 142 # endif 143 #else // this provides less information, but works with older compilers 144 # define _GS_NAMED_ENUM(ty, name) ty name; enum 145 # define _GS_ANON_ENUM(ty) enum 146 # define NS_OPTIONS(ty, name) NS_ENUM(ty, name) 147 #endif 148 // A bit of fairy dust to expand NS_ENUM to the correct variant 149 #define _GS_GET_ENUM_MACRO(_first,_second,NAME,...) NAME 150 /* The trick here is that placing the variadic args first will push the name 151 * that the _GS_GET_ENUM_MACRO expands to into the correct position. 152 */ 153 #define NS_ENUM(...) _GS_GET_ENUM_MACRO(__VA_ARGS__,_GS_NAMED_ENUM,_GS_ANON_ENUM)(__VA_ARGS__) 154 155 /* 156 * If the compiler supports nullability qualifiers, we define the macros for 157 * non-null sections. 158 */ 159 #if __has_feature(nullability) 160 # define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin") 161 # define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end") 162 #else 163 # define NS_ASSUME_NONNULL_BEGIN 164 # define NS_ASSUME_NONNULL_END 165 #endif 166 167 /* 168 * Backwards compatibility macro for instance type. 169 */ 170 #if !__has_feature(objc_instancetype) 171 # define instancetype id 172 #endif 173 174 /* 175 * Backwards compatibility macros for Objective-C lightweight generics. 176 */ 177 #if __has_feature(objc_generics) 178 # define GS_GENERIC_CLASS(clz, ...) clz<__VA_ARGS__> 179 # define GS_GENERIC_TYPE_F(typeRef, fallback) typeRef 180 #else 181 # define GS_GENERIC_CLASS(clz, ...) clz 182 # define GS_GENERIC_TYPE_F(typeRef, fallback) fallback 183 #endif 184 #define GS_GENERIC_TYPE(typeRef) GS_GENERIC_TYPE_F(typeRef, id) 185 186 /** 187 * Backwards compatibility macro for the objc_designated_initializer attribute 188 */ 189 #if __has_attribute(objc_designated_initializer) 190 # define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) 191 #else 192 # define NS_DESIGNATED_INITIALIZER 193 #endif 194 195 /** Bitfield used to specify options to control enumeration over collections. 196 */ 197 typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) 198 { 199 NSEnumerationConcurrent = (1UL << 0), /** Specifies that the enumeration 200 * is concurrency-safe. Note that this does not mean that it will be 201 * carried out in a concurrent manner, only that it can be. 202 */ 203 204 NSEnumerationReverse = (1UL << 1) /** Specifies that the enumeration should 205 * happen in the opposite of the natural order of the collection. 206 */ 207 }; 208 209 210 /** Bitfield used to specify options to control the sorting of collections. 211 */ 212 typedef NS_OPTIONS(NSUInteger, NSSortOptions) 213 { 214 NSSortConcurrent = (1UL << 0), /** Specifies that the sort 215 * is concurrency-safe. Note that this does not mean that it will be 216 * carried out in a concurrent manner, only that it can be. 217 */ 218 NSSortStable = (1UL << 4) /** Specifies that the sort should keep 219 * equal objects in the same order in the collection. 220 */ 221 }; 222 223 224 #import "../GNUstepBase/GSObjCRuntime.h" 225 226 #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) 227 GS_EXPORT NSString *NSStringFromProtocol(Protocol *aProtocol); 228 GS_EXPORT Protocol *NSProtocolFromString(NSString *aProtocolName); 229 #endif 230 GS_EXPORT SEL NSSelectorFromString(NSString *aSelectorName); 231 GS_EXPORT NSString *NSStringFromSelector(SEL aSelector); 232 GS_EXPORT SEL NSSelectorFromString(NSString *aSelectorName); 233 GS_EXPORT Class NSClassFromString(NSString *aClassName); 234 GS_EXPORT NSString *NSStringFromClass(Class aClass); 235 GS_EXPORT const char *NSGetSizeAndAlignment(const char *typePtr, 236 NSUInteger *sizep, NSUInteger *alignp); 237 238 #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) 239 /* Logging */ 240 /** 241 * OpenStep spec states that log messages go to stderr, but just in case 242 * someone wants them to go somewhere else, they can implement a function 243 * like this and assign a pointer to it to _NSLog_printf_handler. 244 */ 245 typedef void NSLog_printf_handler (NSString* message); 246 GS_EXPORT NSLog_printf_handler *_NSLog_printf_handler; 247 GS_EXPORT int _NSLogDescriptor; 248 @class NSRecursiveLock; 249 GS_EXPORT NSRecursiveLock *GSLogLock(void); 250 #endif 251 252 GS_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); 253 GS_EXPORT void NSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0); 254 255 #ifndef YES 256 #define YES 1 257 #endif 258 #ifndef NO 259 #define NO 0 260 #endif 261 #ifndef nil 262 #define nil 0 263 #endif 264 265 /** 266 * Contains values <code>NSOrderedSame</code>, <code>NSOrderedAscending</code> 267 * <code>NSOrderedDescending</code>, for left hand side equals, less than, or 268 * greater than right hand side. 269 */ 270 typedef NS_ENUM(NSInteger, NSComparisonResult) 271 { 272 NSOrderedAscending = (NSInteger)-1, NSOrderedSame, NSOrderedDescending 273 }; 274 275 enum {NSNotFound = NSIntegerMax}; 276 277 #if __BLOCKS__ 278 DEFINE_BLOCK_TYPE(NSComparator, NSComparisonResult, id, id); 279 #endif 280 281 /** 282 * Declare the foundation export macro as an alias to GS_EXPORT 283 */ 284 #define FOUNDATION_EXPORT GS_EXPORT 285 286 #if defined(__cplusplus) 287 } 288 #endif 289 290 /** 291 * Declare Apple availability macros for compatibility purposes as no-ops. 292 */ 293 #define NS_CLASS_AVAILABLE(...) 294 #define NS_AVAILABLE(...) 295 #define NS_AVAILABLE_MAC(...) 296 #define NS_DEPRECATED(...) 297 #define NS_DEPRECATED_MAC(...) 298 #define NS_ENUM_AVAILABLE(...) 299 #define NS_ENUM_AVAILABLE_MAC(...) 300 #define NS_ENUM_DEPRECATED(...) 301 #define NS_ENUM_DEPRECATED_MAC(...) 302 #define NS_CLASS_AVAILABLE(...) 303 #define NS_CLASS_DEPRECATED(...) 304 #define NS_CLASS_AVAILABLE_MAC(...) 305 #define NS_CLASS_DEPRECATED_MAC(...) 306 #define NS_UNAVAILABLE 307 308 /* Define root class NS macro */ 309 #ifndef NS_ROOT_CLASS 310 #if __has_attribute(objc_root_class) 311 #define NS_ROOT_CLASS __attribute__((objc_root_class)) 312 #else 313 #define NS_ROOT_CLASS 314 #endif 315 #endif 316 317 #endif /* __NSObjCRuntime_h_GNUSTEP_BASE_INCLUDE */ 318