1 (***********************************************************************)
5 (* Kim Nguyen, LRI UMR8623 *)
6 (* Université Paris-Sud & CNRS *)
8 (* Copyright 2010-2013 Université Paris-Sud and Centre National de la *)
9 (* Recherche Scientifique. All rights reserved. This file is *)
10 (* distributed under the terms of the GNU Lesser General Public *)
11 (* License, with the special exception on linking described in file *)
14 (***********************************************************************)
19 mutable line : 'a array;
24 type 'a index = int -> 'a
26 let create_with_level level a = {
27 line = Array.create 0 a;
32 let create a = create_with_level 1 a
35 if a.offset == ~-1 then a.offset <- i;
36 let offset = a.offset in
37 let len = Array.length a.line in
38 if i >= offset && i < offset + len then
39 a.line.(i - offset) <- v
41 if i < offset then begin (* bottom resize *)
42 let pad = offset - i in
43 let nlen = len + pad in
44 let narray = Array.create nlen a.dummy in
45 for j = 0 to len - 1 do
46 narray.(j+pad) <- a.line.(j)
51 end else begin (* top resize *)
52 (* preventively allocate the space for the following elements *)
53 let nlen = ((i - offset + 1) lsl 1) + 1 in
54 let narray = Array.create nlen a.dummy in
55 Array.blit a.line 0 narray 0 len;
56 (*for j = 0 to len - 1 do
57 narray.(j) <- a.line.(j);
59 narray.(i - offset) <- v;
64 let idx = i - a.offset in
65 if idx < 0 then a.dummy
67 let len = Array.length a.line in
69 Array.unsafe_get a.line idx
76 if a.offset == ~-1 then () else
77 for i = 0 to Array.length line - 1 do
79 f (i+a.offset) v (v==a.dummy)
84 let len = Array.length a.line in
85 let used = Array.fold_left (fun acc i ->
86 if i != d then acc+1 else acc) 0 a.line
93 type 'a t = 'a N1.t N1.t
94 let create_with_level level a =
95 let dummy1 = N1.create_with_level (level+1) a in
96 N1.create_with_level level dummy1
98 let create a = create_with_level 1 a
101 let line = N1.find a i in
102 if line == N1.dummy a then
103 let nline = N1.create_with_level (a.N1.level+1) (N1.dummy line) in
111 let v = N1.find a i in
112 if v != a.N1.dummy then N1.find v j
116 let dummy c = c.N1.dummy.N1.dummy
119 let line = a.N1.line in
120 if a.N1.offset == ~-1 then () else
121 for i = 0 to Array.length line - 1 do
122 N1.iteri (f i) line.(i)
126 let d = a.N1.dummy in
128 Array.fold_left (fun ((alen,aused) as acc) i ->
130 let l, u = N1.stats i in
133 acc) (0, 0) a.N1.line
141 type 'a t = 'a N2.t N1.t
143 let create_with_level level a =
144 let dummy2 = N2.create_with_level (level+1) a in
145 N1.create_with_level (level) dummy2
147 let create a = create_with_level 1 a
151 let line = N1.find a i in
152 if line == a.N1.dummy then
153 let nline = N2.create_with_level (a.N1.level+1) (N2.dummy line) in
160 let v = N1.find a i in
161 if v != a.N1.dummy then N2.find v j k
165 let dummy a = N2.dummy a.N1.dummy
167 let line = a.N1.line in
168 if a.N1.offset == ~-1 then () else
169 for i = 0 to Array.length line - 1 do
170 N2.iteri (f i) line.(i)
174 let d = a.N1.dummy in
176 Array.fold_left (fun ((alen,aused) as acc) i ->
178 let l, u = N2.stats i in
181 acc) (0, 0) a.N1.line
189 type 'a t = 'a N3.t N1.t
191 let create_with_level level a =
192 let dummy3 = N3.create_with_level (level+1) a in
193 N1.create_with_level (level) dummy3
195 let create a = create_with_level 1 a
198 let add a i j k l v =
199 let line = N1.find a i in
200 if line == N1.dummy a then
201 let nline = N3.create_with_level (a.N1.level+1) (N3.dummy line) in
208 let v = N1.find a i in
209 if v == (N1.dummy a) then N3.dummy v
213 let dummy a = N3.dummy (N1.dummy a)
215 N1.iteri (fun i v _ ->
216 N3.iteri (fun j k l v2 b -> f i j k l v2 b) v ) a
219 let d = a.N1.dummy in
221 Array.fold_left (fun ((alen,aused) as acc) i ->
223 let l, u = N3.stats i in
226 acc) (0, 0) a.N1.line
234 type 'a t = 'a N4.t N1.t
237 let create_with_level level a =
238 let dummy4 = N4.create_with_level (level+1) a in
239 N1.create_with_level level dummy4
241 let create a = create_with_level 1 a
243 let add a i j k l m v =
244 let line = N1.find a i in
245 if line == (N1.dummy a) then
246 let nline = N4.create_with_level (a.N1.level+1) (N4.dummy line) in
248 N4.add nline j k l m v
250 N4.add line j k l m v
252 let find a i j k l m =
253 let v = N1.find a i in
254 if v == (N1.dummy a) then N4.dummy v
255 else N4.find v j k l m
258 let dummy a = N4.dummy (N1.dummy a)
260 N1.iteri (fun i v _ ->
261 N4.iteri (fun j k l m v2 b -> f i j k l m v2 b) v
266 let d = a.N1.dummy in
268 Array.fold_left (fun ((alen,aused) as acc) i ->
270 let l, u = N4.stats i in
273 acc) (0, 0) a.N1.line
281 type 'a t = 'a N3.t N3.t
284 let dummy3 = N3.create a in
287 let add a i j k l m n v =
288 let line = N3.find a i j k in
289 if line == N3.dummy a then
290 let nline = N3.create (N3.dummy line) in
291 N3.add a i j k nline;
296 let find a i j k l m n =
297 let v = N3.find a i j k in
298 if v == N3.dummy a then N3.dummy v
302 let dummy a = N3.dummy (N3.dummy a)
304 N3.iteri (fun i j k v _ ->
305 N3.iteri (fun l m n v2 b -> f i j k l m n v2 b) v
308 let stats a = assert false