From: Alex Coyte Date: Wed, 4 Jan 2017 00:41:59 +0000 (+1100) Subject: refactor restoreTrailingLiteral use X-Git-Tag: v4.5.0^2~283 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8741759c3a15c8a3893a1c08fe5b39c7c7424735;p=thirdparty%2Fvectorscan.git refactor restoreTrailingLiteral use --- diff --git a/src/nfagraph/ng_violet.cpp b/src/nfagraph/ng_violet.cpp index 0dc010ea..715c5b5c 100644 --- a/src/nfagraph/ng_violet.cpp +++ b/src/nfagraph/ng_violet.cpp @@ -1821,6 +1821,25 @@ bool makeTransientFromLongLiteral(NGHolder &h, RoseInGraph &vg, return true; } +static +void restoreTrailingLiteralStates(NGHolder &g, + const vector> &lits) { + vector 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 bool improvePrefix(NGHolder &h, RoseInGraph &vg, const vector &ee, const CompileContext &cc) { @@ -1900,27 +1919,18 @@ bool improvePrefix(NGHolder &h, RoseInGraph &vg, const vector &ee, trimmed.clear(); for (auto &elem : trimmed_vec) { shared_ptr &hp = elem.first; - NGHolder &eh = *hp; - - vector 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 */ - } + vector> succ_lits; for (const auto &edge_delay : elem.second) { const RoseInEdge &e = edge_delay.first; u32 delay = edge_delay.second; - auto succ_lit = vg[target(e, vg)].s; + auto lit = vg[target(e, vg)].s; vg[e].graph = hp; - assert(delay <= succ_lit.length()); - restoreTrailingLiteralStates(*vg[e].graph, succ_lit, delay, - base_states); + assert(delay <= lit.length()); + succ_lits.emplace_back(lit, delay); } + restoreTrailingLiteralStates(*hp, succ_lits); } return true; } @@ -2819,7 +2829,6 @@ bool doViolet(RoseBuild &rose, const NGHolder &h, bool prefilter, renumber_vertices(vg); calcVertexOffsets(vg); - /* Step 5: avoid unimplementable, or overly large engines if possible */ if (!ensureImplementable(rose, vg, last_chance, last_chance, rm, cc)) { return false;