mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
refactor restoreTrailingLiteral use
This commit is contained in:
parent
7767651b59
commit
8741759c3a
@ -1821,6 +1821,25 @@ bool makeTransientFromLongLiteral(NGHolder &h, RoseInGraph &vg,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void restoreTrailingLiteralStates(NGHolder &g,
|
||||||
|
const vector<pair<ue2_literal, u32>> &lits) {
|
||||||
|
vector<NFAVertex> preds;
|
||||||
|
insert(&preds, preds.end(), inv_adjacent_vertices(g.accept, g));
|
||||||
|
clear_in_edges(g.accept, g);
|
||||||
|
|
||||||
|
for (auto v : preds) {
|
||||||
|
g[v].reports.clear(); /* clear report from old accepts */
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &p : lits) {
|
||||||
|
const ue2_literal &lit = p.first;
|
||||||
|
u32 delay = p.second;
|
||||||
|
|
||||||
|
restoreTrailingLiteralStates(g, lit, delay, preds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
bool improvePrefix(NGHolder &h, RoseInGraph &vg, const vector<RoseInEdge> &ee,
|
bool improvePrefix(NGHolder &h, RoseInGraph &vg, const vector<RoseInEdge> &ee,
|
||||||
const CompileContext &cc) {
|
const CompileContext &cc) {
|
||||||
@ -1900,27 +1919,18 @@ bool improvePrefix(NGHolder &h, RoseInGraph &vg, const vector<RoseInEdge> &ee,
|
|||||||
trimmed.clear();
|
trimmed.clear();
|
||||||
for (auto &elem : trimmed_vec) {
|
for (auto &elem : trimmed_vec) {
|
||||||
shared_ptr<NGHolder> &hp = elem.first;
|
shared_ptr<NGHolder> &hp = elem.first;
|
||||||
NGHolder &eh = *hp;
|
vector<pair<ue2_literal, u32>> succ_lits;
|
||||||
|
|
||||||
vector<NFAVertex> base_states;
|
|
||||||
insert(&base_states, base_states.end(),
|
|
||||||
inv_adjacent_vertices(eh.accept, eh));
|
|
||||||
clear_in_edges(eh.accept, eh);
|
|
||||||
|
|
||||||
for (auto v : base_states) {
|
|
||||||
eh[v].reports.clear(); /* clear report from old accepts */
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const auto &edge_delay : elem.second) {
|
for (const auto &edge_delay : elem.second) {
|
||||||
const RoseInEdge &e = edge_delay.first;
|
const RoseInEdge &e = edge_delay.first;
|
||||||
u32 delay = edge_delay.second;
|
u32 delay = edge_delay.second;
|
||||||
auto succ_lit = vg[target(e, vg)].s;
|
auto lit = vg[target(e, vg)].s;
|
||||||
|
|
||||||
vg[e].graph = hp;
|
vg[e].graph = hp;
|
||||||
assert(delay <= succ_lit.length());
|
assert(delay <= lit.length());
|
||||||
restoreTrailingLiteralStates(*vg[e].graph, succ_lit, delay,
|
succ_lits.emplace_back(lit, delay);
|
||||||
base_states);
|
|
||||||
}
|
}
|
||||||
|
restoreTrailingLiteralStates(*hp, succ_lits);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -2819,7 +2829,6 @@ bool doViolet(RoseBuild &rose, const NGHolder &h, bool prefilter,
|
|||||||
renumber_vertices(vg);
|
renumber_vertices(vg);
|
||||||
calcVertexOffsets(vg);
|
calcVertexOffsets(vg);
|
||||||
|
|
||||||
|
|
||||||
/* Step 5: avoid unimplementable, or overly large engines if possible */
|
/* Step 5: avoid unimplementable, or overly large engines if possible */
|
||||||
if (!ensureImplementable(rose, vg, last_chance, last_chance, rm, cc)) {
|
if (!ensureImplementable(rose, vg, last_chance, last_chance, rm, cc)) {
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user