generalize `flvector-copy' to support start and end indices

This commit is contained in:
Matthew Flatt 2010-09-17 13:10:22 -06:00
parent beb2175456
commit 3866c3e450
5 changed files with 43 additions and 11 deletions

View File

@ -86,7 +86,27 @@
(add1 i))
v))))))
(define (flvector-copy flv)
(for/flvector #:length (flvector-length flv)
((x (in-flvector flv)))
x))
(define (flvector-copy flv [start 0] [end (and (flvector? flv) (flvector-length flv))])
(unless (flvector? flv)
(raise-type-error 'flvector-copy "flvector" flv))
(unless (exact-nonnegative-integer? start)
(raise-type-error 'flvector-copy "non-negative exact integer" start))
(unless (exact-nonnegative-integer? end)
(raise-type-error 'flvector-copy "non-negative exact integer" end))
(let ([orig-len (flvector-length flv)])
(unless (<= start end orig-len)
(unless (<= start orig-len)
(raise-mismatch-error 'flvector-copy
(format "start index ~s out of range [~a, ~a] for flvector: "
start 0 orig-len)
flv))
(raise-mismatch-error 'flvector-copy
(format "end index ~s out of range [~a, ~a] for flvector: "
end start orig-len)
flv)))
(let* ([len (- end start)]
[vec (make-flvector len)])
(for ([i (in-range len)])
(flvector-set! vec i (flvector-ref flv (+ i start))))
vec))

View File

@ -27,7 +27,7 @@
(unless (vector? v)
(raise-type-error 'vector-copy "vector" v))
(unless (exact-nonnegative-integer? start)
(raise-type-error 'vector-copy "non-negative exact integer" 1 start))
(raise-type-error 'vector-copy "non-negative exact integer" start))
(let ([len (vector-length v)])
(cond
[(= len 0)

View File

@ -1096,9 +1096,16 @@ Sets the inexact real number in slot @racket[pos] of @racket[vec]. The
first slot is position @racket[0], and the last slot is one less than
@racket[(flvector-length vec)].}
@defproc[(flvector-copy (v flvector?)) flvector?]{
@defproc[(flvector-copy [vec flvector?]
[start exact-nonnegative-integer? 0]
[end exact-nonnegative-integer? (vector-length v)])
flvector?]{
Returns a fresh copy of @racket[v].}
Creates a fresh @tech{flvector} of size @racket[(- end start)], with all of the
elements of @racket[vec] from @racket[start] (inclusive) to
@racket[end] (exclusive).
Returns a fresh copy of @racket[vec].}
@defproc[(in-flvector (v flvector?)) sequence?]{

View File

@ -262,8 +262,11 @@ except that it can be faster.
]}
@defproc[(vector-copy [vec vector?] [start exact-nonnegative-integer?
0] [end exact-nonnegative-integer? (vector-length v)]) vector?]{
@defproc[(vector-copy [vec vector?]
[start exact-nonnegative-integer? 0]
[end exact-nonnegative-integer? (vector-length v)])
vector?]{
Creates a fresh vector of size @racket[(- end start)], with all of the
elements of @racket[vec] from @racket[start] (inclusive) to
@racket[end] (exclusive).

View File

@ -2,7 +2,7 @@
(Section 'flonum)
(require scheme/flonum)
(require racket/flonum)
(define (flonum-close? fl1 fl2)
(<= (flabs (fl- fl1 fl2))
@ -70,6 +70,8 @@
(test vx 'flvector-copy vcx))
(flvector-set! vc 2 -10.0)
(test 2.0 'flvector-copy (flvector-ref v 2))
(test -10.0 'flvector-copy (flvector-ref vc 2))))
(test -10.0 'flvector-copy (flvector-ref vc 2))
(test '(2.0 3.0) 'flvector-copy (for/list ([i (in-flvector (flvector-copy v 2))]) i))
(test '(2.0) 'flvector-copy (for/list ([i (in-flvector (flvector-copy v 2 3))]) i))))
(report-errs)