small updates of Vector;

removed the capacity field in Vector
This commit is contained in:
Simon Cruanes 2013-03-17 18:43:46 +01:00
parent ef08010c6f
commit 3b6722d1c4
2 changed files with 14 additions and 15 deletions

View file

@ -28,41 +28,38 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
(** a vector of 'a. *) (** a vector of 'a. *)
type 'a t = { type 'a t = {
mutable size : int; mutable size : int;
mutable capacity : int;
mutable vec : 'a array; mutable vec : 'a array;
} }
let create i = let create i =
assert (i >= 0); assert (i >= 0);
{ size = 0; { size = 0;
capacity = i;
vec = if i = 0 then [||] else Array.create i (Obj.magic None); vec = if i = 0 then [||] else Array.create i (Obj.magic None);
} }
(** resize the underlying array so that it can contains the (** resize the underlying array so that it can contains the
given number of elements *) given number of elements *)
let resize v newcapacity = let resize v newcapacity =
if newcapacity <= v.capacity let newcapacity = min newcapacity Sys.max_array_length in
if newcapacity <= Array.length v.vec
then () (* already big enough *) then () (* already big enough *)
else begin else begin
assert (newcapacity >= v.size); assert (newcapacity >= v.size);
let new_vec = Array.create newcapacity (Obj.magic None) in let new_vec = Array.create newcapacity (Obj.magic None) in
Array.blit v.vec 0 new_vec 0 v.size; Array.blit v.vec 0 new_vec 0 v.size;
v.vec <- new_vec; v.vec <- new_vec;
v.capacity <- newcapacity
end end
let clear v = let clear v =
v.size <- 0; v.size <- 0;
if v.capacity > 1000 (* shrink if too large *) if Array.length v.vec > 1024 (* shrink if too large *)
then (v.capacity <- 10; then (v.vec <- Array.create 10 (Obj.magic None))
v.vec <- Array.create 10 (Obj.magic None))
let is_empty v = v.size = 0 let is_empty v = v.size = 0
let push v x = let push v x =
(if v.capacity = v.size (if Array.length v.vec = v.size
then resize v (2 * v.capacity)); then resize v (2 * v.size));
v.vec.(v.size) <- x; v.vec.(v.size) <- x;
v.size <- v.size + 1 v.size <- v.size + 1
@ -92,11 +89,11 @@ let copy v =
let shrink v n = let shrink v n =
if n > v.size then failwith "cannot shrink to bigger size" else v.size <- n if n > v.size then failwith "cannot shrink to bigger size" else v.size <- n
let member ?(cmp=(=)) v x = let member ?(eq=(=)) v x =
let n = v.size in let n = v.size in
let rec check i = let rec check i =
if i = n then false if i = n then false
else if cmp x v.vec.(i) then true else if eq x v.vec.(i) then true
else check (i+1) else check (i+1)
in check 0 in check 0
@ -177,11 +174,11 @@ let find v p =
in check 0 in check 0
let get v i = let get v i =
(if i < 0 || i >= v.size then failwith "wrong index for vector"); (if i < 0 || i >= v.size then failwith "Vector.get");
v.vec.(i) v.vec.(i)
let set v i x = let set v i x =
(if i < 0 || i >= v.size then failwith "wrong index for vector"); (if i < 0 || i >= v.size then failwith "Vector.set");
v.vec.(i) <- x v.vec.(i) <- x
let size v = v.size let size v = v.size

View file

@ -55,7 +55,7 @@ val copy : 'a t -> 'a t
val shrink : 'a t -> int -> unit val shrink : 'a t -> int -> unit
(** shrink to the given size (remove elements above this size) *) (** shrink to the given size (remove elements above this size) *)
val member : ?cmp:('a -> 'a -> bool) -> 'a t -> 'a -> bool val member : ?eq:('a -> 'a -> bool) -> 'a t -> 'a -> bool
(** is the element a member of the vector? *) (** is the element a member of the vector? *)
val sort : ?cmp:('a -> 'a -> int) -> 'a t -> unit val sort : ?cmp:('a -> 'a -> int) -> 'a t -> unit
@ -98,7 +98,9 @@ val size : 'a t -> int
(** number of elements in vector *) (** number of elements in vector *)
val unsafe_get_array : 'a t -> 'a array val unsafe_get_array : 'a t -> 'a array
(** Access the underlying *shared* array (do not modify!) *) (** Access the underlying *shared* array (do not modify!).
[unsafe_get_array v] is longer than [size v], but elements at higher
index than [size v] are undefined (do not access!). *)
val of_seq : ?init:'a t -> 'a Sequence.t -> 'a t val of_seq : ?init:'a t -> 'a Sequence.t -> 'a t
val to_seq : 'a t -> 'a Sequence.t val to_seq : 'a t -> 'a Sequence.t