factor/library/vectors.factor

85 lines
2.2 KiB
Factor
Raw Normal View History

! Copyright (C) 2004, 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
2005-04-02 02:39:33 -05:00
USING: errors generic kernel kernel-internals lists math
math-internals sequences ;
2004-12-24 02:52:02 -05:00
IN: kernel-internals
2005-04-06 21:41:49 -04:00
DEFER: set-vector-length
DEFER: vector-array
DEFER: set-vector-array
: assert-positive ( fx -- )
0 fixnum<
[ "Vector index must be positive" throw ] when ; inline
2005-04-06 21:41:49 -04:00
: assert-bounds ( fx seq -- )
over assert-positive
2005-04-06 21:41:49 -04:00
length fixnum>=
[ "Vector index out of bounds" throw ] when ; inline
2004-12-24 02:52:02 -05:00
2005-04-06 21:41:49 -04:00
IN: vectors
BUILTIN: vector 11
[ 1 length set-vector-length ]
[ 2 vector-array set-vector-array ] ;
: empty-vector ( len -- vec )
#! Creates a vector with 'len' elements set to f. Unlike
#! <vector>, which gives an empty vector with a certain
#! capacity.
dup <vector> [ set-length ] keep ;
IN: kernel-internals
: grow-capacity ( len vec -- )
#! If the vector cannot accomodate len elements, resize it
#! to exactly len.
[ vector-array grow-array ] keep set-vector-array ;
2004-12-24 02:52:02 -05:00
: ensure-capacity ( n vec -- )
#! If n is beyond the vector's length, increase the length,
#! growing the array if necessary, with an optimistic
#! doubling of its size.
2005-04-06 21:41:49 -04:00
2dup length fixnum>= [
>r 1 fixnum+ r>
2005-04-02 02:52:27 -05:00
2dup vector-array length fixnum> [
over 2 fixnum* over grow-capacity
] when
2005-04-06 21:41:49 -04:00
set-vector-length
] [
2drop
] ifte ;
2004-12-24 02:52:02 -05:00
2005-04-06 21:41:49 -04:00
M: vector hashcode ( vec -- n )
dup length 0 number= [
drop 0
] [
0 swap nth hashcode
] ifte ;
2005-01-28 23:55:22 -05:00
2005-04-06 21:41:49 -04:00
M: vector set-length ( len vec -- )
>r >fixnum dup assert-positive r>
2dup grow-capacity set-vector-length ;
2004-07-16 02:26:21 -04:00
2005-04-06 21:41:49 -04:00
M: vector nth ( n vec -- obj )
>r >fixnum r> 2dup assert-bounds vector-array array-nth ;
2005-04-06 21:41:49 -04:00
M: vector set-nth ( obj n vec -- )
>r >fixnum dup assert-positive r>
2dup ensure-capacity vector-array
set-array-nth ;
2004-12-24 02:52:02 -05:00
2005-04-06 21:41:49 -04:00
: copy-array ( to from n -- )
[ 3dup swap array-nth pick rot set-array-nth ] repeat 2drop ;
2005-01-28 23:55:22 -05:00
M: vector clone ( vector -- vector )
2005-04-06 21:41:49 -04:00
dup length dup empty-vector [
2005-01-28 23:55:22 -05:00
vector-array rot vector-array rot copy-array
] keep ;
2004-11-25 21:51:47 -05:00
2005-04-06 21:41:49 -04:00
IN: vectors
2005-04-06 21:41:49 -04:00
: vector-length ( deprecated ) length ;
: vector-nth ( deprecated ) nth ;
: set-vector-nth ( deprecated ) set-nth ;