#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>
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());
} 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;
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));
}
}
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;
}
/*
- * 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:
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) {
/*
- * 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:
#include <cstdio>
#include <ostream>
+#include <sstream>
#include <string>
#include <vector>
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);