--- /dev/null
+! (c)2010 Joe Groff bsd license
+USING: accessors alien.c-types arrays combinators delegate fry
+kernel quotations sequences words.symbol ;
+IN: alien.enums
+
+TUPLE: enum-c-type base-type members ;
+
+CONSULT: c-type-protocol enum-c-type
+ base-type>> ;
+
+: map-to-case ( quot: ( x -- y ) -- case )
+ { } map-as [ ] suffix ; inline
+
+: enum-unboxer ( members -- quot )
+ [ first2 '[ _ ] 2array ] map-to-case '[ _ case ] ;
+
+: enum-boxer ( members -- quot )
+ [ first2 swap '[ _ ] 2array ] map-to-case '[ _ case ] ;
+
+M: enum-c-type c-type-boxed-class drop object ;
+M: enum-c-type c-type-boxer-quot members>> enum-boxer ;
+M: enum-c-type c-type-unboxer-quot members>> enum-unboxer ;
+M: enum-c-type c-type-setter
+ [ members>> enum-unboxer ] [ base-type>> c-type-setter ] bi
+ '[ _ 2dip @ ] ;
+
+C: <enum-c-type> enum-c-type
+
+<PRIVATE
+
+: define-enum-members ( member-names -- )
+ [ first define-symbol ] each ;
+
+PRIVATE>
+
+: define-enum ( word base-type members -- )
+ [ define-enum-members ] [ <enum-c-type> swap typedef ] bi ;
+
: next-enum-member ( members name value -- members value' )
[ 2array suffix! ] [ 1 + ] bi ;
-: parse-enum-member ( members name value -- members value' )
- over "{" =
- [ 2drop scan scan-object next-enum-member "}" expect ]
- [ next-enum-member ] if ;
+: parse-enum-name ( -- name )
+ scan dup "f" =
+ [ drop f ]
+ [ (CREATE-C-TYPE) dup save-location ] if ;
-: parse-enum-members ( members counter -- members )
- scan dup ";" = not
- [ swap parse-enum-member parse-enum-members ] [ 2drop ] if ;
+: parse-enum-base-type ( -- base-type token )
+ scan dup "<" =
+ [ drop scan-object scan ]
+ [ [ int ] dip ] if ;
-: define-enum-member ( name value -- )
- [ create-in ] [ define-constant ] bi* ;
+: parse-enum-member ( members name value -- members value' )
+ over "{" =
+ [ 2drop scan create-in scan-object next-enum-member "}" expect ]
+ [ [ create-in ] dip next-enum-member ] if ;
-: define-enum-members ( members -- )
- [ first2 define-enum-member ] each ;
+: parse-enum-members ( members counter token -- members )
+ dup ";" = not
+ [ swap parse-enum-member scan parse-enum-members ] [ 2drop ] if ;
PRIVATE>
-: parse-enum ( -- name members )
- scan dup "f" =
- [ drop f ]
- [ (CREATE-C-TYPE) dup save-location ] if
- V{ } clone 0 parse-enum-members ;
-
-: define-enum ( word members -- )
- [ [ int swap typedef ] when* ] [ define-enum-members ] bi* ;
+: parse-enum ( -- name base-type members )
+ parse-enum-name
+ parse-enum-base-type
+ [ V{ } clone 0 ] dip parse-enum-members ;
: scan-function-name ( -- return function )
scan-c-type scan parse-pointers ;
! Copyright (C) 2005, 2010 Slava Pestov, Alex Chapman.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays alien alien.c-types alien.arrays
+USING: accessors arrays alien alien.c-types alien.enums alien.arrays
alien.strings kernel math namespaces parser sequences words
quotations math.parser splitting grouping effects assocs
combinators lexer strings.parser alien.parser fry vocabs.parser