;;; Factor by which the size of a full vector is multiplied (defconstant *increase-factor* 2) ;;; Factor by which the size of a sparse vector is divided (defconstant *decrease-factor* 2) ;;; Threshold to determine whether a vector is sparse ;;; (actually 1/threshold) (defconstant *decrease-threshold* 4) (defun make-resizable-vector (&key (initial-size 8) (element-type t)) (make-array `(,initial-size) :element-type element-type :adjustable t :fill-pointer 0)) (defun vector-insert (element vector) (when (= (array-total-size vector) (fill-pointer vector)) (adjust-array vector `(,(* (array-total-size vector) *increase-factor*)))) (setf (aref vector (fill-pointer vector)) element) (incf (fill-pointer vector)) vector) (defun vector-delete (vector) (setf (aref vector (decf (fill-pointer vector))) nil) ; avoid memory leaks (when (<= (* *decrease-threshold* (fill-pointer vector)) (array-total-size vector)) (adjust-array vector `(,(floor (array-total-size vector) *decrease-factor*)))) vector)