1 ! Copyright (C) 2005, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel kernel.private math math.private
4 sequences sequences.private ;
12 M: growable length length>> ; inline
13 M: growable nth-unsafe underlying>> nth-unsafe ; inline
14 M: growable set-nth-unsafe underlying>> set-nth-unsafe ; inline
16 : capacity ( seq -- n ) underlying>> length ; inline
18 : expand ( len seq -- )
19 [ resize ] change-underlying drop ; inline
21 GENERIC: contract ( len seq -- )
23 M: growable contract ( len seq -- )
25 [ [ 0 ] 2dip 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
40 : new-size ( old -- new ) 1 + 3 * ; inline
42 : ensure ( n seq -- n seq )
45 2dup capacity >= [ over new-size over expand ] when
47 over 1 fixnum+fast over length<<
52 M: growable set-nth ensure set-nth-unsafe ; inline
54 M: growable clone (clone) [ clone ] change-underlying ; inline
56 M: growable lengthen ( n seq -- )
58 2dup capacity > [ over new-size over expand ] when
62 M: growable shorten ( n seq -- )
69 M: growable new-resizable new-sequence 0 over set-length ; inline
71 INSTANCE: growable sequence