#ifdef __clang__ #define FOR_IN(type, var, collection) \ for (type var in collection)\ { #define END_FOR_IN(collection) } #else void objc_enumerationMutation(id); #define FOR_IN(type, var, c) \ do\ {\ type var;\ 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