continue;
}
- if (!tbi.hasDirectFinalId(v) || !tbi.isFloating(v)) {
+ if (!tbi.allDirectFinalIds(v) || !tbi.isFloating(v)) {
DEBUG_PRINTF("vertex %zu isn't floating and direct\n", g[v].idx);
return false;
}
const auto &g = build.g;
for (const auto &e : edges_range(g)) {
const auto &v = target(e, g);
- if (build.hasDirectFinalId(v)) {
- // Skip direct reports, which do not have RoseLiteral entries.
- continue;
- }
for (const auto &lit_id : g[v].literals) {
assert(lit_id < build.literal_info.size());
u32 final_id = build.literal_info.at(lit_id).final_id;
- if (final_id != MO_INVALID_IDX) {
- unique_lit_edge_map[final_id].insert(e);
+ if (final_id == MO_INVALID_IDX || final_id & LITERAL_MDR_FLAG) {
+ // Unused, special or direct report IDs are handled elsewhere.
+ continue;
}
+ unique_lit_edge_map[final_id].insert(e);
}
}
// role's reports from a list.
for (auto v : info.vertices) {
- if (g[v].literals.size() != 1) {
- return false; // Avoid roles with multiple literals at this stage.
- }
-
- assert(*g[v].literals.begin() == id);
+ assert(contains(g[v].literals, id));
if (g[v].reports.empty() ||
g[v].eod_accept || // no accept EOD
return literal_info.at(id).final_id & LITERAL_MDR_FLAG;
}
-bool RoseBuildImpl::hasDirectFinalId(RoseVertex v) const {
- if (g[v].literals.empty()) {
+bool RoseBuildImpl::allDirectFinalIds(RoseVertex v) const {
+ const auto &lits = g[v].literals;
+ if (lits.empty()) {
return false;
}
- return hasDirectFinalId(*g[v].literals.begin());
+ for (const auto &lit : lits) {
+ if (!hasDirectFinalId(lit)) {
+ return false;
+ }
+ }
+ return true;
}
bool RoseBuildImpl::hasFinalId(u32 id) const {
bool isDirectReport(u32 id) const;
bool isDelayed(u32 id) const;
+
+ /**
+ * \brief True if the given literal ID is a direct or multi-direct report.
+ */
bool hasDirectFinalId(u32 id) const;
- bool hasDirectFinalId(RoseVertex v) const;
+
+ /**
+ * \brief True if all the literals associated with the given vertex are
+ * direct or multi-direct reports.
+ */
+ bool allDirectFinalIds(RoseVertex v) const;
+
bool hasFinalId(u32 id) const;
bool isAnchored(RoseVertex v) const; /* true iff has literal in anchored