In the latest git sources, Erik Charlebois and I have changed enum handling in
the FFI to deal directly with Factor symbols. The old C-ENUM: word has been
replaced with a new ENUM: word that creates a new C type. Symbols of this type
will automatically be converted from Factor symbols to integers and back by the
FFI. New words in the "alien.enums" vocab, enum>number and number>enum, are
also available to perform the conversion explicitly.
---
ENUM: triforce courage power wisdom ;
UNION-STRUCT: water-temple { t triforce } { i integer } ;
water-temple <struct>
wisdom >>t
i>> . ! gives 2
water-temple <struct>
1 >>i
t>> . ! gives power
---
You can also optionally control the base integer type of ENUM: types, and
specify explicit values for your enumeration symbols:
---
ENUM: foo < ushort a b c ;
ENUM: bar < longlong { x HEX: 1,0000,0000 } y z ;
---
Integers that don't map to enum values pass through the FFI retaining integer
values. Here are the incompatible changes you may need to update code for:
- Code that uses C-ENUM: only to define constants will need to be changed to
use CONSTANT:.
---
C-ENUM: f A B C ; ! old
CONSTANT: A 0 ! new
CONSTANT: B 1
CONSTANT: C 2
---
- Code that needs the integer value of an enum symbol will need to use
enum>number.
- Conversely, enum values that are destined for the FFI no longer need to be
force-evaluated with $ in literal expressions:
---
C-ENUM: foo a b c ; ! old
FUNCTION: int twib ( foo x ) ;
{ $ a $ b $ c } [ twib ] map
ENUM: foo a b c ; ! new
FUNCTION: int twib ( foo x ) ;
{ a b c } [ twib ] map
---
-Joe
------------------------------------------------------------------------------
_______________________________________________
Factor-talk mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/factor-talk