2010-04-19 18:53:59 -04:00
|
|
|
! (c)2010 Joe Groff, Erik Charlebois bsd license
|
2014-06-30 12:09:46 -04:00
|
|
|
USING: accessors alien.c-types arrays assocs classes.singleton
|
|
|
|
combinators delegate fry kernel macros math parser sequences
|
|
|
|
words ;
|
2010-04-13 02:58:58 -04:00
|
|
|
IN: alien.enums
|
|
|
|
|
2010-04-19 18:53:59 -04:00
|
|
|
<PRIVATE
|
2010-04-13 02:58:58 -04:00
|
|
|
TUPLE: enum-c-type base-type members ;
|
2010-04-19 18:53:59 -04:00
|
|
|
C: <enum-c-type> enum-c-type
|
2010-04-13 02:58:58 -04:00
|
|
|
CONSULT: c-type-protocol enum-c-type
|
|
|
|
base-type>> ;
|
2010-04-13 03:13:18 -04:00
|
|
|
PRIVATE>
|
2010-04-13 02:58:58 -04:00
|
|
|
|
2010-04-20 20:05:14 -04:00
|
|
|
GENERIC: enum>number ( enum -- number ) foldable
|
2010-04-19 18:53:59 -04:00
|
|
|
M: integer enum>number ;
|
2010-10-17 21:02:42 -04:00
|
|
|
M: word enum>number "enum-value" word-prop ;
|
2010-04-13 02:58:58 -04:00
|
|
|
|
2010-04-19 18:53:59 -04:00
|
|
|
<PRIVATE
|
2010-04-13 02:58:58 -04:00
|
|
|
: enum-boxer ( members -- quot )
|
2010-04-19 18:53:59 -04:00
|
|
|
[ first2 swap '[ _ ] 2array ]
|
|
|
|
{ } map-as [ ] suffix '[ _ case ] ;
|
|
|
|
PRIVATE>
|
2010-04-13 02:58:58 -04:00
|
|
|
|
2015-07-19 01:16:11 -04:00
|
|
|
MACRO: number>enum ( enum-c-type -- quot )
|
2011-10-24 17:31:10 -04:00
|
|
|
lookup-c-type members>> enum-boxer ;
|
2010-04-20 20:05:14 -04:00
|
|
|
|
2010-04-13 02:58:58 -04:00
|
|
|
M: enum-c-type c-type-boxed-class drop object ;
|
|
|
|
M: enum-c-type c-type-boxer-quot members>> enum-boxer ;
|
2010-04-19 18:53:59 -04:00
|
|
|
M: enum-c-type c-type-unboxer-quot drop [ enum>number ] ;
|
2010-04-13 02:58:58 -04:00
|
|
|
M: enum-c-type c-type-setter
|
2010-04-19 18:53:59 -04:00
|
|
|
[ enum>number ] swap base-type>> c-type-setter '[ _ 2dip @ ] ;
|
2010-04-18 16:34:18 -04:00
|
|
|
|
2010-04-22 01:22:06 -04:00
|
|
|
: define-enum-value ( class value -- )
|
2011-08-27 16:48:30 -04:00
|
|
|
enum>number "enum-value" set-word-prop ;
|
|
|
|
|
|
|
|
<PRIVATE
|
2010-04-19 18:53:59 -04:00
|
|
|
|
2010-09-28 14:06:59 -04:00
|
|
|
: define-enum-members ( members -- )
|
2011-08-27 16:48:30 -04:00
|
|
|
[ first define-singleton-class ] each ;
|
2010-04-19 18:53:59 -04:00
|
|
|
|
|
|
|
: define-enum-constructor ( word -- )
|
2015-06-08 15:38:38 -04:00
|
|
|
[ name>> "<" ">" surround create-word-in ] keep
|
2011-10-18 16:18:42 -04:00
|
|
|
[ number>enum ] curry ( number -- enum ) define-inline ;
|
2010-04-13 02:58:58 -04:00
|
|
|
|
|
|
|
PRIVATE>
|
|
|
|
|
2011-08-27 16:48:30 -04:00
|
|
|
: (define-enum) ( word base-type members -- )
|
2010-04-19 18:53:59 -04:00
|
|
|
[ dup define-enum-constructor ] 2dip
|
2010-09-28 14:06:59 -04:00
|
|
|
[ define-enum-members ]
|
|
|
|
[ <enum-c-type> swap typedef ] bi ;
|
2011-08-27 16:48:30 -04:00
|
|
|
|
|
|
|
: define-enum ( word base-type members -- )
|
|
|
|
[ (define-enum) ]
|
|
|
|
[ [ define-enum-value ] assoc-each ] bi ;
|
2014-06-30 12:09:46 -04:00
|
|
|
|
2010-04-13 03:13:18 -04:00
|
|
|
PREDICATE: enum-c-type-word < c-type-word
|
|
|
|
"c-type" word-prop enum-c-type? ;
|