sidekick/src/util/Backtrack_stack.ml
2021-07-18 01:40:55 -04:00

36 lines
847 B
OCaml

type 'a t = {
vec: 'a Vec.t;
lvls: int Vec.t;
}
let create() : _ t = {vec=Vec.create(); lvls=Vec.create()}
let[@inline] n_levels self : int = Vec.size self.lvls
let[@inline] push self x : unit =
Vec.push self.vec x
let[@inline] push_if_nonzero_level self x : unit =
if n_levels self > 0 then (
Vec.push self.vec x;
)
let[@inline] push_level (self:_ t) : unit =
Vec.push self.lvls (Vec.size self.vec)
let pop_levels (self:_ t) (n:int) ~f : unit =
if n > n_levels self then (
Error.errorf "Backtrack_stack.pop_levels %d (size: %d)" n (n_levels self);
);
if n > 0 then (
let new_lvl = n_levels self - n in
let i = Vec.get self.lvls new_lvl in
while Vec.size self.vec > i do
let x = Vec.pop self.vec in
f x
done;
Vec.shrink self.lvls new_lvl
)
let iter ~f self = Vec.iter f self.vec