diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 1995-06-05 13:42:38 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 1995-06-05 13:42:38 +0000 |
commit | 30f8a17350d8ea75536fee0d68c4dd5077daed11 (patch) | |
tree | 874960100892b369e4cf50ec0ea82052781e0455 /stdlib/array.ml | |
parent | 85da7aa828bcd55b4160196484efc632c50df396 (diff) |
Array.concat prend maintenant une liste de N arrays.
La concatenation de deux arrays s'appelle Array.append.
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@23 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'stdlib/array.ml')
-rw-r--r-- | stdlib/array.ml | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/stdlib/array.ml b/stdlib/array.ml index aa156bef9..3089e2f83 100644 --- a/stdlib/array.ml +++ b/stdlib/array.ml @@ -32,13 +32,7 @@ let copy a = r end -let concat_aux a1 a2 l1 l2 init = - let r = new (l1 + l2) init in - for i = 0 to l1 - 1 do unsafe_set r i (unsafe_get a1 i) done; - for i = 0 to l2 - 1 do unsafe_set r (i + l1) (unsafe_get a1 i) done; - r - -let concat a1 a2 = +let append a1 a2 = let l1 = length a1 and l2 = length a2 in if l1 = 0 & l2 = 0 then [||] else begin let r = new (l1 + l2) (unsafe_get (if l1 > 0 then a1 else a2) 0) in @@ -47,6 +41,26 @@ let concat a1 a2 = r end +let concat_aux init al = + let size = List.fold_left (fun sz a -> sz + length a) 0 al in + let res = new size init in + let pos = ref 0 in + List.iter + (fun a -> + for i = 0 to length a - 1 do + unsafe_set res !pos (unsafe_get a i); + incr pos + done) + al; + res + +let concat al = + let rec find_init = function + [] -> [||] + | a :: rem -> + if length a > 0 then concat_aux (unsafe_get a 0) al else find_init rem + in find_init al + let sub a ofs len = if ofs < 0 or len < 0 or ofs + len > length a then invalid_arg "Array.sub" else if len = 0 then [||] |