]> gitweb.factorcode.org Git - factor.git/blob - basis/alien/structs/fields/fields.factor
Solution to Project Euler problem 65
[factor.git] / basis / alien / structs / fields / fields.factor
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
6
7 TUPLE: field-spec name offset type reader writer ;
8
9 : reader-word ( class name vocab -- word )
10     [ "-" glue ] dip create dup make-deprecated ;
11
12 : writer-word ( class name vocab -- word )
13     [ [ swap "set-" % % "-" % % ] "" make ] dip create dup make-deprecated ;
14
15 : <field-spec> ( struct-name vocab type field-name -- spec )
16     field-spec new
17         0 >>offset
18         swap >>name
19         swap >>type
20         3dup name>> swap reader-word >>reader
21         3dup name>> swap writer-word >>writer
22     2nip ;
23
24 : align-offset ( offset type -- offset )
25     c-type-align align ;
26
27 : struct-offsets ( specs -- size )
28     0 [
29         [ type>> align-offset ] keep
30         [ (>>offset) ] [ type>> heap-size + ] 2bi
31     ] reduce ;
32
33 : define-struct-slot-word ( word quot spec effect -- )
34     [ offset>> prefix ] dip define-inline ;
35
36 : define-getter ( spec -- )
37     [ reader>> ] [ type>> c-type-getter-boxer ] [ ] tri
38     (( c-ptr -- value )) define-struct-slot-word ;
39
40 : define-setter ( spec -- )
41     [ writer>> ] [ type>> c-setter ] [ ] tri
42     (( value c-ptr -- )) define-struct-slot-word ;
43
44 : define-field ( spec -- )
45     [ define-getter ] [ define-setter ] bi ;