]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
ng_violet: det. vertex ordering in splitRoseEdge
authorJustin Viiret <justin.viiret@intel.com>
Thu, 21 Jul 2016 04:22:05 +0000 (14:22 +1000)
committerMatthew Barr <matthew.barr@intel.com>
Wed, 10 Aug 2016 05:06:43 +0000 (15:06 +1000)
src/nfagraph/ng_violet.cpp

index 3c79dbc38af862b2896d526fd5596a270b2754ac..27f58d0a8166f23b50671edf881382d915bdcf6e 100644 (file)
@@ -1007,20 +1007,24 @@ bool splitRoseEdge(const NGHolder &base_graph, RoseInGraph &vg,
         insert(&splitter_reports, base_graph[v].reports);
     }
 
-    /* find the targets of each source vertex */
-    map<RoseInVertex, flat_set<RoseInVertex> > images;
+    /* find the targets of each source vertex; note the use of vectors to
+     * preserve deterministic ordering */
+    vector<RoseInVertex> sources;
+    map<RoseInVertex, vector<RoseInVertex>> images;
     for (const RoseInEdge &e : ee) {
         RoseInVertex src = source(e, vg);
         RoseInVertex dest = target(e, vg);
-        images[src].insert(dest);
+        if (!contains(images, src)) {
+            sources.push_back(src);
+        }
+        images[src].push_back(dest);
         remove_edge(e, vg);
     }
 
-    map<flat_set<RoseInVertex>, vector<RoseInVertex> > verts_by_image;
+    map<vector<RoseInVertex>, vector<RoseInVertex>> verts_by_image;
 
-    for (const auto &elem : images) {
-        RoseInVertex u = elem.first;
-        const auto &image = elem.second;
+    for (const auto &u : sources) {
+        const auto &image = images[u];
 
         if (contains(verts_by_image, image)) {
             for (RoseInVertex v : verts_by_image[image]) {