X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fcache.ml;h=bc1839260b8f6790affc56570d669b4acb271af1;hb=refs%2Fheads%2Ffeature%2Ffast-multipass;hp=9ffb332b542f31b52243aee245b711709f8ce93c;hpb=41dd1fed04cabad212f10fce3484545f6e9d9444;p=tatoo.git diff --git a/src/cache.ml b/src/cache.ml index 9ffb332..bc18392 100644 --- a/src/cache.ml +++ b/src/cache.ml @@ -52,19 +52,22 @@ struct (* preventively allocate the space for the following elements *) let nlen = ((i - offset + 1) lsl 1) + 1 in let narray = Array.create nlen a.dummy in - for j = 0 to len - 1 do + Array.blit a.line 0 narray 0 len; + (*for j = 0 to len - 1 do narray.(j) <- a.line.(j); - done; + done; *) narray.(i - offset) <- v; a.line <- narray end let find a i = let idx = i - a.offset in - let len = Array.length a.line in - if idx >= 0 && idx < len then - Array.unsafe_get a.line idx - else a.dummy + if idx < 0 then a.dummy + else + let len = Array.length a.line in + if idx < len then + Array.unsafe_get a.line idx + else a.dummy let dummy a = a.dummy @@ -106,8 +109,8 @@ struct let find a i j = let v = N1.find a i in - if v == a.N1.dummy then v.N1.dummy - else N1.find v j + if v != a.N1.dummy then N1.find v j + else v.N1.dummy let dummy c = c.N1.dummy.N1.dummy @@ -155,8 +158,8 @@ struct let find a i j k = let v = N1.find a i in - if v == a.N1.dummy then N2.dummy v - else N2.find v j k + if v != a.N1.dummy then N2.find v j k + else N2.dummy v let dummy a = N2.dummy a.N1.dummy @@ -275,45 +278,32 @@ end module N6 = struct - type 'a t = 'a N5.t N1.t + type 'a t = 'a N3.t N3.t - let create_with_level level a = - let dummy5 = N5.create_with_level (level+1) a in - N1.create_with_level (level) dummy5 - - let create a = create_with_level 1 a + let create a = + let dummy3 = N3.create a in + N3.create dummy3 let add a i j k l m n v = - let line = N1.find a i in - if line == N1.dummy a then - let nline = N5.create_with_level (a.N1.level+1) (N5.dummy line) in - N1.add a i nline; - N5.add nline j k l m n v + let line = N3.find a i j k in + if line == N3.dummy a then + let nline = N3.create (N3.dummy line) in + N3.add a i j k nline; + N3.add nline l m n v else - N5.add line j k l m n v + N3.add line l m n v let find a i j k l m n = - let v = N1.find a i in - if v == N1.dummy a then N5.dummy v - else N5.find v j k l m n + let v = N3.find a i j k in + if v == N3.dummy a then N3.dummy v + else N3.find v l m n - let dummy a = N5.dummy (N1.dummy a) + let dummy a = N3.dummy (N3.dummy a) let iteri f a = - N1.iteri (fun i v _ -> - N5.iteri (fun j k l m n v2 b -> f i j k l m n v2 b) v + N3.iteri (fun i j k v _ -> + N3.iteri (fun l m n v2 b -> f i j k l m n v2 b) v ) a - let stats a = - let d = a.N1.dummy in - let len, used = - Array.fold_left (fun ((alen,aused) as acc) i -> - if i != d then - let l, u = N5.stats i in - (alen+l, aused+u) - else - acc) (0, 0) a.N1.line - in - len, used - + let stats a = assert false end