10.6 compatibility: Fix some new compiler warnings, and work around apparent regressions in NSTask and -stringByStandardizingPath.
5 // Created by Jens Alfke on 1/5/08.
6 // Copyright 2008 Jens Alfke. All rights reserved.
9 #import <Foundation/Foundation.h>
10 #define _MYUTILITIES_COLLECTIONUTILS_ 1
12 // Collection creation conveniences:
14 #define $array(OBJS...) ({id objs[]={OBJS}; \
15 [NSArray arrayWithObjects: objs count: sizeof(objs)/sizeof(id)];})
16 #define $marray(OBJS...) ({id objs[]={OBJS}; \
17 [NSMutableArray arrayWithObjects: objs count: sizeof(objs)/sizeof(id)];})
19 #define $dict(PAIRS...) ({struct _dictpair pairs[]={PAIRS}; \
20 _dictof(pairs,sizeof(pairs)/sizeof(struct _dictpair));})
21 #define $mdict(PAIRS...) ({struct _dictpair pairs[]={PAIRS}; \
22 _mdictof(pairs,sizeof(pairs)/sizeof(struct _dictpair));})
24 #define $object(VAL) ({__typeof(VAL) v=(VAL); _box(&v,@encode(__typeof(v)));})
27 // Apply a selector to each array element, returning an array of the results:
28 NSArray* $apply( NSArray *src, SEL selector, id defaultValue );
29 NSArray* $applyKeyPath( NSArray *src, NSString *keyPath, id defaultValue );
32 // Object conveniences:
34 BOOL $equal(id obj1, id obj2); // Like -isEqual: but works even if either/both are nil
36 NSString* $string( const char *utf8Str );
38 #define $sprintf(FORMAT, ARGS... ) [NSString stringWithFormat: (FORMAT), ARGS]
40 #define $cast(CLASSNAME,OBJ) ((CLASSNAME*)(_cast([CLASSNAME class],(OBJ))))
41 #define $castNotNil(CLASSNAME,OBJ) ((CLASSNAME*)(_castNotNil([CLASSNAME class],(OBJ))))
42 #define $castIf(CLASSNAME,OBJ) ((CLASSNAME*)(_castIf([CLASSNAME class],(OBJ))))
43 #define $castArrayOf(ITEMCLASSNAME,OBJ) _castArrayOf([ITEMCLASSNAME class],(OBJ)))
45 void setObj( id *var, id value );
46 BOOL ifSetObj( id *var, id value );
47 void setObjCopy( id *var, id valueToCopy );
48 BOOL ifSetObjCopy( id *var, id value );
50 static inline void setString( NSString **var, NSString *value ) {setObjCopy(var,value);}
51 static inline BOOL ifSetString( NSString **var, NSString *value ) {return ifSetObjCopy(var,value);}
53 BOOL kvSetSet( id owner, NSString *property, NSMutableSet *set, NSSet *newSet );
54 BOOL kvAddToSet( id owner, NSString *property, NSMutableSet *set, id objToAdd );
55 BOOL kvRemoveFromSet( id owner, NSString *property, NSMutableSet *set, id objToRemove );
58 #define $true ((NSNumber*)kCFBooleanTrue)
59 #define $false ((NSNumber*)kCFBooleanFalse)
62 @interface NSArray (MYUtils)
63 - (BOOL) my_containsObjectIdenticalTo: (id)object;
67 @interface NSSet (MYUtils)
68 + (NSSet*) my_unionOfSet: (NSSet*)set1 andSet: (NSSet*)set2;
69 + (NSSet*) my_intersectionOfSet: (NSSet*)set1 andSet: (NSSet*)set2;
70 + (NSSet*) my_differenceOfSet: (NSSet*)set1 andSet: (NSSet*)set2;
74 @interface NSData (MYUtils)
75 - (NSString*) my_UTF8ToString;
83 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
84 #define foreach(VAR,ARR) for(VAR in ARR)
87 struct foreachstate {NSArray *array; unsigned n, i;};
88 static inline struct foreachstate _initforeach( NSArray *arr ) {
89 struct foreachstate s;
95 #define foreach(VAR,ARR) for( struct foreachstate _s = _initforeach((ARR)); \
96 _s.i<_s.n && ((VAR)=[_s.array objectAtIndex: _s.i], YES); \
101 // Internals (don't use directly)
102 struct _dictpair { id key; id value; };
103 NSDictionary* _dictof(const struct _dictpair*, size_t count);
104 NSMutableDictionary* _mdictof(const struct _dictpair*, size_t count);
105 NSValue* _box(const void *value, const char *encoding);
107 id _castNotNil(Class,id);
108 id _castIf(Class,id);
109 NSArray* _castArrayOf(Class,NSArray*);