]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
getSuccessors: reuse a vector<State> for output
authorJustin Viiret <justin.viiret@intel.com>
Wed, 8 Mar 2017 04:46:25 +0000 (15:46 +1100)
committerMatthew Barr <matthew.barr@intel.com>
Wed, 26 Apr 2017 05:17:03 +0000 (15:17 +1000)
util/ng_find_matches.cpp

index 8c48081f4fe6b90a64e43a90ed787c0cc919b8c0..9c1cce60cdaf26e6db5388c9b1dc916cc7fca3b6 100644 (file)
@@ -638,8 +638,9 @@ struct StateSet {
     }
 
     // does not return SOM
-    flat_set<State> getSuccessors(const State &state, const GraphCache &gc) const {
-        flat_set<State> result;
+    void getSuccessors(const State &state, const GraphCache &gc,
+                       vector<State> &result) const {
+        result.clear();
 
         // maximum shadow depth that we can go from current level
         u32 max_depth = edit_distance - state.level + 1;
@@ -650,7 +651,7 @@ struct StateSet {
                  id != shadow_succ.npos;
                  id = shadow_succ.find_next(id)) {
                 auto new_level = state.level + d;
-                result.emplace(id, new_level, 0, State::NODE_SHADOW);
+                result.emplace_back(id, new_level, 0, State::NODE_SHADOW);
             }
 
             const auto &helper_succ = gc.getHelperTransitions(state.idx, d);
@@ -658,11 +659,11 @@ struct StateSet {
                  id != helper_succ.npos;
                  id = helper_succ.find_next(id)) {
                 auto new_level = state.level + d;
-                result.emplace(id, new_level, 0, State::NODE_HELPER);
+                result.emplace_back(id, new_level, 0, State::NODE_HELPER);
             }
         }
 
-        return result;
+        sort_and_unique(result);
     }
 
     flat_set<State> getAcceptStates(const GraphCache &gc) const {
@@ -919,9 +920,11 @@ void step(const NGHolder &g, struct fmstate &state) {
 
     const auto active = state.states.getActiveStates();
 
+    vector<StateSet::State> succ_list;
+
     for (const auto &cur : active) {
         auto u = state.vertices[cur.idx];
-        auto succ_list = state.states.getSuccessors(cur, state.gc);
+        state.states.getSuccessors(cur, state.gc, succ_list);
 
         for (auto succ : succ_list) {
             auto v = state.vertices[succ.idx];