type cell = { node : node;
mutable next : cell }
+type iterator = cell
type t = { mutable length : int;
mutable head : cell;
let length l = l.length
-
+let is_empty l = l.head == nil
let add n l =
let ncell = { node = n;
next = nil }
in
- if l.last == nil then
- { length = 1;
- head = ncell;
- last = ncell }
- else
- let () = l.last.next <- ncell in
- { length = l.length + 1;
- head = l.head;
- last = ncell }
+ if l.head == nil then begin
+ l.head <- ncell;
+ l.last <- ncell;
+ l.length <- 1
+ end else begin
+ l.last.next <- ncell;
+ l.last <- ncell;
+ l.length <- l.length + 1
+ end
+
+let push_back n l = add n l
+let push_front n l =
+ let ncell = { node = n;
+ next = l.head }
+ in
+ if l.head == nil then begin
+ l.head <- ncell;
+ l.last <- ncell;
+ l.length <- 1;
+ end else begin
+ l.head <- ncell;
+ l.length <- l.length + 1;
+ end
+
+let head l = l.head
+let last l = l.last
+let next i = i.next
+let value i = i.node
+let finished i = i == nil
+
+let copy l =
+ let rec loop l2 i =
+ if finished i then l2 else begin
+ add (value i) l2;
+ loop l2 (next i)
+ end
+ in
+ loop (create ()) (head l)
sig
type node
type t
+ type iterator
val create : unit -> t
- val add : node -> t -> t
+ val add : node -> t -> unit
+ val push_front : node -> t -> unit
+ val push_back : node -> t -> unit
val iter : (node -> unit) -> t -> unit
val length : t -> int
+ val is_empty : t -> bool
+ val head : t -> iterator
+ val last : t -> iterator
+ val next : iterator -> iterator
+ val value : iterator -> node
+ val finished : iterator -> bool
+ val copy : t -> t
end
let auto = run.auto in
let tree = run.tree in
let sel_states = Ata.get_selecting_states auto in
- let res = ref (L.create ()) in
+ let res = L.create () in
let rec loop node =
if node != T.nil then begin
if StateSet.intersect sel_states cache.(T.preorder tree node) then
- res := L.add node !res;
+ L.push_back node res;
loop (T.first_child tree node);
loop (T.next_sibling tree node)
end
in
loop (T.root tree);
- !res
+ res
let get_full_results run =
StateSet.iter
(fun q ->
let res = Cache.N1.find res_mapper (q :> int) in
- if res != dummy then
- Cache.N1.add res_mapper (q :> int) (L.add node res)
+ if res != dummy then L.add node res
)
cache.(T.preorder tree node);
loop (T.first_child tree node);
let module Naive = Run.Make(Naive_tree)(Naive_node_list) in
let result_list =
-
- let root = Naive_node_list.(add (Naive_tree.root doc) (create())) in
+ let root = Naive_node_list.create () in
+ let () = Naive_node_list.add (Naive_tree.root doc) root in
let f, msg =
match !Options.parallel, !Options.compose with
true, true ->