]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
accel_dfa_build_strat: use small_vector for paths
authorJustin Viiret <justin.viiret@intel.com>
Mon, 10 Apr 2017 01:05:06 +0000 (11:05 +1000)
committerMatthew Barr <matthew.barr@intel.com>
Tue, 30 May 2017 03:49:49 +0000 (13:49 +1000)
src/nfa/accel_dfa_build_strat.cpp
src/util/dump_charclass.cpp
src/util/dump_charclass.h

index 4bd83a52dabff563506a3462a62e4787bdcaf92e..2320c756b156f70eee30a465c689e0d10ae70255 100644 (file)
 #include "nfagraph/ng_limex_accel.h"
 #include "shufticompile.h"
 #include "trufflecompile.h"
+#include "util/accel_scheme.h"
 #include "util/charreach.h"
 #include "util/container.h"
 #include "util/dump_charclass.h"
+#include "util/small_vector.h"
 #include "util/verify_types.h"
 
 #include <sstream>
@@ -49,16 +51,15 @@ namespace ue2 {
 
 namespace {
 struct path {
-    vector<CharReach> reach;
+    small_vector<CharReach, MAX_ACCEL_DEPTH + 1> reach;
     dstate_id_t dest = DEAD_STATE;
-    explicit path(dstate_id_t base) : dest(base) {
-    }
+    explicit path(dstate_id_t base) : dest(base) {}
 };
 };
 
-static
-void dump_paths(const vector<path> &paths) {
-    for (UNUSED const auto &p : paths) {
+template<typename Container>
+void dump_paths(const Container &paths) {
+    for (UNUSED const path &p : paths) {
         DEBUG_PRINTF("[%s] -> %u\n", describeClasses(p.reach).c_str(), p.dest);
     }
     DEBUG_PRINTF("%zu paths\n", paths.size());
@@ -113,14 +114,14 @@ void extend(const raw_dfa &rdfa, const path &p,
         } else {
             path pp = append(p, CharReach(), p.dest);
             all[p.dest].push_back(pp);
-            out.push_back(pp);
+            out.push_back(move(pp));
         }
     }
 
     if (!s.reports_eod.empty()) {
         path pp = append(p, CharReach(), p.dest);
         all[p.dest].push_back(pp);
-        out.push_back(pp);
+        out.push_back(move(pp));
     }
 
     map<u32, CharReach> dest;
@@ -140,7 +141,7 @@ void extend(const raw_dfa &rdfa, const path &p,
         DEBUG_PRINTF("----good: [%s] -> %u\n",
                      describeClasses(pp.reach).c_str(), pp.dest);
         all[e.first].push_back(pp);
-        out.push_back(pp);
+        out.push_back(move(pp));
     }
 }
 
@@ -162,8 +163,10 @@ vector<vector<CharReach>> generate_paths(const raw_dfa &rdfa,
     dump_paths(paths);
 
     vector<vector<CharReach>> rv;
+    rv.reserve(paths.size());
     for (auto &p : paths) {
-        rv.push_back(move(p.reach));
+        rv.push_back(vector<CharReach>(std::make_move_iterator(p.reach.begin()),
+                                       std::make_move_iterator(p.reach.end())));
     }
     return rv;
 }
index 4c159ec2466a3d56dc61a5e180809c10c99fdb4b..4535777d14706497da05cf05915c7771f110fd00 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016, Intel Corporation
+ * Copyright (c) 2015-2017, Intel Corporation
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -249,15 +249,6 @@ string describeClass(const CharReach &cr, size_t maxLength,
     return oss.str();
 }
 
-string describeClasses(const std::vector<CharReach> &v, size_t maxClassLength,
-                       enum cc_output_t out_type) {
-    std::ostringstream oss;
-    for (const auto &cr : v) {
-        describeClass(oss, cr, maxClassLength, out_type);
-    }
-    return oss.str();
-}
-
 // C stdio wrapper
 void describeClass(FILE *f, const CharReach &cr, size_t maxLength,
                    enum cc_output_t out_type) {
index 45b707f1e001a8703750ea216ed04f6d6e5454ee..999641340a720c5df53979b1821fdf08d0e740d2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016, Intel Corporation
+ * Copyright (c) 2015-2017, Intel Corporation
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -37,6 +37,7 @@
 
 #include <cstdio>
 #include <ostream>
+#include <sstream>
 #include <string>
 #include <vector>
 
@@ -55,9 +56,16 @@ void describeClass(std::ostream &os, const CharReach &cr, size_t maxLength = 16,
 std::string describeClass(const CharReach &cr, size_t maxLength = 16,
                           enum cc_output_t out_type = CC_OUT_TEXT);
 
-std::string describeClasses(const std::vector<CharReach> &v,
+template<typename Container>
+std::string describeClasses(const Container &container,
                             size_t maxClassLength = 16,
-                            enum cc_output_t out_type = CC_OUT_TEXT);
+                            enum cc_output_t out_type = CC_OUT_TEXT) {
+    std::ostringstream oss;
+    for (const CharReach &cr : container) {
+        describeClass(oss, cr, maxClassLength, out_type);
+    }
+    return oss.str();
+}
 
 void describeClass(FILE *f, const CharReach &cr, size_t maxLength,
                    enum cc_output_t out_type);