1 ! Copyright (C) 2005, 2007 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 ! Some low-level code used by vectors and string buffers.
5 USING: kernel kernel.private math math.private
6 sequences sequences.private ;
10 GENERIC: underlying ( seq -- underlying )
11 GENERIC: set-underlying ( underlying seq -- )
12 GENERIC: set-fill ( n seq -- )
14 M: growable nth-unsafe underlying nth-unsafe ;
16 M: growable set-nth-unsafe underlying set-nth-unsafe ;
18 : capacity ( seq -- n ) underlying length ; inline
20 : expand ( len seq -- )
21 [ underlying resize ] keep set-underlying ; inline
23 : contract ( len seq -- )
25 [ 0 -rot set-nth-unsafe ] curry
26 (each-integer) ; inline
28 : growable-check ( n seq -- n seq )
29 over 0 < [ bounds-error ] when ; inline
31 M: growable set-length ( n seq -- )
36 2dup capacity > [ 2dup expand ] when
38 >r >fixnum r> set-fill ;
40 : new-size ( old -- new ) 1+ 3 * ; inline
42 : ensure ( n seq -- n seq )
45 2dup capacity >= [ over new-size over expand ] when
47 2dup >r 1 fixnum+fast r> set-fill
52 M: growable set-nth ensure set-nth-unsafe ;
54 M: growable clone ( seq -- newseq )
55 (clone) dup underlying clone over set-underlying ;
57 M: growable lengthen ( n seq -- )
59 2dup capacity > [ over new-size over expand ] when
60 2dup >r >fixnum r> set-fill
63 INSTANCE: growable sequence