factor/basis/math/bitfields/bitfields.factor

38 lines
1.0 KiB
Factor
Raw Normal View History

2008-02-02 07:58:28 -05:00
! Copyright (C) 2007, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
2008-07-18 20:22:59 -04:00
USING: arrays kernel math sequences words
2008-08-12 04:31:48 -04:00
namespaces stack-checker.transforms ;
2007-09-20 18:09:08 -04:00
IN: math.bitfields
2008-06-09 06:22:21 -04:00
GENERIC: (bitfield) ( value accum shift -- newaccum )
2007-09-20 18:09:08 -04:00
M: integer (bitfield) ( value accum shift -- newaccum )
swapd shift bitor ;
M: pair (bitfield) ( value accum pair -- newaccum )
first2 >r dup word? [ swapd execute ] when r> shift bitor ;
: bitfield ( values... bitspec -- n )
0 [ (bitfield) ] reduce ;
2008-02-02 07:58:28 -05:00
: flags ( values -- n )
2008-02-02 08:05:15 -05:00
0 [ dup word? [ execute ] when bitor ] reduce ;
2008-07-18 20:22:59 -04:00
GENERIC: (bitfield-quot) ( spec -- quot )
M: integer (bitfield-quot) ( spec -- quot )
[ swapd shift bitor ] curry ;
M: pair (bitfield-quot) ( spec -- quot )
first2 over word? [ >r swapd execute r> ] [ ] ?
[ shift bitor ] append 2curry ;
: bitfield-quot ( spec -- quot )
[ (bitfield-quot) ] map [ 0 ] prefix concat ;
\ bitfield [ bitfield-quot ] 1 define-transform
\ flags [
[ 0 , [ , \ bitor , ] each ] [ ] make
] 1 define-transform