feat(vec): more

This commit is contained in:
Simon Cruanes 2021-07-20 23:28:18 -04:00
parent d53b3c291e
commit 11b1ea4eda
3 changed files with 13 additions and 3 deletions

View file

@ -27,7 +27,7 @@ let pop_levels (self:_ t) (n:int) ~f : unit =
let new_lvl = n_levels self - n in let new_lvl = n_levels self - n in
let i = Vec.get self.lvls new_lvl in let i = Vec.get self.lvls new_lvl in
while Vec.size self.vec > i do while Vec.size self.vec > i do
let x = Vec.pop self.vec in let x = Vec.pop_exn self.vec in
f x f x
done; done;
Vec.shrink self.lvls new_lvl Vec.shrink self.lvls new_lvl

View file

@ -15,12 +15,20 @@ let[@inline] shrink t i =
assert (i<=t.sz); assert (i<=t.sz);
t.sz <- i t.sz <- i
let[@inline] pop t = let[@inline] pop_exn t =
if t.sz = 0 then invalid_arg "vec.pop"; if t.sz = 0 then invalid_arg "vec.pop";
let x = Array.unsafe_get 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
let[@inline] pop t =
if t.sz = 0 then None
else (
let x = Array.unsafe_get t.data (t.sz - 1) in
t.sz <- t.sz - 1;
Some x
)
let[@inline] size t = t.sz let[@inline] size t = t.sz
let[@inline] is_empty t = t.sz = 0 let[@inline] is_empty t = t.sz = 0

View file

@ -32,10 +32,12 @@ val shrink : 'a t -> int -> unit
(** [shrink vec sz] resets size of [vec] to [sz]. (** [shrink vec sz] resets size of [vec] to [sz].
Assumes [sz >=0 && sz <= size vec] *) Assumes [sz >=0 && sz <= size vec] *)
val pop : 'a t -> 'a val pop_exn : 'a t -> 'a
(** Pop last element and return it. (** Pop last element and return it.
@raise Invalid_argument if the vector is empty *) @raise Invalid_argument if the vector is empty *)
val pop : 'a t -> 'a option
val size : 'a t -> int val size : 'a t -> int
val is_empty : 'a t -> bool val is_empty : 'a t -> bool