]> gitweb.factorcode.org Git - factor.git/commitdiff
alien.enums: make enum>number foldable so it optimizes constant enums to constant...
authorJoe Groff <arcata@gmail.com>
Wed, 21 Apr 2010 00:05:14 +0000 (17:05 -0700)
committerJoe Groff <arcata@gmail.com>
Wed, 21 Apr 2010 00:05:14 +0000 (17:05 -0700)
basis/alien/enums/enums.factor

index 6920a7742d38002059b22b6afefef85599ba76f8..d8c1a02c69b5cfc9a155911b411f895ba5151c13 100644 (file)
@@ -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>