aboutsummaryrefslogtreecommitdiff
blob: 5cb79f2247ab95f48cca26cf9e7adf1899da8522 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Index: ocaml/vine_cfg.mli
===================================================================
--- ocaml/vine_cfg.mli          (old version)
+++ ocaml/vine_cfg.mli          (new version)
@@ -86,6 +86,11 @@
     (** [cfg#iter_edges f] calls [f a b] forall [(a,b)] where there is an edge
 vine-1.0-from [a] to [b] in the CFG.  *)
 
+  method fold_edges : 'b. ('a bb -> 'a bb -> 'b -> 'b) -> 'b -> 'b
+    (** [cfg#fold_edges f init] computes [f uN uN (... (f u1 v1
+init)...)] where [(u1, v1) ... (uN, vN)] is an enumeration of all
+the edges in the graph, in an unspecified order. *)
+
   method get_info : 'a bb -> 'a
     (** Returns the info associated with the given bb. *)
 
@@ -225,6 +230,7 @@
   val iter_vertex : (bbid -> unit) -> t -> unit
   val fold_vertex : (vertex -> 'a -> 'a) -> t -> 'a -> 'a
   val iter_edges_e : (E.t -> unit) -> t -> unit
+  val fold_edges_e : (E.t -> 'a -> 'a) -> t -> 'a -> 'a
   val iter_succ : (vertex -> unit) -> t -> vertex -> unit
   val iter_pred : (vertex -> unit) -> t -> vertex -> unit
   val in_degree : t -> vertex -> int
Index: ocaml/vine_cfg.ml
===================================================================
--- ocaml/vine_cfg.ml             (old version)
+++ ocaml/vine_cfg.ml             (new version)
@@ -115,6 +115,7 @@
   method iter_bb : ('a bb -> unit) -> unit
   method fold_bb : 'b. ('a bb -> 'b -> 'b) -> 'b -> 'b
   method iter_edges : ('a bb -> 'a bb -> unit) -> unit
+  method fold_edges : 'b. ('a bb -> 'a bb -> 'b -> 'b) -> 'b -> 'b
   method get_info : 'a bb -> 'a
   method set_info : 'a bb -> 'a -> unit
   method get_id : 'a bb -> bbid
@@ -306,6 +307,14 @@
     self#iter_bb (fun b -> List.iter (f b) (self#succ b));
     self#check_graph;
 
+  method fold_edges f a =
+    self#check_graph;
+    let res = self#fold_bb
+      (fun b a2 -> List.fold_left (fun a3 b2 -> f b b2 a3) a2 (self#succ b)) a
+    in
+      self#check_graph;
+      res
+
   method length = Hashtbl.length blktbl
 
   method get_info b =
@@ -1122,6 +1131,7 @@
   val iter_vertex : (bbid -> unit) -> t -> unit
   val fold_vertex : (bbid -> 'a -> 'a) -> t -> 'a -> 'a
   val iter_edges_e : (E.t -> unit) -> t -> unit
+  val fold_edges_e : (E.t -> 'a -> 'a) -> t -> 'a -> 'a
   val iter_succ : (vertex -> unit) -> t -> vertex -> unit
   val iter_pred : (vertex -> unit) -> t -> vertex -> unit
   val in_degree : t -> vertex -> int
@@ -1170,6 +1180,8 @@
   let fold_vertex f (g:t) a = g#fold_bb (fun b -> f b.id) a 
   let iter_edges_e f (g:t) =
     g#iter_edges (fun x y -> f (g#get_id x, g#get_id y))
+  let fold_edges_e f (g:t) a =
+    g#fold_edges (fun x y a -> f (g#get_id x, g#get_id y) a) a
   let iter_succ f g v = List.iter f (bb_succ g v)
   let iter_pred f g v = List.iter f (bb_pred g v)
   let in_degree g v = List.length (bb_pred g v)