From 8741759c3a15c8a3893a1c08fe5b39c7c7424735 Mon Sep 17 00:00:00 2001 From: Alex Coyte Date: Wed, 4 Jan 2017 11:41:59 +1100 Subject: [PATCH] refactor restoreTrailingLiteral use --- src/nfagraph/ng_violet.cpp | 39 +++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) 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;