EXTENSIBLE VECTORS -- Jens Axel S�gaard (require (planet "evector.scm" (soegaard "evector.plt"))) ABSTRACT Extensible vectors are a low level resizeable data structure resembling normal Scheme vectors. RATIONALE The purpose of extensible vectors is to provide a low level vector-like data structure, that unlike vectors can be resized in constant amortized time. SPECIFICATION Extensible vectors are heterogenous structures whose elements are indexed by integers. The average time to access a randomly chosen element is typically the same as for a vector. The length of an extensible vector is the number of elements that it contains. This number is a non-negative integer. The valid indexes of an extensible vector are the exact non-negative integers less than the length of the extensible vector. The first element in an extensible vector is indexed by zero, and the last element is indexed by one less than the length of the extensible vector. The length of an extensible vector is set by the procedure set-evector-length!. Increasing the length of an extensible vector will initialize the new elements with the fill value of the extensible vector. The fill value is a value associated with the extensible vector. An extensible vector may be automatically expandable. If the extensible vector is automatically expandable, an attempt to store an element in the extensible vector at an index k larger than or equal to the length of the extensible vector will automatically increase the length of the extensible vector to k+1 before storing the element; otherwise an error is signaled. The space occupied by an extensible vector is affected by the history of the extensible vector. The space occupied is typically less than twice the space of a vector with a length equal to the maximum of the lengths the extensible vector has had. Example: (require (planet "evector.scm" ("soegaard" "evector.plt"))) > (define ev (evector 1 2 3)) > (evector-pop! ev) 3 > (evector-length ev) 2 > (evector->list ev) (1 2) > (evector-set! ev 7 7) > (evector->vector ev) #8(1 2 3 #f #f #f #f 7) > (evector-push! ev 8) 8 > (evector->list ev) (1 2 3 #f #f #f #f 7 8) Further examples are found in the test suite in test-evector.scm. PROCEDURES > make-evector procedure: (make-evector k) procedure: (make-evector k fill) procedure: (make-evector k fill automatic-expansion?) Returns a newly allocated extensible vector of k elements, whose elements are initialized to the fill value. If a second argument is given, fill is used as the fill value; otherwise the fill value is unspecified. If a third argument is given, it determines whether the extensible vector is automatically expandable. Otherwise the extensible vector will be automatically expandable. > evector procedure: (evector obj ...) Returns a newly allocated automatically expandabale extensible vector whose elements contain the given arguments. The fill value is unspecified. > evector-ref procedure: (evector-ref evector k) k must be a valid index of evector. Evector-ref returns the contents of element k of evector. > evector-set! procedure: (evector-set! evector k obj) Evector-set! stores obj in element k of evector. If k is greater than the length of evector, then evector is expanded if it is automatically expandable; otherwise an error is signaled. The value returned by evector-set! is unspecified. > evector-length procedure: (evector-length evector) Returns the number of elements in evector as an exact integer. >set-evector-length! procedure: (set-evector-length! evector k) Sets the length of the extensible vector evector to k. If k is greater than the previous size of evector, the new elements with index equal to or greater to the old size will be initialised to the fill value of evector. > evector? procedure: (evector obj) Returns #t if obj is an evector, otherwise returns #f. > evector-fill > set-evector-fill! procedure: (evector-fill evector) procedure: (set-evector-fill! evector fill) Evector-fill returns the fill value of evector. Set-evector-fill! changes the fill value to fill. > evector->list > list->evector procedure: (evector->list evector) procedure: (list->evector list) Evector->list returns a newly allocated list of the objects contained in the elements of evector. List->evector returns a newly created extensible vector initialized to the elements of the list list. > evector->vector > vector->evector procdure: (evector->vector evector) procdure: (vector->evector vector) Evector->vector returns a newly allocated vector containing the elements of evector. Vector->evector returns a newly allocated extensible vector initialized to the elements of the vector vector. > evector-fill! procedure: (evector-fill! evector fill) procedure: (evector-fill! evector fill start) procedure: (evector-fill! evector fill start end) Stores fill in the elements of the evector with indexes from start inclusive to end exclusive. The default value for start is 0, and the default value for the end is the length of the extensible vector.