31 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			31 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Factor
		
	
	
|  | USING: kernel cocoa cocoa.types alien.c-types locals math sequences | ||
|  | vectors fry libc ;
 | ||
|  | IN: cocoa.enumeration | ||
|  | 
 | ||
|  | : NS-EACH-BUFFER-SIZE 16 ; inline
 | ||
|  | 
 | ||
|  | : (with-enumeration-buffers) ( quot -- )
 | ||
|  |     "NSFastEnumerationState" heap-size swap '[ | ||
|  |         NS-EACH-BUFFER-SIZE "id" heap-size * [ | ||
|  |             NS-EACH-BUFFER-SIZE @ | ||
|  |         ] with-malloc | ||
|  |     ] with-malloc ; inline
 | ||
|  | 
 | ||
|  | :: (NSFastEnumeration-each) ( object quot: ( elt -- ) state stackbuf count -- )
 | ||
|  |     object state stackbuf count -> countByEnumeratingWithState:objects:count: | ||
|  |     dup zero? [ drop ] [ | ||
|  |         state NSFastEnumerationState-itemsPtr [ stackbuf ] unless*
 | ||
|  |         '[ , void*-nth quot call ] each
 | ||
|  |         object quot state stackbuf count (NSFastEnumeration-each) | ||
|  |     ] if ; inline recursive
 | ||
|  | 
 | ||
|  | : NSFastEnumeration-each ( object quot -- )
 | ||
|  |     [ (NSFastEnumeration-each) ] (with-enumeration-buffers) ; inline
 | ||
|  | 
 | ||
|  | : NSFastEnumeration-map ( object quot -- vector )
 | ||
|  |     NS-EACH-BUFFER-SIZE <vector>
 | ||
|  |     [ '[ @ , push ] NSFastEnumeration-each ] keep ; inline
 | ||
|  | 
 | ||
|  | : NSFastEnumeration>vector ( object -- vector )
 | ||
|  |     [ ] NSFastEnumeration-map ;
 |