mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-07 19:55:31 -05:00
add CCVector.resize_with and CCVector.resize_with_init, tests and doc (#389)
add CCVector.resize_with and CCVector.resize_with_init, tests and doc
This commit is contained in:
parent
541d716d5c
commit
d1ddeeb31f
2 changed files with 67 additions and 0 deletions
|
|
@ -201,6 +201,55 @@ let push v x =
|
||||||
let v = of_list [1;2;3] in push v 4; to_list v = [1;2;3;4]
|
let v = of_list [1;2;3] in push v 4; to_list v = [1;2;3;4]
|
||||||
*)
|
*)
|
||||||
|
|
||||||
|
let resize_with v f size =
|
||||||
|
let new_vec =
|
||||||
|
if size >= Array.length v.vec then
|
||||||
|
let new_vec = Array.make size (f 0) in
|
||||||
|
Array.blit v.vec 0 new_vec 0 (v.size - 1);
|
||||||
|
new_vec
|
||||||
|
else
|
||||||
|
v.vec
|
||||||
|
in
|
||||||
|
for i = v.size 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 resize_with v (fun i -> i) 5; to_list v = [0;1;2;3;4]
|
||||||
|
let v = make 1 0 in resize_with v (fun i -> i) 5; CCList.length (to_list v) = 5
|
||||||
|
let v = create_with ~capacity:2 0 in resize_with v (fun i -> i) 5; to_list v = [0;1;2;3;4]
|
||||||
|
let v = make 5 0 in resize_with v (fun i -> i) 5; to_list v = [0;0;0;0;0]
|
||||||
|
let v = make 5 0 in resize_with v (fun i -> i) 6; to_list v = [0;0;0;0;0;6]
|
||||||
|
let v = make 5 0 in resize_with v (fun i -> i) 4; to_list v = [0;0;0;0;0]
|
||||||
|
let v = make 5 0 in resize_with v (fun i -> i) 5; CCList.length (to_list v) = 5
|
||||||
|
*)
|
||||||
|
|
||||||
|
let resize_with_init v ~init size =
|
||||||
|
let new_vec =
|
||||||
|
if size >= Array.length v.vec then
|
||||||
|
let new_vec = Array.make size init in
|
||||||
|
Array.blit v.vec 0 new_vec 0 (v.size - 1);
|
||||||
|
new_vec
|
||||||
|
else
|
||||||
|
v.vec
|
||||||
|
in
|
||||||
|
for i = v.size to size - 1 do
|
||||||
|
Array.unsafe_set new_vec i init
|
||||||
|
done;
|
||||||
|
v.vec <- new_vec;
|
||||||
|
v.size <- size
|
||||||
|
|
||||||
|
(*$T
|
||||||
|
let v = make 1 0 in resize_with_init v ~init:1 5; to_list v = [1;1;1;1;1]
|
||||||
|
let v = make 1 0 in resize_with_init v ~init:1 5; CCList.length (to_list v) = 5
|
||||||
|
let v = create_with ~capacity:2 0 in resize_with v ~init:1 5; to_list v = [1;1;1;1;1]
|
||||||
|
let v = make 5 0 in resize_with_init v ~init:1 5; to_list v = [1;1;1;1;1]
|
||||||
|
let v = make 5 0 in resize_with_init v ~init:1 4; to_list v = [1;1;1;1;1]
|
||||||
|
let v = make 5 0 in resize_with_init v ~init:1 5; CCList.length (to_list v) = 5
|
||||||
|
*)
|
||||||
|
|
||||||
(** Add all elements of b to a *)
|
(** Add all elements of b to a *)
|
||||||
let append a b =
|
let append a b =
|
||||||
if array_is_empty_ a then (
|
if array_is_empty_ a then (
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,24 @@ val is_empty : ('a, _) t -> bool
|
||||||
val push : ('a, rw) t -> 'a -> unit
|
val push : ('a, rw) t -> 'a -> unit
|
||||||
(** Add an element at the end of the vector. *)
|
(** 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 [[vec.size-1.. size - 1]].
|
||||||
|
The contents and size of vec are untouched if [size] is inferior or equal
|
||||||
|
to [length vec].
|
||||||
|
@raise Invalid_argument if the size is too big
|
||||||
|
|
||||||
|
@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 calls to [init] on indexes [[length vec -1.. size - 1]].
|
||||||
|
The contents and size of vec are untouched if [size] is inferior or equal
|
||||||
|
to [length vec].
|
||||||
|
@raise Invalid_argument if the size is too big
|
||||||
|
|
||||||
|
@since NEXT_RELEASE *)
|
||||||
|
|
||||||
val append : ('a, rw) t -> ('a, _) t -> unit
|
val append : ('a, rw) t -> ('a, _) t -> unit
|
||||||
(** [append a b] adds all elements of b to a. *)
|
(** [append a b] adds all elements of b to a. *)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue