+(* let _ = Printf.eprintf "Lenght before merging is %i %i\n"
+ (List.length t1.segments) (List.length t2.segments)
+ in *)
+ match t1.segments,t2.segments with
+ [],[] -> if mark then cons elt empty else empty
+ | [_],[] when rb1 -> if mark then cons elt t1 else t1
+ | [], [_] when rb2 -> if mark then cons elt t2 else t2
+ | [_],[_] when rb1 && rb2 -> if mark then cons elt empty else
+ concat t1 t2
+ | _ ->
+ let t1 = if rb1 then t1 else clear_bits t1
+ and t2 = if rb2 then t2 else clear_bits t2
+ in
+ (if mark then cons elt (concat t1 t2)
+ else concat t1 t2)
+ else
+ let _ = clear_bits t1 in
+ clear_bits t2
+
+ let merge conf t t1 t2 =
+ match t1.segments,t2.segments,conf with
+ | _,_,NO -> let _ = clear_bits t1 in clear_bits t2
+ | [],[],(MARK1|MARK2|MARK12|MARK) -> cons t empty
+ | [],[],_ -> empty
+ | [_],[],(ONLY1|ONLY12) -> t1
+ | [_],[],(MARK1|MARK12) -> cons t t1
+ | [],[_],(ONLY2|ONLY12) -> t2
+ | [],[_],(MARK2|MARK12) -> cons t t2
+ | [_],[_],ONLY12 -> concat t1 t2
+ | [_],[_],MARK12 -> cons t empty
+ | _,_,MARK -> let _ = clear_bits t2 in cons t (clear_bits t1)
+ | _,_,ONLY1 -> let _ = clear_bits t2 in t1
+ | _,_,ONLY2 -> let _ = clear_bits t1 in t2
+ | _,_,ONLY12 -> concat t1 t2
+ | _,_,MARK1 -> let _ = clear_bits t2 in cons t t1
+ | _,_,MARK2 -> let _ = clear_bits t1 in cons t t2
+ | _,_,MARK12 -> cons t (concat t1 t2)
+
+ let mk_quick_tag_loop _ sl ss tree tag = ();
+ fun t _ ->
+ let res = empty in
+ let first = set_tag_bits empty.bits tag tree t in
+ let res =
+ if first == Tree.nil then res else
+ cons first res