From 5372170733a0922bbcbc7cec991bf4e7121dbae6 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Fri, 20 Aug 2021 18:18:14 -0400 Subject: [PATCH] fix: make it compile again --- src/util/Vec.ml | 1 - src/util/VecI32.ml | 11 +++++++++++ src/util/Vec_float.ml | 11 +++++++++++ src/util/Vec_sig.ml | 8 +++++++- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/util/Vec.ml b/src/util/Vec.ml index 3353f6dd..01b9731a 100644 --- a/src/util/Vec.ml +++ b/src/util/Vec.ml @@ -106,7 +106,6 @@ let prepend v ~into : unit = Array.blit v.data 0 into.data 0 v.sz; ) - let filter_in_place f vec = let i = ref 0 in while !i < size vec do diff --git a/src/util/VecI32.ml b/src/util/VecI32.ml index e595d30d..113e3b5c 100644 --- a/src/util/VecI32.ml +++ b/src/util/VecI32.ml @@ -18,6 +18,17 @@ let[@inline] shrink self n = if n < self.sz then self.sz <- n let[@inline] size self = self.sz let[@inline] is_empty self = self.sz = 0 +let[@inline] fast_remove t i = + assert (i>= 0 && i < t.sz); + A.unsafe_set t.data i @@ A.unsafe_get t.data (t.sz - 1); + t.sz <- t.sz - 1 + +let filter_in_place f vec = + let i = ref 0 in + while !i < size vec do + if f (Int32.to_int (A.unsafe_get vec.data !i)) then incr i else fast_remove vec !i + done + (* ensure capacity is [new_cap] *) let resize_cap_ self new_cap = assert (A.dim self.data < new_cap); diff --git a/src/util/Vec_float.ml b/src/util/Vec_float.ml index 1c1d72e8..85afca0e 100644 --- a/src/util/Vec_float.ml +++ b/src/util/Vec_float.ml @@ -18,6 +18,17 @@ let[@inline] shrink self n = if n < self.sz then self.sz <- n let[@inline] size self = self.sz let[@inline] is_empty self = self.sz = 0 +let[@inline] fast_remove t i = + assert (i>= 0 && i < t.sz); + A.unsafe_set t.data i @@ A.unsafe_get t.data (t.sz - 1); + t.sz <- t.sz - 1 + +let filter_in_place f vec = + let i = ref 0 in + while !i < size vec do + if f (A.unsafe_get vec.data !i) then incr i else fast_remove vec !i + done + (* ensure capacity is [new_cap] *) let resize_cap_ self new_cap = assert (A.dim self.data < new_cap); diff --git a/src/util/Vec_sig.ml b/src/util/Vec_sig.ml index 16fa5518..e6e7deec 100644 --- a/src/util/Vec_sig.ml +++ b/src/util/Vec_sig.ml @@ -13,6 +13,12 @@ module type S = sig val push : t -> elt -> unit + val fast_remove : t -> int -> unit + (** Remove element at index [i] without preserving order + (swap with last element) *) + + val filter_in_place : (elt -> bool) -> t -> unit + val pop : t -> elt val get : t -> int -> elt @@ -21,7 +27,7 @@ module type S = sig val shrink : t -> int -> unit - val iter : f:(int -> unit) -> t -> unit + val iter : f:(elt -> unit) -> t -> unit val iteri : f:(int -> elt -> unit) -> t -> unit val to_iter : t -> elt Iter.t