Module: internal Author: Jonathan Bachrach Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND define limited-vector (fill: 0); define limited-vector-minus-selector () (fill: 0); define limited-vector-minus-selector () (fill: 0); define limited-vector-minus-constructor (, ) (fill: #f); define method make (class == , #key fill = #f, element-type :: , size :: = 0) => (vector :: ) unless (size = 0) check-type(fill, element-type); end unless; system-allocate-repeated-instance (, , element-type, size, fill); end method; define sealed domain element-type (); define inline sealed method element-setter (new-value, vector :: , index :: ) => (object) check-type(new-value, element-type(vector)); if (element-range-check(index, size(vector))) element-no-bounds-check(vector, index) := new-value else element-range-error(vector, index) end if end method element-setter; /// TODO: COULD BE EXPENSIVE UNLESS TYPES ARE CACHED define inline method type-for-copy (vector :: ) => (type :: ) limited-vector(element-type(vector), #f) end method type-for-copy; /// REALLY NEED SUBTYPE SPECIALIZERS TO GET THIS TO HAPPEN IN MACRO define inline method concrete-limited-vector-class (of :: ) => (res :: ) select (of by subtype?) => ; => ; otherwise => ; end select; end method; define limited-vector (fill: as(, 0)); define limited-vector (fill: 0.0); define limited-vector (fill: as(, 0.0)); // // SIMPLE-BYTE-VECTOR // /// Special <-> coercions define method as (bsc == , bv :: ) => (bs :: ) let bs :: = make(, size: bv.size); without-bounds-checks for (i :: from 0 below bv.size) bs[i] := as(, bv[i]); end; end without-bounds-checks; bs end method; define method as (bvc == , bs :: ) => (bv :: ) let bv :: = make(, size: bs.size); without-bounds-checks for (i :: from 0 below bs.size) bv[i] := as(, bs[i]); end; end without-bounds-checks; bv end method; define method as (class == , x :: ) => (string :: ) as(, x) end method; // already is a vector. Maybe want method for simple object vector? define method as (class == , x :: ) => (vector :: ) x end method; // eof