limex_compile: turn tugs into a bitset

This commit is contained in:
Justin Viiret 2017-07-14 12:54:03 +10:00 committed by Matthew Barr
parent 1f2eb5a093
commit 58004f15f0

View File

@ -144,13 +144,15 @@ struct build_info {
const map<NFAVertex, NFAStateSet> &rsmi, const map<NFAVertex, NFAStateSet> &rsmi,
const map<NFAVertex, NFAStateSet> &smi, const map<NFAVertex, NFAStateSet> &smi,
const map<u32, set<NFAVertex>> &ti, const set<NFAVertex> &zi, const map<u32, set<NFAVertex>> &ti, const set<NFAVertex> &zi,
bool dai, bool sci, const CompileContext &cci, bool dai, bool sci, const CompileContext &cci, u32 nsi)
u32 nsi) : h(hi), state_ids(states_in), repeats(ri), tops(ti), tugs(nsi),
: h(hi), state_ids(states_in), repeats(ri), tops(ti), zombies(zi), zombies(zi), do_accel(dai), stateCompression(sci), cc(cci),
do_accel(dai), stateCompression(sci), cc(cci),
num_states(nsi) { num_states(nsi) {
for (const auto &br : repeats) { for (const auto &br : repeats) {
insert(&tugs, br.tug_triggers); for (auto v : br.tug_triggers) {
assert(state_ids.at(v) != NO_STATE);
tugs.set(state_ids.at(v));
}
br_cyclic[br.cyclic] = br_cyclic[br.cyclic] =
BoundedRepeatSummary(br.repeatMin, br.repeatMax); BoundedRepeatSummary(br.repeatMin, br.repeatMax);
} }
@ -170,7 +172,7 @@ struct build_info {
map<NFAVertex, NFAStateSet> squashMap; map<NFAVertex, NFAStateSet> squashMap;
const map<u32, set<NFAVertex>> &tops; const map<u32, set<NFAVertex>> &tops;
unordered_set<NFAVertex> tugs; NFAStateSet tugs;
map<NFAVertex, BoundedRepeatSummary> br_cyclic; map<NFAVertex, BoundedRepeatSummary> br_cyclic;
const set<NFAVertex> &zombies; const set<NFAVertex> &zombies;
bool do_accel; bool do_accel;
@ -1528,7 +1530,7 @@ bool isExceptionalTransition(const NGHolder &h, const NFAEdge &e,
} }
// All transitions out of a tug trigger are exceptional. // All transitions out of a tug trigger are exceptional.
if (contains(args.tugs, from)) { if (args.tugs.test(f)) {
return true; return true;
} }
return false; return false;
@ -1845,10 +1847,9 @@ struct Factory {
maskSetBit(limex->repeatCyclicMask, cyclic); maskSetBit(limex->repeatCyclicMask, cyclic);
} }
/* also include tugs in repeat cyclic mask */ /* also include tugs in repeat cyclic mask */
for (NFAVertex v : args.tugs) { for (size_t i = args.tugs.find_first(); i != args.tugs.npos;
u32 v_state = args.state_ids.at(v); i = args.tugs.find_next(i)) {
assert(v_state != NO_STATE); maskSetBit(limex->repeatCyclicMask, i);
maskSetBit(limex->repeatCyclicMask, v_state);
} }
} }