Finaly clean up formula representation.
[SXSI/xpathcomp.git] / src / cache.ml
1 INCLUDE "trace.ml"
2
3 let realloc l old_size new_size dummy =
4   let l' = Array.create new_size dummy in
5   for i = 0 to (min old_size new_size) - 1 do
6     l'.(i) <- l.(i);
7   done;
8   l'
9
10 module Lvl1 =
11 struct
12   type 'a t = { mutable line : 'a array;
13                 dummy : 'a;
14                 mutable offset : int;
15               }
16   let create n a = {
17     line = Array.create 0 a;
18     dummy = a;
19     offset = ~-1;
20
21   }
22
23
24   let add a i v =
25     if a.offset == ~-1 then a.offset <- i;
26     let offset = a.offset in
27     let len = Array.length a.line in
28     if i >= offset && i < offset + len then
29       a.line.(i - offset) <- v
30     else
31       if i < offset then begin (* bottom resize *)
32         let pad = offset - i in
33         let nlen = len + pad in
34         let narray = Array.create nlen a.dummy in
35         for j = 0 to len - 1 do
36           narray.(j+pad) <- a.line.(j)
37         done;
38         a.offset <- i;
39         a.line <- narray;
40         narray.(0) <- v;
41       end else begin (* top resize *)
42         (* preventively allocate the space for the following elements *)
43         let nlen = ((i - offset + 1) lsl 1) + 1 in
44         let narray = Array.create nlen a.dummy in
45         for j = 0 to len - 1 do
46           narray.(j) <- a.line.(j);
47         done;
48         narray.(i - offset + 1) <- v;
49         a.line <- narray
50       end
51
52   let find a i =
53     let offset = a.offset in
54     let len = Array.length a.line in
55     if i >= offset && i < offset + len then a.line.(i - offset)
56     else a.dummy
57
58   let dummy a = a.dummy
59
60   let iteri f a =
61     let line = a.line in
62     if a.offset == ~-1 then () else
63       for i = 0 to Array.length line - 1 do
64         let v = line.(i) in
65           f (i+a.offset) v (v==a.dummy)
66       done
67
68
69 end
70
71
72
73 module Lvl2 =
74 struct
75   type 'a t = 'a Lvl1.t Lvl1.t
76   let create n a =
77     let dummy1 = Lvl1.create 0 a in
78     { Lvl1.line = Array.create n dummy1;
79       Lvl1.offset = ~-1;
80       Lvl1.dummy = dummy1;
81     }
82
83
84   let add a i j v =
85     let line = Lvl1.find a i in
86     if line == a.Lvl1.dummy then
87       let nline =  { line with Lvl1.offset = ~-1 } in
88       Lvl1.add nline j v;
89       Lvl1.add a i nline
90     else
91       Lvl1.add line j v
92
93   let find a i j =
94     let v = Lvl1.find a i in
95     if v == a.Lvl1.dummy then a.Lvl1.dummy.Lvl1.dummy
96     else Lvl1.find v j
97
98
99   let dummy c = c.Lvl1.dummy.Lvl1.dummy
100
101   let iteri f a =
102     let line = a.Lvl1.line in
103     if a.Lvl1.offset == ~-1 then () else
104       for i = 0 to Array.length line - 1 do
105         Lvl1.iteri (f i) line.(i)
106       done
107
108
109 end
110
111 module Lvl3 =
112 struct
113   type 'a t = 'a Lvl2.t Lvl1.t
114
115   let create n a =
116   let dummy1 = Lvl2.create 0 a in
117     { Lvl1.line = Array.create n dummy1;
118       Lvl1.offset = ~-1;
119       Lvl1.dummy = dummy1;
120     }
121
122   let add a i j k v =
123     let line = Lvl1.find a i in
124     if line == a.Lvl1.dummy then
125       let nline =  { line with Lvl1.offset = ~-1 } in
126       Lvl2.add nline j k v;
127       Lvl1.add a i nline
128     else
129       Lvl2.add line j k v
130
131   let find a i j k =
132     let v = Lvl1.find a i in
133     if v == a.Lvl1.dummy then Lvl2.dummy a.Lvl1.dummy
134     else Lvl2.find v j k
135
136
137   let dummy a = Lvl2.dummy a.Lvl1.dummy
138   let iteri f a =
139     let line = a.Lvl1.line in
140     if a.Lvl1.offset == ~-1 then () else
141       for i = 0 to Array.length line - 1 do
142         Lvl2.iteri (f i) line.(i)
143       done
144
145 end