alien.enums: make enum>number foldable so it optimizes constant enums to constant ints, make number>enum a macro so it doesn't use c-type metadata at runtime
parent
fdeb305a3c
commit
f9668be814
|
@ -1,6 +1,6 @@
|
|||
! (c)2010 Joe Groff, Erik Charlebois bsd license
|
||||
USING: accessors alien.c-types arrays classes.singleton combinators
|
||||
delegate fry generic.parser kernel math parser sequences words ;
|
||||
delegate fry generic.parser kernel macros math parser sequences words ;
|
||||
IN: alien.enums
|
||||
|
||||
<PRIVATE
|
||||
|
@ -10,18 +10,18 @@ CONSULT: c-type-protocol enum-c-type
|
|||
base-type>> ;
|
||||
PRIVATE>
|
||||
|
||||
GENERIC: enum>number ( enum -- number )
|
||||
GENERIC: enum>number ( enum -- number ) foldable
|
||||
M: integer enum>number ;
|
||||
|
||||
: number>enum ( number enum-c-type -- enum )
|
||||
c-type-boxer-quot call( x -- y ) ; inline
|
||||
|
||||
<PRIVATE
|
||||
: enum-boxer ( members -- quot )
|
||||
[ first2 swap '[ _ ] 2array ]
|
||||
{ } map-as [ ] suffix '[ _ case ] ;
|
||||
PRIVATE>
|
||||
|
||||
MACRO: number>enum ( enum-c-type -- )
|
||||
c-type members>> enum-boxer ;
|
||||
|
||||
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 drop [ enum>number ] ;
|
||||
|
@ -42,7 +42,7 @@ M: enum-c-type c-type-setter
|
|||
|
||||
: define-enum-constructor ( word -- )
|
||||
[ name>> "<" ">" surround create-in ] keep
|
||||
[ number>enum ] curry (( enum -- number )) define-inline ;
|
||||
[ number>enum ] curry (( number -- enum )) define-inline ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
|
|
Loading…
Reference in New Issue