From 313e9db02661f663ba3b3ae3c14e1fe3ba3bacc4 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Wed, 29 Sep 2021 22:16:10 -0400 Subject: [PATCH] feat(vec): add copy --- src/util/VecI32.ml | 9 +++++++++ src/util/VecI32.mli | 2 -- src/util/Vec_float.ml | 9 +++++++++ src/util/Vec_float.mli | 2 -- src/util/Vec_sig.ml | 4 ++++ 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/util/VecI32.ml b/src/util/VecI32.ml index 207946c6..5ca5badf 100644 --- a/src/util/VecI32.ml +++ b/src/util/VecI32.ml @@ -18,6 +18,15 @@ 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 copy self = + if size self=0 then create ~cap:0 () + else ( + (* copy bigarray *) + let data = mk_arr_ (size self) in + A.blit self.data data; + {sz=self.sz; data} + ) + 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); diff --git a/src/util/VecI32.mli b/src/util/VecI32.mli index d3ba52e9..5fcb355a 100644 --- a/src/util/VecI32.mli +++ b/src/util/VecI32.mli @@ -5,8 +5,6 @@ include Vec_sig.S with type elt := int -val ensure_size : t -> int -> unit - val push_i32 : t -> int32 -> unit val get_i32 : t -> int -> int32 diff --git a/src/util/Vec_float.ml b/src/util/Vec_float.ml index 55757b90..8c2d632c 100644 --- a/src/util/Vec_float.ml +++ b/src/util/Vec_float.ml @@ -18,6 +18,15 @@ 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 copy self = + if size self=0 then create ~cap:0 () + else ( + (* copy bigarray *) + let data = mk_arr_ (size self) in + A.blit self.data data; + {sz=self.sz; data} + ) + 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); diff --git a/src/util/Vec_float.mli b/src/util/Vec_float.mli index c8c33ebe..00863795 100644 --- a/src/util/Vec_float.mli +++ b/src/util/Vec_float.mli @@ -4,5 +4,3 @@ These vectors are more optimized than {!Vec}. *) include Vec_sig.S with type elt := float - -val ensure_size : t -> int -> unit diff --git a/src/util/Vec_sig.ml b/src/util/Vec_sig.ml index 8f3a0025..77a12376 100644 --- a/src/util/Vec_sig.ml +++ b/src/util/Vec_sig.ml @@ -19,6 +19,8 @@ module type BASE = sig val clear : t -> unit + val copy : t -> t + val is_empty : t -> bool val push : t -> elt -> unit @@ -29,6 +31,8 @@ module type BASE = sig val filter_in_place : (elt -> bool) -> t -> unit + val ensure_size : t -> int -> unit + val pop : t -> elt val set : t -> int -> elt -> unit