1 ! Copyright (C) 2005, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays kernel kernel.private math namespaces
4 make sequences strings words effects combinators alien.c-types ;
5 IN: alien.structs.fields
7 TUPLE: field-spec name offset type reader writer ;
9 : reader-word ( class name vocab -- word )
10 [ "-" glue ] dip create dup make-deprecated ;
12 : writer-word ( class name vocab -- word )
13 [ [ swap "set-" % % "-" % % ] "" make ] dip create dup make-deprecated ;
15 : <field-spec> ( struct-name vocab type field-name -- spec )
20 3dup name>> swap reader-word >>reader
21 3dup name>> swap writer-word >>writer
24 : align-offset ( offset type -- offset )
27 : struct-offsets ( specs -- size )
29 [ type>> align-offset ] keep
30 [ (>>offset) ] [ type>> heap-size + ] 2bi
33 : define-struct-slot-word ( word quot spec effect -- )
34 [ offset>> prefix ] dip define-inline ;
36 : define-getter ( spec -- )
37 [ reader>> ] [ type>> c-type-getter-boxer ] [ ] tri
38 (( c-ptr -- value )) define-struct-slot-word ;
40 : define-setter ( spec -- )
41 [ writer>> ] [ type>> c-setter ] [ ] tri
42 (( value c-ptr -- )) define-struct-slot-word ;
44 : define-field ( spec -- )
45 [ define-getter ] [ define-setter ] bi ;