diff --git a/src/core/CCVector.ml b/src/core/CCVector.ml index 8491cb7d..6029d834 100644 --- a/src/core/CCVector.ml +++ b/src/core/CCVector.ml @@ -247,6 +247,15 @@ let set v i x = if i < 0 || i >= v.size then invalid_arg "CCVector.set"; Array.unsafe_set v.vec i x +let remove v i = + if i < 0 || i >= v.size then invalid_arg "CCVector.remove"; + (* if v.(i) not the last element, then put last element at index i *) + if i < v.size - 1 + then Array.blit v.vec (i+1) v.vec i (v.size - i - 1); + (* remove one element *) + v.size <- v.size - 1; + fill_with_junk_ v.vec v.size 1 + let remove_unordered v i = if i < 0 || i >= v.size then invalid_arg "CCVector.remove_unordered"; (* if v.(i) not the last element, then put last element at index i *) @@ -256,6 +265,25 @@ let remove_unordered v i = v.size <- v.size - 1; fill_with_junk_ v.vec v.size 1 +(*$Q remove + Q.(list_of_size (Gen.int_range 10 10) small_int) (fun l -> \ + let v1 = of_list l and v2 = of_list l in \ + remove v1 9; \ + remove_unordered v2 9; \ + to_list v1 = (to_list v2)) + Q.(list_of_size (Gen.int_range 10 10) small_int) (fun l -> \ + let l = List.sort CCInt.compare l in \ + let v = of_list l in\ + remove v 3; \ + to_list v = (List.sort CCInt.compare (to_list v))) + Q.(list_of_size (Gen.int_range 10 10) small_int) (fun l -> \ + let l = List.sort CCInt.compare l in \ + let v1 = of_list l and v2 = of_list l in \ + remove v1 3; \ + remove_unordered v2 3; \ + to_list v1 = (List.sort CCInt.compare (to_list v2))) +*) + let append_iter a i = i (fun x -> push a x) let append_std_seq a seq = Seq.iter (fun x -> push a x) seq diff --git a/src/core/CCVector.mli b/src/core/CCVector.mli index f6f6619d..c77df09b 100644 --- a/src/core/CCVector.mli +++ b/src/core/CCVector.mli @@ -234,9 +234,16 @@ val set : ('a, rw) t -> int -> 'a -> unit (** Modify element at given index, or @raise Invalid_argument if bad index. *) +val remove : ('a, rw) t -> int -> unit +(** [remove v i] remove the [i-th] element from [v]. + Move elements that are after the [i-th] in [v]. + Preserve the order of the elements in [v]. + See {!remove_unordered} for constant time function. *) + val remove_unordered : ('a, rw) t -> int -> unit -(** Remove the [n-th] element of the vector. Does {b NOT} preserve the order - of the elements (might swap with the last element). *) +(** [remove_unordered v i] remove the [i-th] element from [v]. + Does {b NOT} preserve the order of the elements in [v] + (might swap with the last element). *) val rev : ('a,_) t -> ('a, 'mut) t (** Reverse the vector. *)