Wrap MPV puffettes in a struct

This commit is contained in:
Justin Viiret 2016-04-15 15:28:23 +10:00 committed by Matthew Barr
parent ac31841214
commit fa27025bcb
4 changed files with 26 additions and 17 deletions

View File

@ -1780,7 +1780,7 @@ bool RoseBuildImpl::addOutfix(const raw_puff &rp) {
mpv_outfix->chained = true; mpv_outfix->chained = true;
} }
mpv_outfix->puffettes.push_back(rp); mpv_outfix->mpv.puffettes.push_back(rp);
mpv_outfix->maxBAWidth = ROSE_BOUND_INF; /* not ba */ mpv_outfix->maxBAWidth = ROSE_BOUND_INF; /* not ba */
mpv_outfix->minWidth = min(mpv_outfix->minWidth, depth(rp.repeats)); mpv_outfix->minWidth = min(mpv_outfix->minWidth, depth(rp.repeats));
@ -1804,7 +1804,7 @@ bool RoseBuildImpl::addChainTail(const raw_puff &rp, u32 *queue_out,
mpv_outfix->chained = true; mpv_outfix->chained = true;
} }
mpv_outfix->triggered_puffettes.push_back(rp); mpv_outfix->mpv.triggered_puffettes.push_back(rp);
mpv_outfix->maxBAWidth = ROSE_BOUND_INF; /* not ba */ mpv_outfix->maxBAWidth = ROSE_BOUND_INF; /* not ba */
mpv_outfix->minWidth = min(mpv_outfix->minWidth, depth(rp.repeats)); mpv_outfix->minWidth = min(mpv_outfix->minWidth, depth(rp.repeats));
@ -1816,7 +1816,7 @@ bool RoseBuildImpl::addChainTail(const raw_puff &rp, u32 *queue_out,
* the caller */ * the caller */
*queue_out = mpv_outfix->get_queue(qif); *queue_out = mpv_outfix->get_queue(qif);
*event_out = MQE_TOP_FIRST + mpv_outfix->triggered_puffettes.size() - 1; *event_out = MQE_TOP_FIRST + mpv_outfix->mpv.triggered_puffettes.size() - 1;
return true; /* failure is not yet an option */ return true; /* failure is not yet an option */
} }

View File

@ -1294,7 +1294,7 @@ aligned_unique_ptr<NFA> buildOutfix(RoseBuildImpl &tbi, OutfixInfo &outfix) {
} }
} }
} }
} else if (!outfix.puffettes.empty()) { } else if (!outfix.mpv.puffettes.empty()) {
assert(0); assert(0);
} }
@ -1327,7 +1327,7 @@ void prepMpv(RoseBuildImpl &tbi, build_context &bc, size_t *historyRequired,
} }
assert(mpv->chained); assert(mpv->chained);
auto nfa = mpvCompile(mpv->puffettes, mpv->triggered_puffettes); auto nfa = mpvCompile(mpv->mpv.puffettes, mpv->mpv.triggered_puffettes);
assert(nfa); assert(nfa);
if (!nfa) { if (!nfa) {
throw CompileError("Unable to generate bytecode."); throw CompileError("Unable to generate bytecode.");
@ -1347,7 +1347,7 @@ void prepMpv(RoseBuildImpl &tbi, build_context &bc, size_t *historyRequired,
} }
add_nfa_to_blob(bc, *nfa); add_nfa_to_blob(bc, *nfa);
*mpv_as_outfix = !mpv->puffettes.empty(); *mpv_as_outfix = !mpv->mpv.puffettes.empty();
} }
static static

View File

@ -290,6 +290,18 @@ bool operator<(const simple_anchored_info &a, const simple_anchored_info &b) {
return 0; return 0;
} }
struct MpvProto {
bool empty() const {
return puffettes.empty() && triggered_puffettes.empty();
}
void reset() {
puffettes.clear();
triggered_puffettes.clear();
}
std::vector<raw_puff> puffettes;
std::vector<raw_puff> triggered_puffettes;
};
struct OutfixInfo { /* TODO: poly */ struct OutfixInfo { /* TODO: poly */
OutfixInfo() {} OutfixInfo() {}
explicit OutfixInfo(std::unique_ptr<raw_dfa> r) : rdfa(std::move(r)) { explicit OutfixInfo(std::unique_ptr<raw_dfa> r) : rdfa(std::move(r)) {
@ -310,28 +322,25 @@ struct OutfixInfo { /* TODO: poly */
} }
bool is_nonempty_mpv() const { bool is_nonempty_mpv() const {
return !puffettes.empty() || !triggered_puffettes.empty(); return !mpv.empty();
} }
bool is_dead() const { bool is_dead() const {
return !holder && !rdfa && !haig && puffettes.empty() && return !holder && !rdfa && !haig && mpv.empty();
triggered_puffettes.empty();
} }
void clear() { void clear() {
holder.reset(); holder.reset();
rdfa.reset(); rdfa.reset();
haig.reset(); haig.reset();
puffettes.clear(); mpv.reset();
triggered_puffettes.clear();
assert(is_dead()); assert(is_dead());
} }
std::unique_ptr<NGHolder> holder; std::unique_ptr<NGHolder> holder;
std::unique_ptr<raw_dfa> rdfa; std::unique_ptr<raw_dfa> rdfa;
std::unique_ptr<raw_som_dfa> haig; std::unique_ptr<raw_som_dfa> haig;
std::vector<raw_puff> puffettes; MpvProto mpv;
std::vector<raw_puff> triggered_puffettes;
RevAccInfo rev_info; RevAccInfo rev_info;
u32 maxBAWidth = 0; //!< max bi-anchored width u32 maxBAWidth = 0; //!< max bi-anchored width

View File

@ -631,10 +631,10 @@ RoseDedupeAuxImpl::RoseDedupeAuxImpl(const RoseBuildImpl &tbi_in)
} }
if (tbi.mpv_outfix) { if (tbi.mpv_outfix) {
for (const auto &puff : tbi.mpv_outfix->puffettes) { for (const auto &puff : tbi.mpv_outfix->mpv.puffettes) {
puff_map[puff.report].insert(&puff); puff_map[puff.report].insert(&puff);
} }
for (const auto &puff : tbi.mpv_outfix->triggered_puffettes) { for (const auto &puff : tbi.mpv_outfix->mpv.triggered_puffettes) {
puff_map[puff.report].insert(&puff); puff_map[puff.report].insert(&puff);
} }
} }
@ -886,10 +886,10 @@ set<ReportID> all_reports(const OutfixInfo &outfix) {
insert(&reports, all_reports(*outfix.haig)); insert(&reports, all_reports(*outfix.haig));
} }
for (const auto &puff : outfix.puffettes) { for (const auto &puff : outfix.mpv.puffettes) {
reports.insert(puff.report); reports.insert(puff.report);
} }
for (const auto &puff : outfix.triggered_puffettes) { for (const auto &puff : outfix.mpv.triggered_puffettes) {
reports.insert(puff.report); reports.insert(puff.report);
} }