mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-11-16 09:21:52 +03:00
util: switch from Boost to std::unordered set/map
This commit replaces the ue2::unordered_{set,map} types with their STL
versions, with some new hashing utilities in util/hash.h. The new types
ue2_unordered_set<T> and ue2_unordered_map<Key, T> default to using the
ue2_hasher.
The header util/ue2_containers.h has been removed, and the flat_set/map
containers moved to util/flat_containers.h.
This commit is contained in:
committed by
Matthew Barr
parent
a425bb9b7c
commit
9cf66b6ac9
@@ -53,12 +53,13 @@
|
||||
#include "util/charreach.h"
|
||||
#include "util/compile_context.h"
|
||||
#include "util/container.h"
|
||||
#include "util/flat_containers.h"
|
||||
#include "util/graph.h"
|
||||
#include "util/graph_range.h"
|
||||
#include "util/graph_small_color_map.h"
|
||||
#include "util/order_check.h"
|
||||
#include "util/unordered.h"
|
||||
#include "util/verify_types.h"
|
||||
#include "util/ue2_containers.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
@@ -97,16 +98,16 @@ struct precalcAccel {
|
||||
};
|
||||
|
||||
struct limex_accel_info {
|
||||
ue2::unordered_set<NFAVertex> accelerable;
|
||||
unordered_set<NFAVertex> accelerable;
|
||||
map<NFAStateSet, precalcAccel> precalc;
|
||||
ue2::unordered_map<NFAVertex, flat_set<NFAVertex>> friends;
|
||||
ue2::unordered_map<NFAVertex, AccelScheme> accel_map;
|
||||
unordered_map<NFAVertex, flat_set<NFAVertex>> friends;
|
||||
unordered_map<NFAVertex, AccelScheme> accel_map;
|
||||
};
|
||||
|
||||
static
|
||||
map<NFAVertex, NFAStateSet>
|
||||
reindexByStateId(const map<NFAVertex, NFAStateSet> &in, const NGHolder &g,
|
||||
const ue2::unordered_map<NFAVertex, u32> &state_ids,
|
||||
const unordered_map<NFAVertex, u32> &state_ids,
|
||||
const u32 num_states) {
|
||||
map<NFAVertex, NFAStateSet> out;
|
||||
|
||||
@@ -138,7 +139,7 @@ reindexByStateId(const map<NFAVertex, NFAStateSet> &in, const NGHolder &g,
|
||||
|
||||
struct build_info {
|
||||
build_info(NGHolder &hi,
|
||||
const ue2::unordered_map<NFAVertex, u32> &states_in,
|
||||
const unordered_map<NFAVertex, u32> &states_in,
|
||||
const vector<BoundedRepeatData> &ri,
|
||||
const map<NFAVertex, NFAStateSet> &rsmi,
|
||||
const map<NFAVertex, NFAStateSet> &smi,
|
||||
@@ -161,7 +162,7 @@ struct build_info {
|
||||
}
|
||||
|
||||
NGHolder &h;
|
||||
const ue2::unordered_map<NFAVertex, u32> &state_ids;
|
||||
const unordered_map<NFAVertex, u32> &state_ids;
|
||||
const vector<BoundedRepeatData> &repeats;
|
||||
|
||||
// Squash maps; state sets are indexed by state_id.
|
||||
@@ -169,7 +170,7 @@ struct build_info {
|
||||
map<NFAVertex, NFAStateSet> squashMap;
|
||||
|
||||
const map<u32, set<NFAVertex>> &tops;
|
||||
ue2::unordered_set<NFAVertex> tugs;
|
||||
unordered_set<NFAVertex> tugs;
|
||||
map<NFAVertex, BoundedRepeatSummary> br_cyclic;
|
||||
const set<NFAVertex> &zombies;
|
||||
bool do_accel;
|
||||
@@ -479,7 +480,7 @@ bool allow_wide_accel(const vector<NFAVertex> &vv, const NGHolder &g,
|
||||
static
|
||||
void nfaFindAccelSchemes(const NGHolder &g,
|
||||
const map<NFAVertex, BoundedRepeatSummary> &br_cyclic,
|
||||
ue2::unordered_map<NFAVertex, AccelScheme> *out) {
|
||||
unordered_map<NFAVertex, AccelScheme> *out) {
|
||||
vector<CharReach> refined_cr = reduced_cr(g, br_cyclic);
|
||||
|
||||
NFAVertex sds_or_proxy = get_sds_or_proxy(g);
|
||||
@@ -504,8 +505,8 @@ void nfaFindAccelSchemes(const NGHolder &g,
|
||||
}
|
||||
|
||||
struct fas_visitor : public boost::default_bfs_visitor {
|
||||
fas_visitor(const ue2::unordered_map<NFAVertex, AccelScheme> &am_in,
|
||||
ue2::unordered_map<NFAVertex, AccelScheme> *out_in)
|
||||
fas_visitor(const unordered_map<NFAVertex, AccelScheme> &am_in,
|
||||
unordered_map<NFAVertex, AccelScheme> *out_in)
|
||||
: accel_map(am_in), out(out_in) {}
|
||||
|
||||
void discover_vertex(NFAVertex v, const NGHolder &) {
|
||||
@@ -516,13 +517,13 @@ struct fas_visitor : public boost::default_bfs_visitor {
|
||||
throw this; /* done */
|
||||
}
|
||||
}
|
||||
const ue2::unordered_map<NFAVertex, AccelScheme> &accel_map;
|
||||
ue2::unordered_map<NFAVertex, AccelScheme> *out;
|
||||
const unordered_map<NFAVertex, AccelScheme> &accel_map;
|
||||
unordered_map<NFAVertex, AccelScheme> *out;
|
||||
};
|
||||
|
||||
static
|
||||
void filterAccelStates(NGHolder &g, const map<u32, set<NFAVertex>> &tops,
|
||||
ue2::unordered_map<NFAVertex, AccelScheme> *accel_map) {
|
||||
unordered_map<NFAVertex, AccelScheme> *accel_map) {
|
||||
/* We want the NFA_MAX_ACCEL_STATES best acceleration states, everything
|
||||
* else should be ditched. We use a simple BFS to choose accel states near
|
||||
* the start. */
|
||||
@@ -542,7 +543,7 @@ void filterAccelStates(NGHolder &g, const map<u32, set<NFAVertex>> &tops,
|
||||
tempEdges.push_back(e); // Remove edge later.
|
||||
}
|
||||
|
||||
ue2::unordered_map<NFAVertex, AccelScheme> out;
|
||||
unordered_map<NFAVertex, AccelScheme> out;
|
||||
|
||||
try {
|
||||
boost::breadth_first_search(g, g.start,
|
||||
@@ -982,16 +983,18 @@ u32 addSquashMask(const build_info &args, const NFAVertex &v,
|
||||
return idx;
|
||||
}
|
||||
|
||||
using ReportListCache = ue2_unordered_map<vector<ReportID>, u32>;
|
||||
|
||||
static
|
||||
u32 addReports(const flat_set<ReportID> &r, vector<ReportID> &reports,
|
||||
unordered_map<vector<ReportID>, u32> &reportListCache) {
|
||||
ReportListCache &reports_cache) {
|
||||
assert(!r.empty());
|
||||
|
||||
vector<ReportID> my_reports(begin(r), end(r));
|
||||
my_reports.push_back(MO_INVALID_IDX); // sentinel
|
||||
|
||||
auto cache_it = reportListCache.find(my_reports);
|
||||
if (cache_it != end(reportListCache)) {
|
||||
auto cache_it = reports_cache.find(my_reports);
|
||||
if (cache_it != end(reports_cache)) {
|
||||
u32 offset = cache_it->second;
|
||||
DEBUG_PRINTF("reusing cached report list at %u\n", offset);
|
||||
return offset;
|
||||
@@ -1007,13 +1010,12 @@ u32 addReports(const flat_set<ReportID> &r, vector<ReportID> &reports,
|
||||
|
||||
u32 offset = verify_u32(reports.size());
|
||||
insert(&reports, reports.end(), my_reports);
|
||||
reportListCache.emplace(move(my_reports), offset);
|
||||
reports_cache.emplace(move(my_reports), offset);
|
||||
return offset;
|
||||
}
|
||||
|
||||
static
|
||||
void buildAcceptsList(const build_info &args,
|
||||
unordered_map<vector<ReportID>, u32> &reports_cache,
|
||||
void buildAcceptsList(const build_info &args, ReportListCache &reports_cache,
|
||||
vector<NFAVertex> &verts, vector<NFAAccept> &accepts,
|
||||
vector<ReportID> &reports, vector<NFAStateSet> &squash) {
|
||||
if (verts.empty()) {
|
||||
@@ -1051,8 +1053,7 @@ void buildAcceptsList(const build_info &args,
|
||||
}
|
||||
|
||||
static
|
||||
void buildAccepts(const build_info &args,
|
||||
unordered_map<vector<ReportID>, u32> &reports_cache,
|
||||
void buildAccepts(const build_info &args, ReportListCache &reports_cache,
|
||||
NFAStateSet &acceptMask, NFAStateSet &acceptEodMask,
|
||||
vector<NFAAccept> &accepts, vector<NFAAccept> &acceptsEod,
|
||||
vector<ReportID> &reports, vector<NFAStateSet> &squash) {
|
||||
@@ -1119,7 +1120,7 @@ u32 uncompressedStateSize(u32 num_states) {
|
||||
|
||||
static
|
||||
u32 compressedStateSize(const NGHolder &h, const NFAStateSet &maskedStates,
|
||||
const ue2::unordered_map<NFAVertex, u32> &state_ids) {
|
||||
const unordered_map<NFAVertex, u32> &state_ids) {
|
||||
// Shrink state requirement to enough to fit the compressed largest reach.
|
||||
vector<u32> allreach(N_CHARS, 0);
|
||||
|
||||
@@ -1190,7 +1191,7 @@ bool hasSquashableInitDs(const build_info &args) {
|
||||
|
||||
static
|
||||
bool hasInitDsStates(const NGHolder &h,
|
||||
const ue2::unordered_map<NFAVertex, u32> &state_ids) {
|
||||
const unordered_map<NFAVertex, u32> &state_ids) {
|
||||
if (state_ids.at(h.startDs) != NO_STATE) {
|
||||
return true;
|
||||
}
|
||||
@@ -1358,17 +1359,16 @@ struct ExceptionProto {
|
||||
};
|
||||
|
||||
static
|
||||
u32 buildExceptionMap(const build_info &args,
|
||||
unordered_map<vector<ReportID>, u32> &reports_cache,
|
||||
const ue2::unordered_set<NFAEdge> &exceptional,
|
||||
u32 buildExceptionMap(const build_info &args, ReportListCache &reports_cache,
|
||||
const unordered_set<NFAEdge> &exceptional,
|
||||
map<ExceptionProto, vector<u32>> &exceptionMap,
|
||||
vector<ReportID> &reportList) {
|
||||
const NGHolder &h = args.h;
|
||||
const u32 num_states = args.num_states;
|
||||
u32 exceptionCount = 0;
|
||||
|
||||
ue2::unordered_map<NFAVertex, u32> pos_trigger;
|
||||
ue2::unordered_map<NFAVertex, u32> tug_trigger;
|
||||
unordered_map<NFAVertex, u32> pos_trigger;
|
||||
unordered_map<NFAVertex, u32> tug_trigger;
|
||||
|
||||
for (u32 i = 0; i < args.repeats.size(); i++) {
|
||||
const BoundedRepeatData &br = args.repeats[i];
|
||||
@@ -1893,7 +1893,7 @@ struct Factory {
|
||||
|
||||
static
|
||||
void findExceptionalTransitions(const build_info &args,
|
||||
ue2::unordered_set<NFAEdge> &exceptional,
|
||||
unordered_set<NFAEdge> &exceptional,
|
||||
u32 maxShift) {
|
||||
const NGHolder &h = args.h;
|
||||
|
||||
@@ -2168,9 +2168,9 @@ struct Factory {
|
||||
|
||||
// We track report lists that have already been written into the global
|
||||
// list in case we can reuse them.
|
||||
unordered_map<vector<ReportID>, u32> reports_cache;
|
||||
ReportListCache reports_cache;
|
||||
|
||||
ue2::unordered_set<NFAEdge> exceptional;
|
||||
unordered_set<NFAEdge> exceptional;
|
||||
u32 shiftCount = findBestNumOfVarShifts(args);
|
||||
assert(shiftCount);
|
||||
u32 maxShift = findMaxVarShift(args, shiftCount);
|
||||
@@ -2374,10 +2374,10 @@ MAKE_LIMEX_TRAITS(512)
|
||||
// Some sanity tests, called by an assertion in generate().
|
||||
static UNUSED
|
||||
bool isSane(const NGHolder &h, const map<u32, set<NFAVertex>> &tops,
|
||||
const ue2::unordered_map<NFAVertex, u32> &state_ids,
|
||||
const unordered_map<NFAVertex, u32> &state_ids,
|
||||
u32 num_states) {
|
||||
ue2::unordered_set<u32> seen;
|
||||
ue2::unordered_set<NFAVertex> top_starts;
|
||||
unordered_set<u32> seen;
|
||||
unordered_set<NFAVertex> top_starts;
|
||||
for (const auto &vv : tops | map_values) {
|
||||
insert(&top_starts, vv);
|
||||
}
|
||||
@@ -2424,7 +2424,7 @@ bool isSane(const NGHolder &h, const map<u32, set<NFAVertex>> &tops,
|
||||
#endif // NDEBUG
|
||||
|
||||
static
|
||||
u32 max_state(const ue2::unordered_map<NFAVertex, u32> &state_ids) {
|
||||
u32 max_state(const unordered_map<NFAVertex, u32> &state_ids) {
|
||||
u32 rv = 0;
|
||||
for (const auto &m : state_ids) {
|
||||
DEBUG_PRINTF("state %u\n", m.second);
|
||||
@@ -2437,7 +2437,7 @@ u32 max_state(const ue2::unordered_map<NFAVertex, u32> &state_ids) {
|
||||
}
|
||||
|
||||
bytecode_ptr<NFA> generate(NGHolder &h,
|
||||
const ue2::unordered_map<NFAVertex, u32> &states,
|
||||
const unordered_map<NFAVertex, u32> &states,
|
||||
const vector<BoundedRepeatData> &repeats,
|
||||
const map<NFAVertex, NFAStateSet> &reportSquashMap,
|
||||
const map<NFAVertex, NFAStateSet> &squashMap,
|
||||
@@ -2507,7 +2507,7 @@ bytecode_ptr<NFA> generate(NGHolder &h,
|
||||
}
|
||||
|
||||
u32 countAccelStates(NGHolder &h,
|
||||
const ue2::unordered_map<NFAVertex, u32> &states,
|
||||
const unordered_map<NFAVertex, u32> &states,
|
||||
const vector<BoundedRepeatData> &repeats,
|
||||
const map<NFAVertex, NFAStateSet> &reportSquashMap,
|
||||
const map<NFAVertex, NFAStateSet> &squashMap,
|
||||
|
||||
Reference in New Issue
Block a user