]> gitweb.factorcode.org Git - factor.git/blob - basis/specialized-arrays/direct/functor/functor.factor
windows.com: split off prettyprinting into windows.com.prettyprint
[factor.git] / basis / specialized-arrays / direct / functor / functor.factor
1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: functors sequences sequences.private kernel words classes
4 math alien alien.c-types byte-arrays accessors
5 specialized-arrays parser
6 prettyprint.backend prettyprint.custom prettyprint.sections ;
7 IN: specialized-arrays.direct.functor
8
9 <PRIVATE
10
11 : pprint-direct-array ( direct-array tag -- )
12     [ [ underlying>> ] [ length>> ] bi [ pprint* ] bi@ ] pprint-prefix ;
13
14 PRIVATE>
15
16 FUNCTOR: define-direct-array ( T -- )
17
18 A'      IS ${T}-array
19 S       IS ${T}-sequence
20 >A'     IS >${T}-array
21 <A'>    IS <${A'}>
22 A'{     IS ${A'}{
23
24 A       DEFINES-CLASS direct-${T}-array
25 <A>     DEFINES <${A}>
26 A'@      DEFINES ${A'}@
27
28 NTH     [ T dup c-type-getter-boxer array-accessor ]
29 SET-NTH [ T dup c-setter array-accessor ]
30
31 WHERE
32
33 TUPLE: A
34 { underlying c-ptr read-only }
35 { length fixnum read-only } ;
36
37 : <A> ( alien len -- direct-array ) A boa ; inline
38 M: A length length>> ; inline
39 M: A nth-unsafe underlying>> NTH call ; inline
40 M: A set-nth-unsafe underlying>> SET-NTH call ; inline
41 M: A like drop dup A instance? [ >A' ] unless ; inline
42 M: A new-sequence drop <A'> ; inline
43
44 M: A byte-length length>> T heap-size * ; inline
45
46 SYNTAX: A'@ 
47     scan-object scan-object <A> parsed ;
48
49 M: A pprint-delims drop \ A'{ \ } ;
50
51 M: A >pprint-sequence ;
52
53 M: A pprint*
54     [ pprint-object ]
55     [ \ A'@ pprint-direct-array ]
56     pprint-c-object ;
57
58 INSTANCE: A sequence
59 INSTANCE: A S
60
61 T c-type
62     \ A >>direct-array-class
63     \ <A> >>direct-array-constructor
64     drop
65
66 ;FUNCTOR