Skip to content

Commit

Permalink
add CCVector.resize_with and CCVector.resize_with_init, tests and doc
Browse files Browse the repository at this point in the history
  • Loading branch information
RadioPotin committed Oct 20, 2021
1 parent 7288045 commit 8c03598
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
46 changes: 46 additions & 0 deletions src/core/CCVector.ml
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down
14 changes: 14 additions & 0 deletions src/core/CCVector.mli
Original file line number Diff line number Diff line change
Expand Up @@ -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. *)

Expand Down

0 comments on commit 8c03598

Please sign in to comment.