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 (***********************************************************************)
17 Time-stamp: <Last modified on 2013-03-18 22:41:45 CET by Kim Nguyen>
23 mutable line : 'a array;
28 type 'a index = int -> 'a
30 let create_with_level level a = {
31 line = Array.create 0 a;
36 let create a = create_with_level 1 a
39 if a.offset == ~-1 then a.offset <- i;
40 let offset = a.offset in
41 let len = Array.length a.line in
42 if i >= offset && i < offset + len then
43 a.line.(i - offset) <- v
45 if i < offset then begin (* bottom resize *)
46 let pad = offset - i in
47 let nlen = len + pad in
48 let narray = Array.create nlen a.dummy in
49 for j = 0 to len - 1 do
50 narray.(j+pad) <- a.line.(j)
55 end else begin (* top resize *)
56 (* preventively allocate the space for the following elements *)
57 let nlen = ((i - offset + 1) lsl 1) + 1 in
58 let narray = Array.create nlen a.dummy in
59 for j = 0 to len - 1 do
60 narray.(j) <- a.line.(j);
62 narray.(i - offset) <- v;
67 let idx = i - a.offset in
68 let len = Array.length a.line in
69 if idx >= 0 && idx < len then
70 Array.unsafe_get a.line idx
77 if a.offset == ~-1 then () else
78 for i = 0 to Array.length line - 1 do
80 f (i+a.offset) v (v==a.dummy)
85 let len = Array.length a.line in
86 let used = Array.fold_left (fun acc i ->
87 if i != d then acc+1 else acc) 0 a.line
94 type 'a t = 'a N1.t N1.t
95 let create_with_level level a =
96 let dummy1 = N1.create_with_level (level+1) a in
97 N1.create_with_level level dummy1
99 let create a = create_with_level 1 a
102 let line = N1.find a i in
103 if line == N1.dummy a then
104 let nline = N1.create_with_level (a.N1.level+1) (N1.dummy line) in
112 let v = N1.find a i in
113 if v == a.N1.dummy then v.N1.dummy
117 let dummy c = c.N1.dummy.N1.dummy
120 let line = a.N1.line in
121 if a.N1.offset == ~-1 then () else
122 for i = 0 to Array.length line - 1 do
123 N1.iteri (f i) line.(i)
127 let d = a.N1.dummy in
129 Array.fold_left (fun ((alen,aused) as acc) i ->
131 let l, u = N1.stats i in
134 acc) (0, 0) a.N1.line
142 type 'a t = 'a N2.t N1.t
144 let create_with_level level a =
145 let dummy2 = N2.create_with_level (level+1) a in
146 N1.create_with_level (level) dummy2
148 let create a = create_with_level 1 a
152 let line = N1.find a i in
153 if line == a.N1.dummy then
154 let nline = N2.create_with_level (a.N1.level+1) (N2.dummy line) in
161 let v = N1.find a i in
162 if v == a.N1.dummy then N2.dummy v
166 let dummy a = N2.dummy a.N1.dummy
168 let line = a.N1.line in
169 if a.N1.offset == ~-1 then () else
170 for i = 0 to Array.length line - 1 do
171 N2.iteri (f i) line.(i)
175 let d = a.N1.dummy in
177 Array.fold_left (fun ((alen,aused) as acc) i ->
179 let l, u = N2.stats i in
182 acc) (0, 0) a.N1.line
190 type 'a t = 'a N3.t N1.t
192 let create_with_level level a =
193 let dummy3 = N3.create_with_level (level+1) a in
194 N1.create_with_level (level) dummy3
196 let create a = create_with_level 1 a
199 let add a i j k l v =
200 let line = N1.find a i in
201 if line == N1.dummy a then
202 let nline = N3.create_with_level (a.N1.level+1) (N3.dummy line) in
209 let v = N1.find a i in
210 if v == (N1.dummy a) then N3.dummy v
214 let dummy a = N3.dummy (N1.dummy a)
216 N1.iteri (fun i v _ ->
217 N3.iteri (fun j k l v2 b -> f i j k l v2 b) v ) a
220 let d = a.N1.dummy in
222 Array.fold_left (fun ((alen,aused) as acc) i ->
224 let l, u = N3.stats i in
227 acc) (0, 0) a.N1.line
235 type 'a t = 'a N4.t N1.t
238 let create_with_level level a =
239 let dummy4 = N4.create_with_level (level+1) a in
240 N1.create_with_level level dummy4
242 let create a = create_with_level 1 a
244 let add a i j k l m v =
245 let line = N1.find a i in
246 if line == (N1.dummy a) then
247 let nline = N4.create_with_level (a.N1.level+1) (N4.dummy line) in
249 N4.add nline j k l m v
251 N4.add line j k l m v
253 let find a i j k l m =
254 let v = N1.find a i in
255 if v == (N1.dummy a) then N4.dummy v
256 else N4.find v j k l m
259 let dummy a = N4.dummy (N1.dummy a)
261 N1.iteri (fun i v _ ->
262 N4.iteri (fun j k l m v2 b -> f i j k l m v2 b) v
267 let d = a.N1.dummy in
269 Array.fold_left (fun ((alen,aused) as acc) i ->
271 let l, u = N4.stats i in
274 acc) (0, 0) a.N1.line
282 type 'a t = 'a N5.t N1.t
284 let create_with_level level a =
285 let dummy5 = N5.create_with_level (level+1) a in
286 N1.create_with_level (level) dummy5
288 let create a = create_with_level 1 a
290 let add a i j k l m n v =
291 let line = N1.find a i in
292 if line == N1.dummy a then
293 let nline = N5.create_with_level (a.N1.level+1) (N5.dummy line) in
295 N5.add nline j k l m n v
297 N5.add line j k l m n v
299 let find a i j k l m n =
300 let v = N1.find a i in
301 if v == N1.dummy a then N5.dummy v
302 else N5.find v j k l m n
305 let dummy a = N5.dummy (N1.dummy a)
307 N1.iteri (fun i v _ ->
308 N5.iteri (fun j k l m n v2 b -> f i j k l m n v2 b) v
312 let d = a.N1.dummy in
314 Array.fold_left (fun ((alen,aused) as acc) i ->
316 let l, u = N5.stats i in
319 acc) (0, 0) a.N1.line