CollectionUtils.h
author Jens Alfke <jens@mooseyard.com>
Wed Sep 02 08:41:25 2009 -0700 (2009-09-02)
changeset 35 5cab3034d3a1
parent 31 2068331949ee
permissions -rw-r--r--
10.6 compatibility: Fix some new compiler warnings, and work around apparent regressions in NSTask and -stringByStandardizingPath.
     1 //
     2 //  CollectionUtils.h
     3 //  MYUtilities
     4 //
     5 //  Created by Jens Alfke on 1/5/08.
     6 //  Copyright 2008 Jens Alfke. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 #define _MYUTILITIES_COLLECTIONUTILS_ 1
    11 
    12 // Collection creation conveniences:
    13 
    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)];})
    18 
    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));})
    23 
    24 #define $object(VAL)        ({__typeof(VAL) v=(VAL); _box(&v,@encode(__typeof(v)));})
    25 
    26 
    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 );
    30 
    31 
    32 // Object conveniences:
    33 
    34 BOOL $equal(id obj1, id obj2);      // Like -isEqual: but works even if either/both are nil
    35 
    36 NSString* $string( const char *utf8Str );
    37 
    38 #define $sprintf(FORMAT, ARGS... )  [NSString stringWithFormat: (FORMAT), ARGS]
    39 
    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)))
    44 
    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 );
    49 
    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);}
    52 
    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 );
    56 
    57 
    58 #define $true   ((NSNumber*)kCFBooleanTrue)
    59 #define $false  ((NSNumber*)kCFBooleanFalse)
    60 
    61 
    62 @interface NSArray (MYUtils)
    63 - (BOOL) my_containsObjectIdenticalTo: (id)object;
    64 @end
    65 
    66 
    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;
    71 @end
    72 
    73 
    74 @interface NSData (MYUtils)
    75 - (NSString*) my_UTF8ToString;
    76 @end
    77 
    78 
    79 
    80 #pragma mark -
    81 #pragma mark FOREACH:
    82     
    83 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
    84 #define foreach(VAR,ARR) for(VAR in ARR)
    85 
    86 #else
    87 struct foreachstate {NSArray *array; unsigned n, i;};
    88 static inline struct foreachstate _initforeach( NSArray *arr ) {
    89     struct foreachstate s;
    90     s.array = arr;
    91     s.n = [arr count];
    92     s.i = 0;
    93     return s;
    94 }
    95 #define foreach(VAR,ARR) for( struct foreachstate _s = _initforeach((ARR)); \
    96                                    _s.i<_s.n && ((VAR)=[_s.array objectAtIndex: _s.i], YES); \
    97                                    _s.i++ )
    98 #endif
    99 
   100 
   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);
   106 id _cast(Class,id);
   107 id _castNotNil(Class,id);
   108 id _castIf(Class,id);
   109 NSArray* _castArrayOf(Class,NSArray*);