mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-24 22:22:21 +00:00
Added private GSFastEnumeration header. This defines two macros that allow fast enumeration to be used inside GNUstep. Use, for example:
NSArray *a= [NSArray arrayWithObjects: @"a", @"b", @"c", nil]; FOR_IN(NSString*, o, a) NSLog(@"%@", o); END_FOR_IN(a) This is equivalent to: for (NSString *o in a) { NSLog(@"%@", o); } On clang, it will be expanded to exactly that. With GCC, it will be expanded to something equivalent to the code that Clang (or Apple GCC) would expand this to. This is a private GNUstep header and is not intended for general use. Outside of GNUstep, please use fast enumeration directly. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@29170 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
2c401de4f4
commit
ea5f15deb0
2 changed files with 41 additions and 0 deletions
37
Source/GSFastEnumeration.h
Normal file
37
Source/GSFastEnumeration.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
|
||||
#ifdef __clang__
|
||||
#define FOR_IN(type, var, collection) \
|
||||
for (type var in collection)
|
||||
#define END_FOR_IN(collection) }
|
||||
#else
|
||||
|
||||
#define FOR_IN(type, var, c) \
|
||||
do\
|
||||
{\
|
||||
type var;\
|
||||
volatile NSFastEnumerationState gs_##c##_enumState = { 0 };\
|
||||
id gs_##c##_items[16];\
|
||||
unsigned long gs_##c##_limit = \
|
||||
[c countByEnumeratingWithState: &gs_##c##_enumState \
|
||||
objects: gs_##c##_items \
|
||||
count: 16];\
|
||||
if (gs_##c##_limit)\
|
||||
{\
|
||||
unsigned long gs_startMutations = *gs_##c##_enumState.mutationsPtr;\
|
||||
do {\
|
||||
unsigned long gs_##c##counter = 0;\
|
||||
do {\
|
||||
if (gs_startMutations != *gs_##c##_enumState.mutationsPtr)\
|
||||
{\
|
||||
objc_enumerationMutation(c);\
|
||||
}\
|
||||
var = gs_##c##_enumState.itemsPtr[gs_##c##counter++];\
|
||||
|
||||
#define END_FOR_IN(c) \
|
||||
} while (gs_##c##counter < gs_##c##_limit);\
|
||||
} while (gs_##c##_limit = [c countByEnumeratingWithState: &gs_##c##_enumState\
|
||||
objects: gs_##c##_items\
|
||||
count: 16]);\
|
||||
}\
|
||||
} while(0);
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue