;;;; sparse-vectors.extras.scm (module (sparse-vectors extras) (;export ; sparse-vector-reserve!) (import scheme (chicken base) (chicken type) (chicken bitwise) (chicken fixnum) record-variants sparse-vectors) (include-relative "sparse-vectors.types") (: sparse-vector-reserve! (sparse-vector integer #!optional integer -> void)) ;; (include-relative "sparse-vectors-inlines") (define-inline (*sparse-vector-reserve! hilbert index value) (*sparse-vector-set! hilbert index value) ) ;; ;hacky but it works (define (sparse-vector-reserve! hilbert end . rest) (check-sparse-vector 'sparse-vector-reserve hilbert) (let ((low (optional rest 0)) (siz (hilbert-node-size hilbert)) (def (hilbert-default hilbert)) ) (unless (<= (check-exact-uinteger 'sparse-vector-reserve low) (check-exact-uinteger 'sparse-vector-reserve end)) (error 'sparse-vector-reserve "low index must be less than end index" low end)) ;FIXME used may not be in range (unless (fx= 0 (sparse-vector-count hilbert)) (error 'sparse-vector-reserve! "non-empty sparse-vector" hilbert end low)) (do ((index (* (quotient low siz) siz) (+ index siz))) ((>= index end) (set-hilbert-count! hilbert 0)) (*sparse-vector-reserve! hilbert index def)) ) ) ) ;module (sparse-vectors extras)