1 ! Copyright (C) 2005 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 ! Some low-level code used by vectors and string buffers.
5 IN: sequences-internals
6 USING: errors kernel kernel-internals math math-internals
9 GENERIC: underlying ( seq -- underlying )
10 GENERIC: set-underlying ( underlying seq -- )
11 GENERIC: set-fill ( n seq -- )
13 : capacity ( seq -- n ) underlying length ; inline
15 : expand ( len seq -- )
16 [ underlying resize ] keep set-underlying ; inline
18 : contract ( len seq -- )
20 [ swap >r + 0 swap r> set-nth-unsafe ] 3keep
23 : new-size ( old -- new ) 1+ 3 * ; inline
28 2dup capacity > [ over new-size over expand ] when
32 TUPLE: bounds-error index seq ;
34 : bounds-error ( n seq -- * ) <bounds-error> throw ;
36 : growable-check ( n seq -- n seq )
37 over 0 < [ bounds-error ] when ; inline
39 : bounds-check ( n seq -- n seq )
40 2dup bounds-check? [ bounds-error ] unless ; inline
42 : grow-length ( n seq -- )
44 2dup length < [ 2dup contract ] when
45 2dup capacity > [ 2dup expand ] when
48 : clone-resizable ( seq -- newseq )
49 (clone) dup underlying clone over set-underlying ; inline