]> gitweb.factorcode.org Git - factor.git/blob - basis/alien/enums/enums.factor
add alien.enums vocab with enum-c-types that convert between symbols and integer...
[factor.git] / basis / alien / enums / enums.factor
1 ! (c)2010 Joe Groff bsd license
2 USING: accessors alien.c-types arrays combinators delegate fry
3 kernel quotations sequences words.symbol ;
4 IN: alien.enums
5
6 TUPLE: enum-c-type base-type members ;
7
8 CONSULT: c-type-protocol enum-c-type
9     base-type>> ;
10
11 : map-to-case ( quot: ( x -- y ) -- case )
12     { } map-as [ ] suffix ; inline
13
14 : enum-unboxer ( members -- quot )
15     [ first2 '[ _ ] 2array ] map-to-case '[ _ case ] ;
16
17 : enum-boxer ( members -- quot )
18     [ first2 swap '[ _ ] 2array ] map-to-case '[ _ case ] ;
19
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
25     '[ _ 2dip @ ] ;
26
27 C: <enum-c-type> enum-c-type
28
29 <PRIVATE
30
31 : define-enum-members ( member-names -- )
32     [ first define-symbol ] each ;
33
34 PRIVATE>
35
36 : define-enum ( word base-type members -- )
37     [ define-enum-members ] [ <enum-c-type> swap typedef ] bi ;
38