00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00038 #ifndef CC_ARRAY_H
00039 #define CC_ARRAY_H
00040
00041 #import <Foundation/Foundation.h>
00042
00043 #import <stdlib.h>
00044 #import <string.h>
00045
00046
00047 #pragma mark -
00048 #pragma mark ccArray for Objects
00049
00050
00051 #define CCARRAYDATA_FOREACH(__array__, __object__) \
00052 __object__=__array__->arr[0]; for(int i=0, num=__array__->num; i<num; i++, __object__=__array__->arr[i]) \
00053
00054
00055 typedef struct ccArray {
00056 NSUInteger num, max;
00057 id *arr;
00058 } ccArray;
00059
00061 static inline ccArray* ccArrayNew(NSUInteger capacity) {
00062 if (capacity == 0)
00063 capacity = 1;
00064
00065 ccArray *arr = (ccArray*)malloc( sizeof(ccArray) );
00066 arr->num = 0;
00067 arr->arr = (id*) malloc( capacity * sizeof(id) );
00068 arr->max = capacity;
00069
00070 return arr;
00071 }
00072
00073 static inline void ccArrayRemoveAllObjects(ccArray *arr);
00074
00076 static inline void ccArrayFree(ccArray *arr)
00077 {
00078 if( arr == nil ) return;
00079
00080 ccArrayRemoveAllObjects(arr);
00081
00082 free(arr->arr);
00083 free(arr);
00084 }
00085
00087 static inline void ccArrayDoubleCapacity(ccArray *arr)
00088 {
00089 arr->max *= 2;
00090 arr->arr = (id*) realloc( arr->arr, arr->max * sizeof(id) );
00091 }
00092
00094 static inline void ccArrayEnsureExtraCapacity(ccArray *arr, NSUInteger extra)
00095 {
00096 while (arr->max < arr->num + extra)
00097 ccArrayDoubleCapacity(arr);
00098 }
00099
00101 static inline NSUInteger ccArrayGetIndexOfObject(ccArray *arr, id object)
00102 {
00103 for( NSUInteger i = 0; i < arr->num; i++)
00104 if( arr->arr[i] == object ) return i;
00105 return NSNotFound;
00106 }
00107
00109 static inline BOOL ccArrayContainsObject(ccArray *arr, id object)
00110 {
00111 return ccArrayGetIndexOfObject(arr, object) != NSNotFound;
00112 }
00113
00115 static inline void ccArrayAppendObject(ccArray *arr, id object)
00116 {
00117 arr->arr[arr->num] = [object retain];
00118 arr->num++;
00119 }
00120
00122 static inline void ccArrayAppendObjectWithResize(ccArray *arr, id object)
00123 {
00124 ccArrayEnsureExtraCapacity(arr, 1);
00125 ccArrayAppendObject(arr, object);
00126 }
00127
00130 static inline void ccArrayAppendArray(ccArray *arr, ccArray *plusArr)
00131 {
00132 for( NSUInteger i = 0; i < plusArr->num; i++)
00133 ccArrayAppendObject(arr, plusArr->arr[i]);
00134 }
00135
00137 static inline void ccArrayAppendArrayWithResize(ccArray *arr, ccArray *plusArr)
00138 {
00139 ccArrayEnsureExtraCapacity(arr, plusArr->num);
00140 ccArrayAppendArray(arr, plusArr);
00141 }
00142
00143 static inline void ccArrayInsertObjectAtIndex(ccArray *arr, id object, NSUInteger index)
00144 {
00145 NSCAssert(index<=arr->num, @"Invalid index. Out of bounds");
00146
00147 ccArrayEnsureExtraCapacity(arr, 1);
00148
00149 for( NSUInteger i = arr->num; index < i; i--)
00150 arr->arr[i] = arr->arr[i - 1];
00151
00152 arr->arr[index] = [object retain];
00153 arr->num++;
00154 }
00155
00157 static inline void ccArrayRemoveAllObjects(ccArray *arr)
00158 {
00159 while( arr->num > 0 )
00160 [arr->arr[--arr->num] release];
00161 }
00162
00165 static inline void ccArrayRemoveObjectAtIndex(ccArray *arr, NSUInteger index)
00166 {
00167 [arr->arr[index] release];
00168
00169 for( NSUInteger last = --arr->num; index < last; index++)
00170 arr->arr[index] = arr->arr[index + 1];
00171 }
00172
00176 static inline void ccArrayFastRemoveObjectAtIndex(ccArray *arr, NSUInteger index)
00177 {
00178 [arr->arr[index] release];
00179 NSUInteger last = --arr->num;
00180 arr->arr[index] = arr->arr[last];
00181 }
00182
00183 static inline void ccArrayFastRemoveObject(ccArray *arr, id object)
00184 {
00185 NSUInteger index = ccArrayGetIndexOfObject(arr, object);
00186 if (index != NSNotFound)
00187 ccArrayFastRemoveObjectAtIndex(arr, index);
00188 }
00189
00192 static inline void ccArrayRemoveObject(ccArray *arr, id object)
00193 {
00194 NSUInteger index = ccArrayGetIndexOfObject(arr, object);
00195 if (index != NSNotFound)
00196 ccArrayRemoveObjectAtIndex(arr, index);
00197 }
00198
00201 static inline void ccArrayRemoveArray(ccArray *arr, ccArray *minusArr)
00202 {
00203 for( NSUInteger i = 0; i < minusArr->num; i++)
00204 ccArrayRemoveObject(arr, minusArr->arr[i]);
00205 }
00206
00209 static inline void ccArrayFullRemoveArray(ccArray *arr, ccArray *minusArr)
00210 {
00211 NSUInteger back = 0;
00212
00213 for( NSUInteger i = 0; i < arr->num; i++) {
00214 if( ccArrayContainsObject(minusArr, arr->arr[i]) ) {
00215 [arr->arr[i] release];
00216 back++;
00217 } else
00218 arr->arr[i - back] = arr->arr[i];
00219 }
00220
00221 arr->num -= back;
00222 }
00223
00225 static inline void ccArrayMakeObjectsPerformSelector(ccArray *arr, SEL sel)
00226 {
00227 for( NSUInteger i = 0; i < arr->num; i++)
00228 [arr->arr[i] performSelector:sel];
00229 }
00230
00231 static inline void ccArrayMakeObjectsPerformSelectorWithObject(ccArray *arr, SEL sel, id object)
00232 {
00233 for( NSUInteger i = 0; i < arr->num; i++)
00234 [arr->arr[i] performSelector:sel withObject:object];
00235 }
00236
00237
00238 #pragma mark -
00239 #pragma mark ccCArray for Values (c structures)
00240
00241 typedef ccArray ccCArray;
00242
00243 static inline void ccCArrayRemoveAllValues(ccCArray *arr);
00244
00246 static inline ccCArray* ccCArrayNew(NSUInteger capacity) {
00247 if (capacity == 0)
00248 capacity = 1;
00249
00250 ccCArray *arr = (ccCArray*)malloc( sizeof(ccCArray) );
00251 arr->num = 0;
00252 arr->arr = (id*) malloc( capacity * sizeof(id) );
00253 arr->max = capacity;
00254
00255 return arr;
00256 }
00257
00259 static inline void ccCArrayFree(ccCArray *arr)
00260 {
00261 if( arr == nil ) return;
00262
00263 ccCArrayRemoveAllValues(arr);
00264
00265 free(arr->arr);
00266 free(arr);
00267 }
00268
00270 static inline void ccCArrayDoubleCapacity(ccCArray *arr)
00271 {
00272 return ccArrayDoubleCapacity(arr);
00273 }
00274
00276 static inline void ccCArrayEnsureExtraCapacity(ccCArray *arr, NSUInteger extra)
00277 {
00278 return ccArrayEnsureExtraCapacity(arr,extra);
00279 }
00280
00282 static inline NSUInteger ccCArrayGetIndexOfValue(ccCArray *arr, void* value)
00283 {
00284 for( NSUInteger i = 0; i < arr->num; i++)
00285 if( arr->arr[i] == value ) return i;
00286 return NSNotFound;
00287 }
00288
00290 static inline BOOL ccCArrayContainsValue(ccCArray *arr, void* value)
00291 {
00292 return ccCArrayGetIndexOfValue(arr, value) != NSNotFound;
00293 }
00294
00296 static inline void ccCArrayInsertValueAtIndex( ccCArray *arr, void *value, NSUInteger index)
00297 {
00298 assert( index < arr->max );
00299
00300 int remaining = arr->num - index;
00301
00302
00303 if( remaining > 0) {
00304
00305 memmove( &arr->arr[index+1],&arr->arr[index], sizeof(void*) * remaining );
00306 }
00307
00308 arr->num++;
00309 arr->arr[index] = (id) value;
00310 }
00311
00313 static inline void ccCArrayAppendValue(ccCArray *arr, void* value)
00314 {
00315 arr->arr[arr->num] = (id) value;
00316 arr->num++;
00317 }
00318
00320 static inline void ccCArrayAppendValueWithResize(ccCArray *arr, void* value)
00321 {
00322 ccCArrayEnsureExtraCapacity(arr, 1);
00323 ccCArrayAppendValue(arr, value);
00324 }
00325
00328 static inline void ccCArrayAppendArray(ccCArray *arr, ccCArray *plusArr)
00329 {
00330 for( NSUInteger i = 0; i < plusArr->num; i++)
00331 ccCArrayAppendValue(arr, plusArr->arr[i]);
00332 }
00333
00335 static inline void ccCArrayAppendArrayWithResize(ccCArray *arr, ccCArray *plusArr)
00336 {
00337 ccCArrayEnsureExtraCapacity(arr, plusArr->num);
00338 ccCArrayAppendArray(arr, plusArr);
00339 }
00340
00342 static inline void ccCArrayRemoveAllValues(ccCArray *arr)
00343 {
00344 arr->num = 0;
00345 }
00346
00351 static inline void ccCArrayRemoveValueAtIndex(ccCArray *arr, NSUInteger index)
00352 {
00353 for( NSUInteger last = --arr->num; index < last; index++)
00354 arr->arr[index] = arr->arr[index + 1];
00355 }
00356
00362 static inline void ccCArrayFastRemoveValueAtIndex(ccCArray *arr, NSUInteger index)
00363 {
00364 NSUInteger last = --arr->num;
00365 arr->arr[index] = arr->arr[last];
00366 }
00367
00371 static inline void ccCArrayRemoveValue(ccCArray *arr, void* value)
00372 {
00373 NSUInteger index = ccCArrayGetIndexOfValue(arr, value);
00374 if (index != NSNotFound)
00375 ccCArrayRemoveValueAtIndex(arr, index);
00376 }
00377
00381 static inline void ccCArrayRemoveArray(ccCArray *arr, ccCArray *minusArr)
00382 {
00383 for( NSUInteger i = 0; i < minusArr->num; i++)
00384 ccCArrayRemoveValue(arr, minusArr->arr[i]);
00385 }
00386
00390 static inline void ccCArrayFullRemoveArray(ccCArray *arr, ccCArray *minusArr)
00391 {
00392 NSUInteger back = 0;
00393
00394 for( NSUInteger i = 0; i < arr->num; i++) {
00395 if( ccCArrayContainsValue(minusArr, arr->arr[i]) ) {
00396 back++;
00397 } else
00398 arr->arr[i - back] = arr->arr[i];
00399 }
00400
00401 arr->num -= back;
00402 }
00403 #endif // CC_ARRAY_H