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' )
|
: next-enum-member ( members name value -- members value' )
|
||||||
[ 2array suffix! ] [ 1 + ] bi ;
|
[ 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' )
|
: parse-enum-member ( members name value -- members value' )
|
||||||
over "{" =
|
over "{" =
|
||||||
[ 2drop scan scan-object next-enum-member "}" expect ]
|
[ 2drop scan create-in scan-object next-enum-member "}" expect ]
|
||||||
[ next-enum-member ] if ;
|
[ [ create-in ] dip next-enum-member ] if ;
|
||||||
|
|
||||||
: parse-enum-members ( members counter -- members )
|
: parse-enum-members ( members counter token -- members )
|
||||||
scan dup ";" = not
|
dup ";" = not
|
||||||
[ swap parse-enum-member parse-enum-members ] [ 2drop ] if ;
|
[ swap parse-enum-member scan parse-enum-members ] [ 2drop ] if ;
|
||||||
|
|
||||||
: define-enum-member ( name value -- )
|
|
||||||
[ create-in ] [ define-constant ] bi* ;
|
|
||||||
|
|
||||||
: define-enum-members ( members -- )
|
|
||||||
[ first2 define-enum-member ] each ;
|
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: parse-enum ( -- name members )
|
: parse-enum ( -- name base-type members )
|
||||||
scan dup "f" =
|
parse-enum-name
|
||||||
[ drop f ]
|
parse-enum-base-type
|
||||||
[ (CREATE-C-TYPE) dup save-location ] if
|
[ V{ } clone 0 ] dip parse-enum-members ;
|
||||||
V{ } clone 0 parse-enum-members ;
|
|
||||||
|
|
||||||
: define-enum ( word members -- )
|
|
||||||
[ [ int swap typedef ] when* ] [ define-enum-members ] bi* ;
|
|
||||||
|
|
||||||
: scan-function-name ( -- return function )
|
: scan-function-name ( -- return function )
|
||||||
scan-c-type scan parse-pointers ;
|
scan-c-type scan parse-pointers ;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
! Copyright (C) 2005, 2010 Slava Pestov, Alex Chapman.
|
! Copyright (C) 2005, 2010 Slava Pestov, Alex Chapman.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! 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
|
alien.strings kernel math namespaces parser sequences words
|
||||||
quotations math.parser splitting grouping effects assocs
|
quotations math.parser splitting grouping effects assocs
|
||||||
combinators lexer strings.parser alien.parser fry vocabs.parser
|
combinators lexer strings.parser alien.parser fry vocabs.parser
|
||||||
|
|
Loading…
Reference in New Issue