1 ! (c)Joe Groff bsd license
2 USING: accessors alien alien.c-types alien.data alien.parser arrays
3 byte-arrays combinators effects.parser fry generalizations kernel
4 lexer locals macros make math math.ranges parser sequences sequences.private ;
7 ERROR: bad-data-map-input-length byte-length iter-size remainder ;
11 : <displaced-direct-array> ( displacement bytes length type -- direct-array )
12 [ <displaced-alien> ] 2dip <c-direct-array> ; inline
16 { count fixnum read-only }
18 { bytes c-ptr read-only }
19 { byte-length fixnum read-only }
20 { iter-length fixnum read-only }
21 { iter-count fixnum read-only } ;
23 ERROR: bad-data-map-param param remainder ;
25 M: data-map-param length
28 M: data-map-param nth-unsafe
30 [ iter-length>> * >fixnum ]
34 } cleave <displaced-direct-array> ; inline
36 INSTANCE: data-map-param immutable-sequence
38 : c-type-count ( in/out -- c-type count iter-length )
39 dup array? [ unclip swap product >fixnum ] [ 1 ] if
40 2dup swap heap-size * >fixnum ; inline
42 MACRO: >param ( in -- quot: ( array -- param ) )
53 MACRO: alloc-param ( out -- quot: ( len -- param ) )
57 _ * >fixnum [ (byte-array) dup ] keep
63 MACRO: unpack-params ( ins -- )
64 [ c-type-count drop nip '[ _ firstn-unsafe ] ] map '[ _ spread ] ;
66 MACRO: pack-params ( outs -- )
67 [ ] [ c-type-count drop nip dup [ [ ndip _ ] dip set-firstn ] 3curry ] reduce
68 fry [ call ] compose ;
70 :: [data-map] ( ins outs param-quot -- quot )
73 #ins #outs + :> #params
79 [ ins , \ unpack-params , \ @ , ] [ ] make ,
80 #outs , \ ndip , outs , \ pack-params ,
83 ] [ ] make , #outs , \ nkeep ,
84 [ orig>> ] , #outs , \ napply ,
85 ] [ ] make fry \ call suffix ;
87 MACRO: data-map ( ins outs -- )
90 [ [ '[ _ >param ] ] map '[ _ spread ] ]
91 [ length dup '[ _ ndup _ nmin-length ] compose ] bi
93 [ [ '[ _ alloc-param ] ] map '[ _ cleave ] ] bi* compose
96 MACRO: data-map! ( ins outs -- )
97 2dup append [ '[ _ >param ] ] map '[ _ spread ] [data-map] ;
99 : parse-data-map-effect ( accum -- accum )
101 [ in>> [ parse-c-type ] map parsed ]
102 [ out>> [ parse-c-type ] map parsed ] bi ;
107 parse-data-map-effect \ data-map parsed ;
110 parse-data-map-effect \ data-map! parsed ;