From 26060f83ff53d4bfbee5d6d4deeb1e21ae9a5945 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Wed, 21 May 2014 00:19:24 +0200 Subject: [PATCH] CCArray --- _oasis | 2 +- core/CCArray.ml | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ core/CCArray.mli | 53 +++++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 core/CCArray.ml create mode 100644 core/CCArray.mli diff --git a/_oasis b/_oasis index 7870a1bb..a30d41c1 100644 --- a/_oasis +++ b/_oasis @@ -41,7 +41,7 @@ Library "containers" Modules: CCVector, CCDeque, CCGen, CCSequence, CCFQueue, CCMultiMap, CCMultiSet, CCBV, CCPrint, CCPersistentHashtbl, CCLeftistheap, CCList, CCOpt, CCPair, CCFun, CCHash, - CCKList, CCInt, CCBool + CCKList, CCInt, CCBool, CCArray FindlibName: containers Library "containers_string" diff --git a/core/CCArray.ml b/core/CCArray.ml new file mode 100644 index 00000000..9f52f5f3 --- /dev/null +++ b/core/CCArray.ml @@ -0,0 +1,82 @@ +(* +copyright (c) 2013-2014, simon cruanes +all rights reserved. + +redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. redistributions in binary +form must reproduce the above copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other materials provided with +the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*) + +(** {1 Array utils} *) + +type 'a t = 'a array + +let foldi f acc a = + let rec recurse acc i = + if i = Array.length a then acc else recurse (f acc i a.(i)) (i+1) + in recurse acc 0 + +let for_all p a = + let rec check i = + i = Array.length a || (p a.(i) && check (i+1)) + in check 0 + +let for_all2 p a1 a2 = + let rec check i = + i = Array.length a1 || (p a1.(i) a2.(i) && check (i+1)) + in + if Array.length a1 <> Array.length a2 + then raise (Invalid_argument "forall2") + else check 0 + +let exists p a = + let rec check i = + i < Array.length a && (p a.(i) || check (i+1)) + in check 0 + +(** all the elements of a, but the i-th, into a list *) +let except_idx a i = + foldi + (fun acc j elt -> if i = j then acc else elt::acc) + [] a + +(* Randomly shuffle the array, in place. + See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle *) +let shuffle a = + for i = 1 to Array.length a - 1 do + let j = Random.int i in + let tmp = a.(i) in + a.(i) <- a.(j); + a.(j) <- tmp; + done + +(** print an array of items using the printing function *) +let pp ?(sep=", ") pp_item buf a = + for i = 0 to Array.length a - 1 do + (if i > 0 then Buffer.add_string buf sep); + pp_item buf a.(i) + done + +(** print an array of items using the printing function *) +let pp_i ?(sep=", ") pp_item buf a = + for i = 0 to Array.length a - 1 do + (if i > 0 then Buffer.add_string buf sep); + pp_item buf i a.(i) + done + diff --git a/core/CCArray.mli b/core/CCArray.mli new file mode 100644 index 00000000..b520d221 --- /dev/null +++ b/core/CCArray.mli @@ -0,0 +1,53 @@ +(* +copyright (c) 2013-2014, simon cruanes +all rights reserved. + +redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. redistributions in binary +form must reproduce the above copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other materials provided with +the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*) + +(** {1 Array utils} *) + +type 'a t = 'a array + +val foldi : ('b -> int -> 'a -> 'b) -> 'b -> 'a t -> 'b +(** fold left on array, with index *) + +val for_all : ('a -> bool) -> 'a t -> bool + +val for_all2 : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool +(** Forall on pairs of arrays. + @raise Invalid_argument if they have distinct lengths *) + +val exists : ('a -> bool) -> 'a t -> bool + +val except_idx : 'a t -> int -> 'a list +(** Remove given index *) + +val shuffle : 'a t -> unit +(** shuffle randomly the array, in place *) + +val pp: ?sep:string -> (Buffer.t -> 'a -> unit) + -> Buffer.t -> 'a array -> unit +(** print an array of items with printing function *) + +val pp_i: ?sep:string -> (Buffer.t -> int -> 'a -> unit) + -> Buffer.t -> 'a array -> unit +(** print an array, giving the printing function both index and item *)