return proto.repeats.at(top).bounds.max;
}
-CastleProto::CastleProto(const PureRepeat &pr) {
+CastleProto::CastleProto(nfa_kind k, const PureRepeat &pr) : kind(k) {
assert(pr.reach.any());
assert(pr.reports.size() == 1);
u32 top = 0;
bool mergeCastle(CastleProto &c1, const CastleProto &c2,
map<u32, u32> &top_map) {
assert(&c1 != &c2);
+ assert(c1.kind == c2.kind);
DEBUG_PRINTF("c1 has %zu repeats, c2 has %zu repeats\n", c1.repeats.size(),
c2.repeats.size());
return false;
}
-unique_ptr<NGHolder> makeHolder(const CastleProto &proto, nfa_kind kind,
+unique_ptr<NGHolder> makeHolder(const CastleProto &proto,
const CompileContext &cc) {
assert(!proto.repeats.empty());
}
}
- unique_ptr<NGHolder> g = ue2::make_unique<NGHolder>(kind);
+ auto g = ue2::make_unique<NGHolder>(proto.kind);
for (const auto &m : proto.repeats) {
if (m.first >= NFA_MAX_TOP_MASKS) {
*/
struct CastleProto {
static constexpr size_t max_occupancy = 65536; // arbitrary limit
- explicit CastleProto(const PureRepeat &pr);
+ CastleProto(nfa_kind k, const PureRepeat &pr);
const CharReach &reach() const;
/** \brief Add a new repeat. */
* so we track this explicitly instead of using repeats.size().
*/
u32 next_top = 1;
+
+ /** \brief Kind for this engine. */
+ nfa_kind kind;
};
std::set<ReportID> all_reports(const CastleProto &proto);
/**
* \brief Build an NGHolder from a CastleProto.
*/
-std::unique_ptr<NGHolder> makeHolder(const CastleProto &castle, nfa_kind kind,
+std::unique_ptr<NGHolder> makeHolder(const CastleProto &castle,
const CompileContext &cc);
void remapReportsToPrograms(CastleProto &castle, const ReportManager &rm);
if (isPureRepeat(h, pr) && pr.reports.size() == 1) {
DEBUG_PRINTF("vertex preceded by infix repeat %s\n",
pr.bounds.str().c_str());
- left.castle = make_shared<CastleProto>(pr);
+ left.castle = make_shared<CastleProto>(h.kind, pr);
cache[&h] = left.castle;
left.graph.reset();
}
return;
}
- suffix.castle = make_shared<CastleProto>(pr);
+ suffix.castle = make_shared<CastleProto>(h.kind, pr);
cache[&h] = suffix.castle;
suffix.graph.reset();
}
for (const auto &e : left_castles) {
assert(e.first.castle());
- shared_ptr<NGHolder> h = makeHolder(*e.first.castle(), NFA_INFIX,
- tbi.cc);
+ shared_ptr<NGHolder> h = makeHolder(*e.first.castle(), tbi.cc);
if (!h || num_vertices(*h) > MAX_UNMAKE_VERTICES) {
continue;
}
for (const auto &e : suffix_castles) {
assert(e.first.castle());
- shared_ptr<NGHolder> h = makeHolder(*e.first.castle(), NFA_SUFFIX,
- tbi.cc);
+ shared_ptr<NGHolder> h = makeHolder(*e.first.castle(), tbi.cc);
if (!h || num_vertices(*h) > MAX_UNMAKE_VERTICES) {
continue;
}