add alien.enums vocab with enum-c-types that convert between symbols and integer values in the FFI. update ENUM: to define symbolic enums, and take an optional base type
parent
e730d3b6d5
commit
d3f770d545
|
@ -0,0 +1,38 @@
|
|||
! (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 ;
|
||||
|
|
@ -78,31 +78,31 @@ M: pointer return-type-name to>> return-type-name CHAR: * suffix ;
|
|||
: next-enum-member ( members name value -- members value' )
|
||||
[ 2array suffix! ] [ 1 + ] bi ;
|
||||
|
||||
: parse-enum-name ( -- name )
|
||||
scan dup "f" =
|
||||
[ drop f ]
|
||||
[ (CREATE-C-TYPE) dup save-location ] if ;
|
||||
|
||||
: parse-enum-base-type ( -- base-type token )
|
||||
scan dup "<" =
|
||||
[ drop scan-object scan ]
|
||||
[ [ int ] dip ] if ;
|
||||
|
||||
: parse-enum-member ( members name value -- members value' )
|
||||
over "{" =
|
||||
[ 2drop scan scan-object next-enum-member "}" expect ]
|
||||
[ next-enum-member ] if ;
|
||||
[ 2drop scan create-in scan-object next-enum-member "}" expect ]
|
||||
[ [ create-in ] dip next-enum-member ] if ;
|
||||
|
||||
: parse-enum-members ( members counter -- members )
|
||||
scan dup ";" = not
|
||||
[ swap parse-enum-member parse-enum-members ] [ 2drop ] if ;
|
||||
|
||||
: define-enum-member ( name value -- )
|
||||
[ create-in ] [ define-constant ] bi* ;
|
||||
|
||||
: 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 ;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
! 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
|
||||
|
|
Loading…
Reference in New Issue