mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-12 14:00:42 -05:00
some improvements to Vec
This commit is contained in:
parent
bc562242c9
commit
fb7e422413
2 changed files with 8 additions and 17 deletions
|
|
@ -88,16 +88,16 @@ let[@inline] is_full t = Array.length t.data = t.sz
|
||||||
|
|
||||||
let[@inline] push t e =
|
let[@inline] push t e =
|
||||||
if is_full t then grow_to_double_size t;
|
if is_full t then grow_to_double_size t;
|
||||||
t.data.(t.sz) <- e;
|
Array.unsafe_set t.data (t.sz) e;
|
||||||
t.sz <- t.sz + 1
|
t.sz <- t.sz + 1
|
||||||
|
|
||||||
let[@inline] last t =
|
let[@inline] last t =
|
||||||
if t.sz = 0 then invalid_arg "vec.last";
|
if t.sz = 0 then invalid_arg "vec.last";
|
||||||
t.data.(t.sz - 1)
|
Array.unsafe_get t.data (t.sz - 1)
|
||||||
|
|
||||||
let[@inline] pop_last t =
|
let[@inline] pop_last t =
|
||||||
if t.sz = 0 then invalid_arg "vec.pop_last";
|
if t.sz = 0 then invalid_arg "vec.pop_last";
|
||||||
let x = t.data.(t.sz - 1) in
|
let x = Array.unsafe_get t.data (t.sz - 1) in
|
||||||
t.sz <- t.sz - 1;
|
t.sz <- t.sz - 1;
|
||||||
x
|
x
|
||||||
|
|
||||||
|
|
@ -107,27 +107,21 @@ let[@inline] get t i =
|
||||||
|
|
||||||
let[@inline] set t i v =
|
let[@inline] set t i v =
|
||||||
if i < 0 || i > t.sz then invalid_arg "vec.set";
|
if i < 0 || i > t.sz then invalid_arg "vec.set";
|
||||||
if i = t.sz then
|
if i = t.sz then (
|
||||||
push t v
|
push t v
|
||||||
else
|
) else (
|
||||||
Array.unsafe_set t.data i v
|
Array.unsafe_set t.data i v
|
||||||
|
)
|
||||||
|
|
||||||
let[@inline] copy t =
|
let[@inline] copy t =
|
||||||
let data = Array.copy t.data in
|
let data = Array.copy t.data in
|
||||||
{t with data; }
|
{data; sz=t.sz; dummy=t.dummy}
|
||||||
|
|
||||||
let[@inline] move_to t t' =
|
let[@inline] move_to t t' =
|
||||||
t'.data <- Array.copy t.data;
|
t'.data <- Array.copy t.data;
|
||||||
t'.sz <- t.sz
|
t'.sz <- t.sz
|
||||||
|
|
||||||
let remove t e =
|
let fast_remove t i =
|
||||||
let j = ref 0 in
|
|
||||||
while (!j < t.sz && not (t.data.(!j) == e)) do incr j done;
|
|
||||||
assert (!j < t.sz);
|
|
||||||
for i = !j to t.sz - 2 do t.data.(i) <- t.data.(i+1) done;
|
|
||||||
pop t
|
|
||||||
|
|
||||||
let[@inline] fast_remove t i =
|
|
||||||
assert (i < t.sz);
|
assert (i < t.sz);
|
||||||
t.data.(i) <- t.data.(t.sz - 1);
|
t.data.(i) <- t.data.(t.sz - 1);
|
||||||
t.sz <- t.sz - 1
|
t.sz <- t.sz - 1
|
||||||
|
|
|
||||||
|
|
@ -89,9 +89,6 @@ val copy : 'a t -> 'a t
|
||||||
val move_to : 'a t -> 'a t -> unit
|
val move_to : 'a t -> 'a t -> unit
|
||||||
(** [move_to a b] copies the content of [a] to [b], discarding [b]'s old content *)
|
(** [move_to a b] copies the content of [a] to [b], discarding [b]'s old content *)
|
||||||
|
|
||||||
val remove : 'a t -> 'a -> unit
|
|
||||||
(** Uses [(==)] for comparison *)
|
|
||||||
|
|
||||||
val fast_remove : 'a t -> int -> unit
|
val fast_remove : 'a t -> int -> unit
|
||||||
(** Remove element at index [i] without preserving order
|
(** Remove element at index [i] without preserving order
|
||||||
(swap with last element) *)
|
(swap with last element) *)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue