From 8c035987e99be36d288d9f0b7a752b15f6ad0ad5 Mon Sep 17 00:00:00 2001 From: Dario Pinto Date: Wed, 20 Oct 2021 13:01:04 +0200 Subject: [PATCH] add CCVector.resize_with and CCVector.resize_with_init, tests and doc --- src/core/CCVector.ml | 46 +++++++++++++++++++++++++++++++++++++++++++ src/core/CCVector.mli | 14 +++++++++++++ 2 files changed, 60 insertions(+) diff --git a/src/core/CCVector.ml b/src/core/CCVector.ml index 4f90df112..b2d3b917b 100644 --- a/src/core/CCVector.ml +++ b/src/core/CCVector.ml @@ -201,6 +201,52 @@ let push v x = let v = of_list [1;2;3] in push v 4; to_list v = [1;2;3;4] *) +let resize_with v f size = + if size > Sys.max_array_length then + failwith "vec.resize_with: size too big" + else if size <= Array.length v.vec then + for i = 0 to size - 1 do + Array.unsafe_set v.vec i (f i) + done + else + let new_vec = Array.make size (f 0) in + for i = 0 to size - 1 do + Array.unsafe_set new_vec i (f i) + done; + v.vec <- new_vec; + v.size <- size; + () + +(*$T + let v = make 1 0 in to_list (resize_with v (fun i -> i) 5) = [0;1;2;3;4] + let v = make 1 0 in length (resize_with v (fun i -> i) 5) = 5 + + let v = make 5 0 in to_list (resize_with v (fun i -> i) 5) = [0;1;2;3;4] + let v = make 5 0 in to_list (resize_with v (fun i -> i) -1) = [0;1;2;3;4] + let v = make 5 0 in length (resize_with v (fun i -> i) 5) = 5 +*) + +let resize_with_init v ~init size = + if size > Sys.max_array_length then + failwith "vec.resize_with_init: size too big" + else if size <= Array.length v.vec then + for i = 0 to size - 1 do + Array.unsafe_set v.vec i init + done + else + v.vec <- Array.make size init; + v.size <- size; + () + +(*$T + let v = make 1 0 in to_list (resize_with_init v ~init:1 5) = [1;1;1;1;1] + let v = make 1 0 in length (resize_with_init v ~init:1 5) = 5 + + let v = make 5 0 in to_list (resize_with_init v ~init:1 5) = [1;1;1;1;1] + let v = make 5 0 in to_list (resize_with_init v ~init:1 -1) = [1;1;1;1;1] + let v = make 5 0 in length (resize_with_init v ~init:1 5) = 5 +*) + (** Add all elements of b to a *) let append a b = if array_is_empty_ a then ( diff --git a/src/core/CCVector.mli b/src/core/CCVector.mli index 17170a7ce..a6d957d4f 100644 --- a/src/core/CCVector.mli +++ b/src/core/CCVector.mli @@ -79,6 +79,20 @@ val is_empty : ('a, _) t -> bool val push : ('a, rw) t -> 'a -> unit (** Add an element at the end of the vector. *) +val resize_with : ('a, rw) t -> (int -> 'a) -> int -> unit +(** [resize_with vec f size] resizes vector [vec] up to [size], fills vector + with calls to [f] on indexes [[0.. size - 1]]. + The contents of [vec] are merely overwritten with calls to [f] if [size] + is inferior or equal to the current size of [vec]. + @since NEXT_RELEASE *) + +val resize_with_init : ('a, rw) t -> init:'a -> int -> unit +(** [resize_with_init vec init size] resizes vector [vec] up to [size], + fills vector with value [init]. + The contents of [vec] are merely overwritten with [init] if [size] + is inferior or equal to the current size of [vec]. + @since NEXT_RELEASE *) + val append : ('a, rw) t -> ('a, _) t -> unit (** [append a b] adds all elements of b to a. *)