#include "pp.h" #define CONSTRUCTIONEDGE 1 #define REPETITIONEDGE 2 #define INHERITANCEEDGE 3 #define ALTERNATIONEDGE 4 void Cd_graph::markondg( Cd_graph* schema,SCC_component_List* sccmatrix,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Cd_graph","void Cd_graph::markondg(Cd_graph* schema,SCC_component_List* sccmatrix,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers #ifdef DEBUG this->g_print(); cout << endl; cout << "Matrix " << endl; sccmatrix->g_print(); cout << endl; #endif adjacencies->markvertices(schema, sccmatrix,this,c); adjacencies->markedges(schema, sccmatrix,this,c,inclEdge); this->get_adjacencies()->markinhedges(c, schema); #ifdef DEBUG this->g_print(); cout << endl; cout << "Matrix " << endl; sccmatrix->g_print(); cout << endl; #endif // suffix class wrappers } void Adjacency_Nlist::markvertices( Cd_graph* schema,SCC_component_List* sccmatrix,Cd_graph* workingCopy,Path_constraint_exp* c ) { DEM_TRACE("Adjacency_Nlist","void Adjacency_Nlist::markvertices(Cd_graph* schema,SCC_component_List* sccmatrix,Cd_graph* workingCopy,Path_constraint_exp* c)"); // prefix class wrappers Adjacency_list_iterator next(*this); Adjacency* each; Adjacency_list_iterator next2(*schema->get_adjacencies()); Adjacency* each2; while (each = next()) { each2 = next2(); each->markvertices(each2, sccmatrix, workingCopy, c); } // suffix class wrappers } void Adjacency_Nlist::markedges( Cd_graph* schema,SCC_component_List* sccmatrix,Cd_graph* workingCopy,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Adjacency_Nlist","void Adjacency_Nlist::markedges(Cd_graph* schema,SCC_component_List* sccmatrix,Cd_graph* workingCopy,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers Adjacency_list_iterator next(*this); Adjacency* each; Adjacency_list_iterator next2(*schema->get_adjacencies()); Adjacency* each2; while (each = next()) { each2 = next2(); each->markedges(each2, sccmatrix, workingCopy, c,inclEdge); } // suffix class wrappers } void Adjacency::markvertices( Adjacency* tadjacency,SCC_component_List* sccmatrix,Cd_graph* workingCopy,Path_constraint_exp* c ) { DEM_TRACE("Adjacency","void Adjacency::markvertices(Adjacency* tadjacency,SCC_component_List* sccmatrix,Cd_graph* workingCopy,Path_constraint_exp* c)"); // prefix class wrappers int resultscc; static DemString* mark = new DemString("propagate"); resultscc = 0; sccmatrix->scc_marked(scc->get_val(), resultscc); if (resultscc != 0) { if (propagate) propagate->g_delete(); propagate = (DemString*)mark->g_copy(); if (tempmark) tempmark->g_delete(); tempmark = (DemString*)mark->g_copy(); if (tadjacency->get_propagate()) tadjacency->get_propagate()->g_delete(); tadjacency->set_propagate((DemString*)mark->g_copy()); if (tadjacency->get_tempmark()) tadjacency->get_tempmark()->g_delete(); tadjacency->set_tempmark((DemString*)mark->g_copy()); } // suffix class wrappers } void Adjacency::markedges( Adjacency* tadjacency,SCC_component_List* sccmatrix,Cd_graph* workingCopy,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Adjacency","void Adjacency::markedges(Adjacency* tadjacency,SCC_component_List* sccmatrix,Cd_graph* workingCopy,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers int resultscc; static DemString* mark = new DemString("propagate"); resultscc = 0; sccmatrix->scc_marked(scc->get_val(), resultscc); #ifdef DEBUG cout << "at " << source << " " << scc << " " << resultscc << endl; #endif if (resultscc != 0) { ///////////////////////////////////////// // should not consider bypassing edges ////////////////////////////////////////// ns->check_alt_mark(tadjacency->get_ns(), source, scc->get_val(), sccmatrix, workingCopy, c, inclEdge); ns->check_rep_mark(tadjacency->get_ns(), source, scc->get_val(), sccmatrix, workingCopy, c, inclEdge); } ////////////////////////////////////////////////////////// // construction edges are special. They can be inherited. ////////////////////////////////////////////////////////// ns->check_cons_mark(tadjacency, this, source, scc->get_val(), sccmatrix, workingCopy, c, inclEdge); // suffix class wrappers } void SCC_component_List::scc_marked( int sccval,int& result ) { DEM_TRACE("SCC_component_List","void SCC_component_List::scc_marked(int sccval,int& result)"); // prefix class wrappers static DemString* markstr = new DemString("propagate"); SCC_component_list_iterator next(*this); SCC_component* each; while (each = next()) if (sccval == each->get_scc()->get_val()) { result = (each->get_mark()->g_equal(markstr)); return; } // suffix class wrappers } void Neighbors::check_alt_mark( Neighbors* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Neighbors","void Neighbors::check_alt_mark(Neighbors* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers // suffix class wrappers } void Neighbors_wc::check_alt_mark( Neighbors* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Neighbors_wc","void Neighbors_wc::check_alt_mark(Neighbors* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers // suffix class wrappers } void Alternat_ns::check_alt_mark( Neighbors* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Alternat_ns","void Alternat_ns::check_alt_mark(Neighbors* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers if (alternat_ns) alternat_ns->check_alt_mark(((Alternat_ns*)tns)->get_alternat_ns(), source,fromscc, sccmatrix, cd, c, inclEdge); // suffix class wrappers } void Term_Barlist::check_alt_mark( Term_Barlist* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Term_Barlist","void Term_Barlist::check_alt_mark(Term_Barlist* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers Term_list_iterator next(*this); Term* each; Term_list_iterator next2(*tns); Term* each2; /* CHECK WHETHER IT IS EXCLUDING ALT EDGES */ while (each = next()) { each2 = next2(); #ifdef DEBUG cout << "before " << source << " => " << each2 << endl; #endif if (c == NULL || !c->isXAltEdgeInTheList(source,each)) { #ifdef DEBUG cout << "after " << source << " => " << each2 << endl; #endif each->get_vertex()->check_alt_mark(each2,source,each,fromscc,sccmatrix,cd,c, inclEdge); } } // suffix class wrappers } void Vertex::check_alt_mark( Term* tterm,Vertex* source,Term* aterm,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Vertex","void Vertex::check_alt_mark(Term* tterm,Vertex* source,Term* aterm,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers int vertexscc; int isForced; static DemString *mark = new DemString("call"); int isThruAltEdge; int result; if (!this->isPropagated(cd)) return; // if (inclEdge && !inclEdge->passed(source,this,cd,sccmatrix,ALTERNATIONEDGE,NULL)) // return; isThruAltEdge = 0; if (c) isThruAltEdge = c->isThruAltEdgeInTheList(source,aterm); vertexscc = 0; cd->get_vert_scc(this, vertexscc); isForced = 0; if (c) c->isSCCEdgeForcedByThru(cd,fromscc,vertexscc,isForced); result = 0; sccmatrix->check_edge(fromscc, vertexscc, result); if (result ==1) { if (isForced==0) { if (aterm->get_call()) aterm->get_call()->g_delete(); aterm->set_call((DemString*)mark->g_copy()); if (tterm->get_call()) tterm->get_call()->g_delete(); tterm->set_call((DemString*)mark->g_copy()); } else if (isThruAltEdge) { if (aterm->get_call()) aterm->get_call()->g_delete(); aterm->set_call((DemString*)mark->g_copy()); if (tterm->get_call()) tterm->get_call()->g_delete(); tterm->set_call((DemString*)mark->g_copy()); } } else if (fromscc == vertexscc) { sccmatrix->scc_marked(vertexscc,result); if (result ==1) { if (aterm->get_call()) aterm->get_call()->g_delete(); aterm->set_call((DemString*)mark->g_copy()); if (tterm->get_call()) tterm->get_call()->g_delete(); tterm->set_call((DemString*)mark->g_copy()); } } // suffix class wrappers } void Neighbors::check_cons_mark( Adjacency* tadj,Adjacency* adj,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Neighbors","void Neighbors::check_cons_mark(Adjacency* tadj,Adjacency* adj,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers // suffix class wrappers } void Neighbors_wc::check_cons_mark( Adjacency* tadj,Adjacency* adj,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Neighbors_wc","void Neighbors_wc::check_cons_mark(Adjacency* tadj,Adjacency* adj,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers construct_ns->check_cons_mark(tadj, ((Neighbors_wc*)tadj->get_ns())->get_construct_ns(), adj, source, fromscc, sccmatrix, cd, c, inclEdge); // suffix class wrappers } void Any_vertex_List::check_cons_mark( Adjacency* tadj,Any_vertex_List* tns,Adjacency* adj,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Any_vertex_List","void Any_vertex_List::check_cons_mark(Adjacency* tadj,Any_vertex_List* tns,Adjacency* adj,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers Any_vertex_list_iterator next(*this); Any_vertex* each; Any_vertex_list_iterator next2(*tns); Any_vertex* each2; while (each = next()) { each2 = next2(); each->check_cons_mark(tadj, adj, each2, source, fromscc, sccmatrix, cd, c, inclEdge); } // suffix class wrappers } void Opt_labeled_term_Sandwich::check_cons_mark( Adjacency* tadj,Adjacency* adj,Opt_labeled_term_Sandwich* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Opt_labeled_term_Sandwich","void Opt_labeled_term_Sandwich::check_cons_mark(Adjacency* tadj,Adjacency* adj,Opt_labeled_term_Sandwich* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers inner->check_cons_mark(tadj, adj, tav->get_inner(), source, fromscc, sccmatrix, cd, c, inclEdge); // suffix class wrappers } void Any_vertex::check_cons_mark( Adjacency* tadj,Adjacency* adj,Any_vertex* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Any_vertex","void Any_vertex::check_cons_mark(Adjacency* tadj,Adjacency* adj,Any_vertex* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers // suffix class wrappers } void Opt_labeled_term::check_cons_mark( Adjacency* tadj,Adjacency* adj,Any_vertex* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Opt_labeled_term","void Opt_labeled_term::check_cons_mark(Adjacency* tadj,Adjacency* adj,Any_vertex* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers // suffix class wrappers } void Optional_term::check_cons_mark( Adjacency* tadj,Adjacency* adj,Any_vertex* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Optional_term","void Optional_term::check_cons_mark(Adjacency* tadj,Adjacency* adj,Any_vertex* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers opt->check_cons_mark(tadj, adj, ((Optional_term*)tav)->get_opt(), source, fromscc, sccmatrix, cd, c, inclEdge); // suffix class wrappers } void Regular::check_cons_mark( Adjacency* tadj,Adjacency* adj,Any_vertex* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Regular","void Regular::check_cons_mark(Adjacency* tadj,Adjacency* adj,Any_vertex* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers derror('i',1," unexpected visit at Regular::check_cons_mark\n"); abort(); // suffix class wrappers } void Labeled::check_cons_mark( Adjacency* tadj,Adjacency* adj,Any_vertex* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Labeled","void Labeled::check_cons_mark(Adjacency* tadj,Adjacency* adj,Any_vertex* tav,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers int isThruConsEdge = 0; if (c) isThruConsEdge = c->isThruConsEdgeInTheList(source, this->get_label_name(), this->get_vertex()); int isXConsEdge = 0; if (c) isXConsEdge = c->isXConsEdgeInTheList(source, this->get_label_name(), this->get_vertex()); #ifdef DEBUG cout << source << ": " << this->get_label_name() << ": " << this->get_vertex() << endl; cout << "isXConsEdge = " << isXConsEdge << endl; #endif if (!isXConsEdge) this->check_cons_mark(tadj, adj, (Labeled*)tav, source, this, fromscc, sccmatrix, cd, isThruConsEdge, c, inclEdge); // suffix class wrappers } int Vertex::isPropagated( Cd_graph* cd ) { DEM_TRACE("Vertex","int Vertex::isPropagated(Cd_graph* cd)"); int return_val; this->isPropagated_( return_val, cd ); return return_val; } void Vertex::isPropagated_( int& return_val, Cd_graph* cd ) { DEM_TRACE("Vertex","void Vertex::isPropagated_(int& return_val,Cd_graph* cd)"); // prefix class wrappers static DemString* markp = new DemString("propagate"); Adjacency_list_iterator nextadj(*cd->get_adjacencies()); Adjacency* eachadj; while (eachadj = nextadj()) if (eachadj->get_source()->get_vertex_name()->g_equal(this->get_vertex_name())) break; if (eachadj) { if (!eachadj->get_propagate()->g_equal(markp)) return_val = 0; else return_val = 1; } else { derror('e',1,form(" undefined class: '%s'\n",this->get_vertex_name()->get_val())); cout << endl; exit(-1); } // suffix class wrappers } void Labeled::check_cons_mark( Adjacency* tadj,Adjacency* adj,Labeled* tav,Vertex* source,Any_vertex* anyvertex,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,int isThruConsEdge,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Labeled","void Labeled::check_cons_mark(Adjacency* tadj,Adjacency* adj,Labeled* tav,Vertex* source,Any_vertex* anyvertex,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,int isThruConsEdge,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers if (this->get_vertex()->isTerminal()) return; this->get_vertex() ->get_vertex() ->check_cons_mark(tadj, adj, tav, source, anyvertex, fromscc, sccmatrix, cd, isThruConsEdge, c, inclEdge, this->get_label_name()); // suffix class wrappers } void Vertex::check_cons_mark( Adjacency* tadj,Adjacency* adj,Labeled* tav,Vertex* source,Any_vertex* anyvertex,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,int isThruConsEdge,Path_constraint_exp* c,Meta_edge* inclEdge,DemIdent* edgelabel ) { DEM_TRACE("Vertex","void Vertex::check_cons_mark(Adjacency* tadj,Adjacency* adj,Labeled* tav,Vertex* source,Any_vertex* anyvertex,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,int isThruConsEdge,Path_constraint_exp* c,Meta_edge* inclEdge,DemIdent* edgelabel)"); // prefix class wrappers static DemString *mark = new DemString("call"); static DemString* markp = new DemString("propagate"); int result; int vertexscc; int isForced = 0; if (!this->isPropagated(cd)) return; // if (inclEdge && !inclEdge->passed(source,this,cd,sccmatrix,CONSTRUCTIONEDGE,edgelabel)) // return; vertexscc = 0; cd->get_vert_scc(this, vertexscc); if (fromscc == vertexscc) { result = 0; sccmatrix->scc_marked(vertexscc,result); if (result ==1) { if (anyvertex->get_call()) anyvertex->get_call()->g_delete(); anyvertex->set_call((DemString*)mark->g_copy()); if (tav->get_call()) tav->get_call()->g_delete(); tav->set_call((DemString*)mark->g_copy()); } return; } isForced = 0; if (c) c->isSCCEdgeForcedByThru(cd,fromscc, vertexscc,isForced); result = 0; sccmatrix->check_edge(fromscc, vertexscc, result); if (result ==1) { if (isForced == 0) { if (anyvertex->get_call()) anyvertex->get_call()->g_delete(); anyvertex->set_call((DemString*)mark->g_copy()); if (tav->get_call()) tav->get_call()->g_delete(); tav->set_call((DemString*)mark->g_copy()); } else if (isThruConsEdge) { if (anyvertex->get_call()) anyvertex->get_call()->g_delete(); anyvertex->set_call((DemString*)mark->g_copy()); if (tav->get_call()) tav->get_call()->g_delete(); tav->set_call((DemString*)mark->g_copy()); } return; } result = 0; sccmatrix->scc_marked(vertexscc,result); if (result == 0) return; if (source->isPropagated(cd)) return; Vertex_List * alternatives = new Vertex_List(); cd->collect_alternatives(c, source, alternatives); /* It should be renamed as collect subclasses */ Vertex_list_iterator next(*alternatives); Vertex* each; while (each = next()) { cd->get_vert_scc(each,fromscc); result = 0; sccmatrix->check_edge(fromscc, vertexscc, result); if (result ==1) { if (adj->get_propagate()) adj->get_propagate()->g_delete(); adj->set_propagate((DemString*)markp->g_copy()); if (adj->get_tempmark()) adj->get_tempmark()->g_delete(); adj->set_tempmark((DemString*)markp->g_copy()); if (anyvertex->get_call()) anyvertex->get_call()->g_delete(); anyvertex->set_call((DemString*)mark->g_copy()); if (tadj->get_propagate()) tadj->get_propagate()->g_delete(); tadj->set_propagate((DemString*)markp->g_copy()); if (tadj->get_tempmark()) tadj->get_tempmark()->g_delete(); tadj->set_tempmark((DemString*)markp->g_copy()); if (tav->get_call()) tav->get_call()->g_delete(); tav->set_call((DemString*)mark->g_copy()); return; } } // suffix class wrappers } void Cd_graph::get_vert_scc( Vertex* vert,int& sccval ) { DEM_TRACE("Cd_graph","void Cd_graph::get_vert_scc(Vertex* vert,int& sccval)"); // prefix class wrappers adjacencies->get_vert_scc(vert, sccval); // suffix class wrappers } void Adjacency_Nlist::get_vert_scc( Vertex* vert,int& sccval ) { DEM_TRACE("Adjacency_Nlist","void Adjacency_Nlist::get_vert_scc(Vertex* vert,int& sccval)"); // prefix class wrappers Adjacency_list_iterator next(*this); Adjacency* each; while (each = next()) if ((each->get_source()->equal(vert)) == 1) sccval = each->get_scc()->get_val(); // suffix class wrappers } void SCC_component_List::check_edge( int fromscc,int toscc,int& result ) { DEM_TRACE("SCC_component_List","void SCC_component_List::check_edge(int fromscc,int toscc,int& result)"); // prefix class wrappers SCC_component_list_iterator next(*this); SCC_component* each; while (each = next()) each->check_edge(fromscc, toscc, result); // suffix class wrappers } void SCC_component::check_edge( int fromscc,int toscc,int& result ) { DEM_TRACE("SCC_component","void SCC_component::check_edge(int fromscc,int toscc,int& result)"); // prefix class wrappers if (fromscc == scc->get_val() ) edges->check_edge(fromscc, toscc, result); // suffix class wrappers } void SCC_component_Edges_List::check_edge( int fromscc,int toscc,int& result ) { DEM_TRACE("SCC_component_Edges_List","void SCC_component_Edges_List::check_edge(int fromscc,int toscc,int& result)"); // prefix class wrappers static DemString* markstr = new DemString("propagate"); SCC_component_Edges_list_iterator next(*this); SCC_component_Edges* each; while (each = next()) if (toscc == each->get_scc()->get_val()) { result = (each->get_mark()->g_equal(markstr)); return; } // suffix class wrappers } void Neighbors::check_rep_mark( Neighbors* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Neighbors","void Neighbors::check_rep_mark(Neighbors* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers // suffix class wrappers } void Repetit_n::check_rep_mark( Neighbors* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Repetit_n","void Repetit_n::check_rep_mark(Neighbors* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers if (sandwiched) sandwiched->check_rep_mark(((Repetit_n*)tns)->get_sandwiched(), source, fromscc, sccmatrix, cd, c, inclEdge); // suffix class wrappers } void Kernel_Sandwich::check_rep_mark( Kernel_Sandwich* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Kernel_Sandwich","void Kernel_Sandwich::check_rep_mark(Kernel_Sandwich* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers inner->check_rep_mark(tns->get_inner(), source, fromscc, sccmatrix, cd, c, inclEdge); // suffix class wrappers } void Kernel::check_rep_mark( Kernel* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Kernel","void Kernel::check_rep_mark(Kernel* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers repeated->check_rep_mark(tns->get_repeated(), source, fromscc, sccmatrix, cd, c, inclEdge); // suffix class wrappers } void Term_Sandwich::check_rep_mark( Term_Sandwich* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Term_Sandwich","void Term_Sandwich::check_rep_mark(Term_Sandwich* tns,Vertex* source,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers if (inner->isTerminal()) return; if ( c == NULL || !c->isXRepEdgeInTheList(source,inner)) inner->get_vertex()->check_rep_mark(tns->get_inner(), source, inner, fromscc, sccmatrix, cd, c, inclEdge); // suffix class wrappers } void Vertex::check_rep_mark( Term* tterm,Vertex* source,Term* aterm,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge ) { DEM_TRACE("Vertex","void Vertex::check_rep_mark(Term* tterm,Vertex* source,Term* aterm,int fromscc,SCC_component_List* sccmatrix,Cd_graph* cd,Path_constraint_exp* c,Meta_edge* inclEdge)"); // prefix class wrappers int vertexscc; int isForced; int isThruRepEdge; static DemString *mark = new DemString("call"); int result; if (!this->isPropagated(cd)) return; // if (inclEdge && !inclEdge->passed(source,this,cd,sccmatrix,REPETITIONEDGE,NULL)) // return; isThruRepEdge = 0; if (c) isThruRepEdge = c->isThruRepEdgeInTheList(source,aterm); vertexscc = 0; cd->get_vert_scc(this, vertexscc); isForced = 0; if (c) c->isSCCEdgeForcedByThru(cd,fromscc,vertexscc,isForced); result = 0; sccmatrix->check_edge(fromscc, vertexscc, result); if (result == 1) { if (isForced == 0) { if (aterm->get_call()) aterm->get_call()->g_delete(); aterm->set_call((DemString*)mark->g_copy()); if (tterm->get_call()) tterm->get_call()->g_delete(); tterm->set_call((DemString*)mark->g_copy()); } else if (isThruRepEdge) { if (aterm->get_call()) aterm->get_call()->g_delete(); aterm->set_call((DemString*)mark->g_copy()); if (tterm->get_call()) tterm->get_call()->g_delete(); tterm->set_call((DemString*)mark->g_copy()); } return; } if (fromscc == vertexscc) { result = 0; sccmatrix->scc_marked(vertexscc,result); if (result ==1) { if (aterm->get_call()) aterm->get_call()->g_delete(); aterm->set_call((DemString*)mark->g_copy()); if (tterm->get_call()) tterm->get_call()->g_delete(); tterm->set_call((DemString*)mark->g_copy()); } } // suffix class wrappers } int Meta_edge::passed( Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel ) { DEM_TRACE("Meta_edge","int Meta_edge::passed(Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel)"); int return_val; this->passed_( return_val, sourcev , targetv , cd , sccmatrix , flag , edgeLabel ); return return_val; } void Meta_edge::passed_( int& return_val, Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel ) { DEM_TRACE("Meta_edge","void Meta_edge::passed_(int& return_val,Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel)"); // prefix class wrappers return_val = 1; // suffix class wrappers } int Meta_inheritance_edge::passed( Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel ) { DEM_TRACE("Meta_inheritance_edge","int Meta_inheritance_edge::passed(Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel)"); int return_val; this->passed_( return_val, sourcev , targetv , cd , sccmatrix , flag , edgeLabel ); return return_val; } void Meta_inheritance_edge::passed_( int& return_val, Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel ) { DEM_TRACE("Meta_inheritance_edge","void Meta_inheritance_edge::passed_(int& return_val,Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel)"); // prefix class wrappers int sourcescc = 0; cd->get_vert_scc(sourcev, sourcescc); int targetscc = 0; cd->get_vert_scc(targetv, targetscc); Vertex* fromv = NULL; Vertex* tov = NULL; from->get_single_vertex(fromv); to->get_single_vertex(tov); int fromscc = 0; cd->get_the_scc(fromv, fromscc); int toscc = 0; cd->get_the_scc(tov, toscc); int result = 0; cd->reachable(toscc,sourcescc,result); if (result) return_val = 1; else { result = 0; cd->reachable(targetscc,fromscc,result); return_val = result; } // suffix class wrappers } int Meta_construction_edge::passed( Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel ) { DEM_TRACE("Meta_construction_edge","int Meta_construction_edge::passed(Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel)"); int return_val; this->passed_( return_val, sourcev , targetv , cd , sccmatrix , flag , edgeLabel ); return return_val; } void Meta_construction_edge::passed_( int& return_val, Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel ) { DEM_TRACE("Meta_construction_edge","void Meta_construction_edge::passed_(int& return_val,Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel)"); // prefix class wrappers int sourcescc = 0; cd->get_vert_scc(sourcev, sourcescc); int targetscc = 0; cd->get_vert_scc(targetv, targetscc); Vertex* fromv = NULL; Vertex* tov = NULL; from->get_single_vertex(fromv); to->get_single_vertex(tov); int fromscc = 0; cd->get_the_scc(fromv, fromscc); int toscc = 0; cd->get_the_scc(tov, toscc); if (flag == CONSTRUCTIONEDGE && sourcescc == fromscc && targetscc == toscc) { int matched = 0; edge_label->match_label(edgeLabel,matched); if (matched) return_val = 1; else return_val = 0; } else { int result = 0; cd->reachable(toscc,sourcescc,result); if (result) return_val = 1; else { result = 0; cd->reachable(targetscc,fromscc,result); if (result) return_val = 1; else { if (cd->inherits(cd,targetv,fromv)) return_val = 1; else return_val = 0; } } } // suffix class wrappers } int Meta_alternation_edge::passed( Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel ) { DEM_TRACE("Meta_alternation_edge","int Meta_alternation_edge::passed(Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel)"); int return_val; this->passed_( return_val, sourcev , targetv , cd , sccmatrix , flag , edgeLabel ); return return_val; } void Meta_alternation_edge::passed_( int& return_val, Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel ) { DEM_TRACE("Meta_alternation_edge","void Meta_alternation_edge::passed_(int& return_val,Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel)"); // prefix class wrappers int sourcescc = 0; cd->get_vert_scc(sourcev, sourcescc); int targetscc = 0; cd->get_vert_scc(targetv, targetscc); Vertex* fromv = NULL; Vertex* tov = NULL; from->get_single_vertex(fromv); to->get_single_vertex(tov); int fromscc = 0; cd->get_the_scc(fromv, fromscc); int toscc = 0; cd->get_the_scc(tov, toscc); if (flag == ALTERNATIONEDGE && sourcescc == fromscc && targetscc == toscc) { return_val = 1; } else { int result = 0; cd->reachable(toscc,sourcescc,result); if (result) return_val = 1; else { result = 0; cd->reachable(targetscc,fromscc,result); return_val = result; } } // suffix class wrappers } int Meta_repetition_edge::passed( Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel ) { DEM_TRACE("Meta_repetition_edge","int Meta_repetition_edge::passed(Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel)"); int return_val; this->passed_( return_val, sourcev , targetv , cd , sccmatrix , flag , edgeLabel ); return return_val; } void Meta_repetition_edge::passed_( int& return_val, Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel ) { DEM_TRACE("Meta_repetition_edge","void Meta_repetition_edge::passed_(int& return_val,Vertex* sourcev,Vertex* targetv,Cd_graph* cd,SCC_component_List* sccmatrix,int flag,DemIdent* edgeLabel)"); // prefix class wrappers int sourcescc = 0; cd->get_vert_scc(sourcev, sourcescc); int targetscc = 0; cd->get_vert_scc(targetv, targetscc); Vertex* fromv = NULL; Vertex* tov = NULL; from->get_single_vertex(fromv); to->get_single_vertex(tov); int fromscc = 0; cd->get_the_scc(fromv, fromscc); int toscc = 0; cd->get_the_scc(tov, toscc); if (flag == REPETITIONEDGE && sourcescc == fromscc && targetscc == toscc) { return_val = 1; } else { int result = 0; cd->reachable(toscc,sourcescc,result); if (result) return_val = 1; else { result = 0; cd->reachable(targetscc,fromscc,result); return_val = result; } } // suffix class wrappers }