! Copyright (C) 2008 Joe Groff. ! See http://factorcode.org/license.txt for BSD license. USING: kernel cocoa cocoa.types alien.c-types locals math sequences vectors fry libc destructors specialized-arrays.direct.alien ; IN: cocoa.enumeration : NS-EACH-BUFFER-SIZE 16 ; inline : with-enumeration-buffers ( quot -- ) [ [ "NSFastEnumerationState" malloc-object &free NS-EACH-BUFFER-SIZE "id" heap-size * malloc-object &free NS-EACH-BUFFER-SIZE ] dip call ] with-destructors ; inline :: (NSFastEnumeration-each) ( object quot: ( elt -- ) state stackbuf count -- ) object state stackbuf count -> countByEnumeratingWithState:objects:count: dup 0 = [ drop ] [ state NSFastEnumerationState-itemsPtr [ stackbuf ] unless* swap quot 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 [ '[ @ _ push ] NSFastEnumeration-each ] keep ; inline : NSFastEnumeration>vector ( object -- vector ) [ ] NSFastEnumeration-map ;