#include "pp.h" void Fixed_term::collect_subclasses( Fixed_term_Commalist* ns,Cd_graph* schema ) { DEM_TRACE("Fixed_term","void Fixed_term::collect_subclasses(Fixed_term_Commalist* ns,Cd_graph* schema)"); // prefix class wrappers this->get_vertex()->collect_subclasses(ns,schema); // suffix class wrappers } void Term::collect_subclasses( Fixed_term_Commalist* ns,Cd_graph* schema ) { DEM_TRACE("Term","void Term::collect_subclasses(Fixed_term_Commalist* ns,Cd_graph* schema)"); // prefix class wrappers Vertex * v = this->get_vertex(); TermRef* r = this->get_moduleRef(); /* it should be LocalRef */ Fixed_term_list_iterator fnext(*ns); Fixed_term* feach; while (feach = fnext()) if (feach->get_vertex()->get_vertex()->get_vertex_name()-> g_equal(v->get_vertex_name())) break; if (feach == NULL) { Normal * n = new Normal(); n->set_vertex(new Vertex()); n->get_vertex()->set_vertex_name((DemIdent*)v->get_vertex_name()->g_copy()); n->set_moduleRef((TermRef*)r->g_copy()); Fixed_term* f = new Fixed_term(); f->set_vertex(n); ns->append(f); } Adjacency_list_iterator next(*schema->get_adjacencies()); Adjacency* each; while (each = next()) if (each->get_source()->get_vertex_name()->g_equal(v->get_vertex_name())) break; assert(each); each->get_ns()->collect_subclasses(each->get_source(), ns, schema); // suffix class wrappers } void Neighbors::collect_subclasses( Vertex* source,Fixed_term_Commalist* ns,Cd_graph* schema ) { DEM_TRACE("Neighbors","void Neighbors::collect_subclasses(Vertex* source,Fixed_term_Commalist* ns,Cd_graph* schema)"); // prefix class wrappers // suffix class wrappers } void Alternat_ns::collect_subclasses( Vertex* source,Fixed_term_Commalist* ns,Cd_graph* schema ) { DEM_TRACE("Alternat_ns","void Alternat_ns::collect_subclasses(Vertex* source,Fixed_term_Commalist* ns,Cd_graph* schema)"); // prefix class wrappers if (alternat_ns) alternat_ns->collect_subclasses(source, ns, schema); // suffix class wrappers } void Term_Barlist::collect_subclasses( Vertex* source,Fixed_term_Commalist* ns,Cd_graph* schema ) { DEM_TRACE("Term_Barlist","void Term_Barlist::collect_subclasses(Vertex* source,Fixed_term_Commalist* ns,Cd_graph* schema)"); // prefix class wrappers int noinhedges = 1; // check whether there are inheritance edges from alternatives to source Term_list_iterator nextt(*this); Term* eacht; while (eacht = nextt()) { Adjacency_list_iterator nexta(*schema->get_adjacencies()); Adjacency* eacha; while (eacha = nexta()) if (eacha->get_source()->get_vertex_name() ->g_equal(eacht->get_vertex()->get_vertex_name())) break; assert(eacha); if (eacha->get_superclasses() == NULL) continue; Vertex_list_iterator nextv(*eacha->get_superclasses()); Vertex* eachv; while (eachv = nextv()) if (eachv->get_vertex_name()->g_equal(source->get_vertex_name())) break; if (eachv) { noinhedges = 0; break; } } // either give a warning or ship code fownwards Term_list_iterator t_next(*this); Term* t_each; while (t_each = t_next()) { Adjacency_list_iterator a_next(*schema->get_adjacencies()); Adjacency* a_each; while (a_each = a_next()) if (a_each->get_source()->get_vertex_name() ->g_equal(t_each->get_vertex()->get_vertex_name())) break; assert(a_each); if (a_each->get_superclasses() == NULL) { t_each->collect_subclasses(ns, schema); continue; } Vertex_list_iterator v_next(*a_each->get_superclasses()); Vertex* v_each; while (v_each = v_next()) if (v_each->get_vertex_name()->g_equal( source->get_vertex_name())) break; if (v_each) continue; if (noinhedges) t_each->collect_subclasses(ns,schema); else { derror('w',1," class '"); t_each->get_vertex()->get_vertex_name()->pp(); cout << "' are not using code belong to superclass '"; source->get_vertex_name()->pp(); cout << endl; } } // suffix class wrappers }