data-map general-purpose binary mapping combinator
parent
99c0bcc683
commit
a67961736b
|
@ -0,0 +1 @@
|
||||||
|
Joe Groff
|
|
@ -0,0 +1,54 @@
|
||||||
|
! (c)Joe Groff bsd license
|
||||||
|
USING: alien.data.map generalizations kernel math.vectors
|
||||||
|
math.vectors.conversion math.vectors.simd
|
||||||
|
specialized-arrays tools.test ;
|
||||||
|
FROM: alien.c-types => uchar short int float ;
|
||||||
|
SIMDS: float int short uchar ;
|
||||||
|
SPECIALIZED-ARRAYS: int float float-4 uchar-16 ;
|
||||||
|
IN: alien.data.map.tests
|
||||||
|
|
||||||
|
[ float-array{ 1.0 1.0 3.0 3.0 5.0 5.0 } ]
|
||||||
|
[
|
||||||
|
int-array{ 1 3 5 } [ dup ] data-map( int -- float[2] )
|
||||||
|
byte-array>float-array
|
||||||
|
] unit-test
|
||||||
|
|
||||||
|
[ float-array{ 1.0 1.0 3.0 3.0 5.0 5.0 0.0 0.0 } ]
|
||||||
|
[
|
||||||
|
int-array{ 1 3 5 } float-array{ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 }
|
||||||
|
[ dup ] data-map!( int -- float[2] )
|
||||||
|
] unit-test
|
||||||
|
|
||||||
|
[
|
||||||
|
B{
|
||||||
|
127 191 255 63
|
||||||
|
255 25 51 76
|
||||||
|
76 51 229 127
|
||||||
|
25 255 255 255
|
||||||
|
}
|
||||||
|
] [
|
||||||
|
float-array{
|
||||||
|
0.5 0.75 1.0 0.25
|
||||||
|
1.0 0.1 0.2 0.3
|
||||||
|
0.3 0.2 0.9 0.5
|
||||||
|
0.1 1.0 1.5 2.0
|
||||||
|
} [
|
||||||
|
[ 255.0 v*n float-4 int-4 vconvert ] 4 napply
|
||||||
|
[ int-4 short-8 vconvert ] 2bi@
|
||||||
|
short-8 uchar-16 vconvert
|
||||||
|
] data-map( float-4[4] -- uchar-16 )
|
||||||
|
] unit-test
|
||||||
|
|
||||||
|
[
|
||||||
|
float-array{
|
||||||
|
0.5 0.75 1.0 0.25
|
||||||
|
1.0 0.1 0.2 0.3
|
||||||
|
0.3 0.2 0.9 0.5
|
||||||
|
0.1 1.0 1.5 2.0
|
||||||
|
5.0
|
||||||
|
} [
|
||||||
|
[ 255.0 v*n float-4 int-4 vconvert ] 4 napply
|
||||||
|
[ int-4 short-8 vconvert ] 2bi@
|
||||||
|
short-8 uchar-16 vconvert
|
||||||
|
] data-map( float-4[4] -- uchar-16 )
|
||||||
|
] [ bad-data-map-input-length? ] must-fail-with
|
|
@ -0,0 +1,69 @@
|
||||||
|
! (c)Joe Groff bsd license
|
||||||
|
USING: alien alien.c-types alien.data alien.parser arrays
|
||||||
|
byte-arrays fry generalizations kernel lexer locals macros math
|
||||||
|
math.ranges parser sequences sequences.private ;
|
||||||
|
IN: alien.data.map
|
||||||
|
|
||||||
|
ERROR: bad-data-map-input-length byte-length iter-size remainder ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: even-/i ( d d -- q )
|
||||||
|
2dup [ >fixnum ] bi@ /mod
|
||||||
|
[ 2nip ]
|
||||||
|
[ bad-data-map-input-length ] if-zero ; inline
|
||||||
|
|
||||||
|
:: data-map-length ( array type count -- byte-length iter-size iter-count )
|
||||||
|
array byte-length >fixnum
|
||||||
|
type heap-size count *
|
||||||
|
2dup even-/i ; inline
|
||||||
|
|
||||||
|
: <displaced-direct-array> ( byte-array displacement length type -- direct-array )
|
||||||
|
[ swap <displaced-alien> ] 2dip <c-direct-array> ; inline
|
||||||
|
|
||||||
|
:: data-map-loop ( input loop-quot out-bytes-quot in-type in-count out-type out-count -- out-bytes )
|
||||||
|
input in-type in-count data-map-length
|
||||||
|
:> iter-count :> in-size :> in-byte-length
|
||||||
|
input >c-ptr :> in-bytes
|
||||||
|
|
||||||
|
out-count out-type heap-size * :> out-size
|
||||||
|
out-size iter-count * :> out-byte-length
|
||||||
|
out-byte-length out-bytes-quot call :> out-bytes
|
||||||
|
|
||||||
|
0 in-byte-length 1 - >fixnum in-size >fixnum <range>
|
||||||
|
0 out-byte-length 1 - >fixnum out-size >fixnum <range>
|
||||||
|
[| in-base out-base |
|
||||||
|
in-bytes in-base in-count in-type <displaced-direct-array>
|
||||||
|
in-count firstn-unsafe
|
||||||
|
loop-quot call
|
||||||
|
out-bytes out-base out-count out-type <displaced-direct-array>
|
||||||
|
out-count set-firstn-unsafe
|
||||||
|
] 2each
|
||||||
|
out-bytes ; inline
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
MACRO: data-map ( in-type in-count out-type out-count -- )
|
||||||
|
'[ [ (byte-array) ] _ _ _ _ data-map-loop ] ;
|
||||||
|
|
||||||
|
MACRO: data-map! ( in-type in-count out-type out-count -- )
|
||||||
|
'[ swap [ [ nip >c-ptr ] curry _ _ _ _ data-map-loop drop ] keep ] ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: c-type-parsed ( accum c-type -- accum )
|
||||||
|
dup array? [ unclip swap product ] [ 1 ] if
|
||||||
|
[ parsed ] bi@ ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
SYNTAX: data-map(
|
||||||
|
scan-c-type c-type-parsed
|
||||||
|
"--" expect scan-c-type c-type-parsed ")" expect
|
||||||
|
\ data-map parsed ;
|
||||||
|
|
||||||
|
SYNTAX: data-map!(
|
||||||
|
scan-c-type c-type-parsed
|
||||||
|
"--" expect scan-c-type c-type-parsed ")" expect
|
||||||
|
\ data-map! parsed ;
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Combinators for mapping over packed binary data
|
Loading…
Reference in New Issue