]> matita.cs.unibo.it Git - helm.git/commitdiff
get_childNodes no longer used ==> major performance speed-up
authorClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Fri, 5 Sep 2003 17:33:04 +0000 (17:33 +0000)
committerClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Fri, 5 Sep 2003 17:33:04 +0000 (17:33 +0000)
helm/gTopLevel/xmlDiff.ml

index 307e02ac0db8c325fd45b0b5ebb3158a89118a3c..2b9806c44b2de0f3c39ca40c88af25b0f9d3e71d 100644 (file)
@@ -97,6 +97,18 @@ prerr_endline ("@@@ find_mstylable_node salgo da  " ^ match n#get_localName with
     highlighter
 ;;
 
+let iter_children ~f (n:Gdome.node) =
+ let rec aux =
+  function
+     None -> ()
+   | Some n ->
+      let sibling = n#get_nextSibling in
+       (f n) ;
+       aux sibling
+ in
+  aux n#get_firstChild
+;;
+
 let highlight_nodes ~xrefs (doc:Gdome.document) =
  let highlighted = ref [] in
  let rec aux (n:Gdome.element) =
@@ -109,14 +121,10 @@ let highlight_nodes ~xrefs (doc:Gdome.document) =
    highlighted :=
     (highlight_node ~color:"#00ff00"(* light green *) doc (n :> Gdome.node))::
     !highlighted ;
-  let children = n#get_childNodes in
-   for i = 0 to children#get_length - 1 do
-    match children#item i with
-       None -> assert false
-     | Some n ->
-        if n#get_nodeType = GdomeNodeTypeT.ELEMENT_NODE then
-         aux (new Gdome.element_of_node n)
-   done
+   iter_children (n :> Gdome.node)
+    ~f:(function n ->
+         if n#get_nodeType = GdomeNodeTypeT.ELEMENT_NODE then
+          aux (new Gdome.element_of_node n))
  in
   aux doc#get_documentElement ;
   !highlighted
@@ -285,8 +293,10 @@ prerr_endline !debugs ;
               done
           | _,_ -> assert false
         end ;
+(* debugging only
         let fchildren = f#get_childNodes in
         let tchildren = t#get_childNodes in
+*)
          let rec dumb_diff =
           function
              [],[] -> ()
@@ -306,31 +316,33 @@ prerr_endline ("XML_DIFF: appendo i nodi residui " ^ String.concat ", " (List.ma
 prerr_endline ("XML_DIFF: cancello i nodi residui " ^ String.concat ", " (List.map (function n ->  match n#get_localName with Some s -> s#to_string | None -> "_") tl1)) ;
               List.iter (function n -> ignore (f#removeChild n)) tl1
          in
-          let node_list_of_nodeList nl =
-           let rec aux =
-            match nl#item ~index:i with
+          let node_list_of_nodeList n =
+           let rec aux =
+            function
                None -> []
              | Some n when
                    n#get_nodeType = GdomeNodeTypeT.ELEMENT_NODE
                 or n#get_nodeType = GdomeNodeTypeT.TEXT_NODE ->
-                 n::(aux (i+1))
+                 n::(aux n#get_nextSibling)
              | Some n ->
 prerr_endline ("XML_DIFF: mi sto perdendo i nodi di tipo " ^ string_of_int (Obj.magic n#get_nodeType)) ;
-               aux (i+1)
+               aux n#get_nextSibling
            in
-            aux 0
+            aux n#get_firstChild
           in
+(* debugging stuff only
 for i = 0 to fchildren#get_length - 1 do
 match fchildren#item i with
 None -> prerr_endline "EUREKA: ma siamo matti?"
 |Some n ->
 match n#get_nodeType with GdomeNodeTypeT.ATTRIBUTE_NODE -> prerr_endline "EUREKA attr" | GdomeNodeTypeT.CDATA_SECTION_NODE -> prerr_endline "EUREKA text" | GdomeNodeTypeT.DOCUMENT_FRAGMENT_NODE -> prerr_endline "EUREKA document fragment" | _ -> prerr_endline ("EUREKA " ^ string_of_int (Obj.magic n#get_nodeType))
 done ;
-prerr_endline("XML_DIFF: from ha " ^ string_of_int fchildren#get_length ^ " nodi, ovvero " ^ string_of_int (List.length (node_list_of_nodeList fchildren)) ^ " figli");
-prerr_endline("XML_DIFF: to   ha " ^ string_of_int tchildren#get_length ^ " nodi, ovvero " ^ string_of_int (List.length (node_list_of_nodeList tchildren)) ^ " figli");
+prerr_endline("XML_DIFF: from ha " ^ string_of_int fchildren#get_length ^ " nodi, ovvero " ^ string_of_int (List.length (node_list_of_nodeList f)) ^ " figli");
+prerr_endline("XML_DIFF: to   ha " ^ string_of_int tchildren#get_length ^ " nodi, ovvero " ^ string_of_int (List.length (node_list_of_nodeList t)) ^ " figli");
 prerr_endline ("XML_DIFF: chiamo dumb_diff su " ^ String.concat ", " (List.map (function n ->  match n#get_localName with Some s -> s#to_string | None -> "_") (node_list_of_nodeList fchildren)) ^ " e " ^ String.concat ", " (List.map (function n ->  match n#get_localName with Some s -> s#to_string | None -> "_") (node_list_of_nodeList tchildren))) ;
+*)
            dumb_diff
-            (node_list_of_nodeList fchildren, node_list_of_nodeList tchildren)
+            (node_list_of_nodeList f, node_list_of_nodeList t)
    | t1,t2,_,_,_,_ when
       (t1 = GdomeNodeTypeT.ELEMENT_NODE || t1 = GdomeNodeTypeT.TEXT_NODE) &&
       (t2 = GdomeNodeTypeT.ELEMENT_NODE || t2 = GdomeNodeTypeT.TEXT_NODE) ->