1 ! (c)2010 Joe Groff bsd license
2 USING: accessors alien.c-types arrays combinators delegate fry
3 kernel quotations sequences words.symbol ;
6 TUPLE: enum-c-type base-type members ;
8 CONSULT: c-type-protocol enum-c-type
11 : map-to-case ( quot: ( x -- y ) -- case )
12 { } map-as [ ] suffix ; inline
14 : enum-unboxer ( members -- quot )
15 [ first2 '[ _ ] 2array ] map-to-case '[ _ case ] ;
17 : enum-boxer ( members -- quot )
18 [ first2 swap '[ _ ] 2array ] map-to-case '[ _ case ] ;
20 M: enum-c-type c-type-boxed-class drop object ;
21 M: enum-c-type c-type-boxer-quot members>> enum-boxer ;
22 M: enum-c-type c-type-unboxer-quot members>> enum-unboxer ;
23 M: enum-c-type c-type-setter
24 [ members>> enum-unboxer ] [ base-type>> c-type-setter ] bi
27 C: <enum-c-type> enum-c-type
31 : define-enum-members ( member-names -- )
32 [ first define-symbol ] each ;
36 : define-enum ( word base-type members -- )
37 [ define-enum-members ] [ <enum-c-type> swap typedef ] bi ;