diff --git a/misc/data_structures/vec.scm b/misc/data_structures/vec.scm index a6af491..d0cf2b3 100644 --- a/misc/data_structures/vec.scm +++ b/misc/data_structures/vec.scm @@ -35,6 +35,9 @@ (define (dynvec-length dvec) (car dvec)) +(define (dynvec-cap dvec) + (vector-length (cdr dvec))) + (define (dynvec-ref dvec i) (vector-ref (cdr dvec) i)) @@ -44,12 +47,19 @@ (define (dynvec-vec dvec) (cdr dvec)) +(define (dynvec-resize! dvec newcap) + (let ((nvec (make-vector newcap))) + (do ((i 0 (+ i 1))) ((= i 0))))) + +;;; Appends elements to a dynamic vector, resizing if needed. (define (dynvec-append! dvec . args) - (let ((i (dynvec-length dvec))) + (let ((i (dynvec-length dvec)) (cap (dynvec-cap dvec))) (for-each (lambda (v) (vector-set! (dynvec-vec dvec) i v) - (set! i (+ i 1))) + (set! i (+ i 1)) + (if (= i cap) + (dynvec-resize! dvec (* dvec 2)))) args) (set-car! dvec i)))