]> gitweb.factorcode.org Git - factor.git/commitdiff
add alien.enums vocab with enum-c-types that convert between symbols and integer...
authorJoe Groff <arcata@gmail.com>
Tue, 13 Apr 2010 06:58:58 +0000 (23:58 -0700)
committerErik Charlebois <erikcharlebois@gmail.com>
Tue, 20 Apr 2010 03:07:18 +0000 (20:07 -0700)
basis/alien/enums/enums.factor [new file with mode: 0644]
basis/alien/parser/parser.factor
basis/alien/syntax/syntax.factor

diff --git a/basis/alien/enums/enums.factor b/basis/alien/enums/enums.factor
new file mode 100644 (file)
index 0000000..7cef343
--- /dev/null
@@ -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 ;
+
index 731cc4d6b559e8e39c30557a78989275d02f8fcf..07f0d49f2ffb4363b0c5db5ce2d8c20bf8cd0691 100755 (executable)
@@ -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-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 ;
index be137b1da8144c53285b63357e176caa67f412cd..570ebf60a52920b79340f9e3ab3c4fa692757fcd 100755 (executable)
@@ -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