X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Fcache.ml;h=e5ee4343e7b248fd56c328881dff932813dc67ab;hp=f9b7457d827c1ad77163215ae000df116cae3466;hb=4f265eb7d78b740292b5543d94f9f0fa40d206d5;hpb=974dacbf4f625bfd8ea83db69d6b346050141fea diff --git a/src/cache.ml b/src/cache.ml index f9b7457..e5ee434 100644 --- a/src/cache.ml +++ b/src/cache.ml @@ -13,10 +13,6 @@ (* *) (***********************************************************************) -(* - Time-stamp: -*) - module N1 = struct type 'a t = { @@ -28,7 +24,7 @@ struct type 'a index = int -> 'a let level a = a.level let create_with_level level a = { - line = Array.create 0 a; + line = Array.make 0 a; dummy = a; offset = ~-1; level = level; @@ -45,7 +41,7 @@ struct if i < offset then begin (* bottom resize *) let pad = offset - i in let nlen = len + pad in - let narray = Array.create nlen a.dummy in + let narray = Array.make nlen a.dummy in for j = 0 to len - 1 do narray.(j+pad) <- a.line.(j) done; @@ -55,7 +51,7 @@ struct end else begin (* top resize *) (* 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 + let narray = Array.make nlen a.dummy in for j = 0 to len - 1 do narray.(j) <- a.line.(j); done; @@ -65,10 +61,12 @@ struct 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 @@ -110,8 +108,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 @@ -159,8 +157,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 @@ -279,45 +277,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