]> gitweb.factorcode.org Git - factor.git/blob - basis/alien/data/data.factor
move some allocation words that don't really have much to do with c types out of...
[factor.git] / basis / alien / data / data.factor
1 ! (c)2009 Slava Pestov, Joe Groff bsd license
2 USING: accessors alien alien.c-types alien.strings arrays
3 byte-arrays cpu.architecture fry io io.encodings.binary
4 io.files io.streams.memory kernel libc math sequences ;
5 IN: alien.data
6
7 GENERIC: require-c-array ( c-type -- )
8
9 M: array require-c-array first require-c-array ;
10
11 GENERIC: c-array-constructor ( c-type -- word )
12
13 GENERIC: c-(array)-constructor ( c-type -- word )
14
15 GENERIC: c-direct-array-constructor ( c-type -- word )
16
17 GENERIC: <c-array> ( len c-type -- array )
18
19 M: c-type-name <c-array>
20     c-array-constructor execute( len -- array ) ; inline
21
22 GENERIC: (c-array) ( len c-type -- array )
23
24 M: c-type-name (c-array)
25     c-(array)-constructor execute( len -- array ) ; inline
26
27 GENERIC: <c-direct-array> ( alien len c-type -- array )
28
29 M: c-type-name <c-direct-array>
30     c-direct-array-constructor execute( alien len -- array ) ; inline
31
32 : malloc-array ( n type -- alien )
33     [ heap-size calloc ] [ <c-direct-array> ] 2bi ; inline
34
35 : (malloc-array) ( n type -- alien )
36     [ heap-size * malloc ] [ <c-direct-array> ] 2bi ; inline
37
38 : <c-object> ( type -- array )
39     heap-size <byte-array> ; inline
40
41 : (c-object) ( type -- array )
42     heap-size (byte-array) ; inline
43
44 : malloc-object ( type -- alien )
45     1 swap heap-size calloc ; inline
46
47 : (malloc-object) ( type -- alien )
48     heap-size malloc ; inline
49
50 : malloc-byte-array ( byte-array -- alien )
51     dup byte-length [ nip malloc dup ] 2keep memcpy ;
52
53 : memory>byte-array ( alien len -- byte-array )
54     [ nip (byte-array) dup ] 2keep memcpy ;
55
56 : malloc-string ( string encoding -- alien )
57     string>alien malloc-byte-array ;
58
59 : malloc-file-contents ( path -- alien len )
60     binary file-contents [ malloc-byte-array ] [ length ] bi ;
61
62 M: memory-stream stream-read
63     [
64         [ index>> ] [ alien>> ] bi <displaced-alien>
65         swap memory>byte-array
66     ] [ [ + ] change-index drop ] 2bi ;
67
68 : byte-array>memory ( byte-array base -- )
69     swap dup byte-length memcpy ; inline
70
71 : >c-bool ( ? -- int ) 1 0 ? ; inline
72
73 : c-bool> ( int -- ? ) 0 = not ; inline
74
75 M: value-type c-type-rep drop int-rep ;
76
77 M: value-type c-type-getter
78     drop [ swap <displaced-alien> ] ;
79
80 M: value-type c-type-setter ( type -- quot )
81     [ c-type-getter ] [ c-type-unboxer-quot ] [ heap-size ] tri
82     '[ @ swap @ _ memcpy ] ;
83