module GResult(Doc : sig val doc : Tree.t end) = struct
type bits
type elt = [` Tree] Tree.node
- external create_empty : int -> bits = "caml_result_set_create"
- external set : bits -> int -> unit = "caml_result_set_set"
- external next : bits -> int -> int = "caml_result_set_next"
- external count : bits -> int = "caml_result_set_count"
- external clear : bits -> elt -> elt -> unit = "caml_result_set_clear"
+ external create_empty : int -> bits = "caml_result_set_create" "noalloc"
+ external set : bits -> int -> unit = "caml_result_set_set" "noalloc"
+ external next : bits -> int -> int = "caml_result_set_next" "noalloc"
+ external count : bits -> int = "caml_result_set_count" "noalloc"
+ external clear : bits -> elt -> elt -> unit = "caml_result_set_clear" "noalloc"
- external set_tag_bits : bits -> Tag.t -> Tree.t -> elt -> elt = "caml_set_tag_bits"
+ external set_tag_bits : bits -> Tag.t -> Tree.t -> elt -> elt = "caml_set_tag_bits" "noalloc"
type t =
{ segments : elt list;
bits : bits;
(fun t _ -> eval_fold2_slist fl_list t (Tree.tag tree t) empty_res empty_res)
| _,`NIL -> (
match f_kind with
- |`TAG(tag') ->
+ (*|`TAG(tag') ->
let default = fun t _ -> eval_fold2_slist fl_list t (Tree.tag tree t) empty_res
(loop_tag tag' (first t) llist t )
- in
+ in default (*
let cf = SList.hd llist in
if (slot_size == 1) && StateSet.is_singleton cf
then
then
RS.mk_quick_tag_loop default llist 1 tree tag'
else default
- else default
+ else default *) *)
| _ ->
(fun t _ -> eval_fold2_slist fl_list t (Tree.tag tree t) empty_res
(loop (first t) llist t ))
| `NIL,_ -> (
match n_kind with
|`TAG(tag') ->
- (*if SList.equal rlist slist && tag == tag' then
+ if SList.equal rlist slist && tag == tag' then
let rec loop t ctx =
if t == Tree.nil then empty_res else
let res2 = loop (next t ctx) ctx in
eval_fold2_slist fl_list t tag res2 empty_res
in loop
- else *)
+ else
(fun t ctx -> eval_fold2_slist fl_list t (Tree.tag tree t)
(loop_tag tag' (next t ctx) rlist ctx ) empty_res)
\r
{ int answ;\r
if (!getBit(tree,pos)) return -1; // no answer\r
- pot--;\r
pos = (pos<<1)+1;\r
if (pos >= n) return 0; // when n is not a power of 2, missing leaves\r
+ pot--;\r
if ((p>>pot) == 0) // p goes left\r
{ answ = nextLarger(tree,n,p&~(1<<pot),pos,pot);\r
if (answ != -1) return answ;\r
let tag t n = if n == nil then Tag.nullt else tree_tag t.doc n
-let tagged_descendant t tag = (); fun n -> tree_tagged_descendant t.doc n tag
+let tagged_descendant t tag =
+ let doc = t.doc in (); fun n -> tree_tagged_descendant doc n tag
let select_descendant t = fun ts ->
let v = (ptset_to_vector ts) in ();
fun n -> tree_select_descendant t.doc n v
-let tagged_following_below t tag = (); fun n ctx -> tree_tagged_following_below t.doc n tag ctx
+let tagged_following_below t tag =
+ let doc = t.doc in
+ (); fun n ctx -> tree_tagged_following_below doc n tag ctx
let select_following_below t = fun ts ->
let v = (ptset_to_vector ts) in ();