// file : CCF/IDL2/SemanticGraph/Graph.tpp // author : Boris Kolpackov // cvs-id : $Id$ namespace CCF { namespace IDL2 { namespace SemanticGraph { // Graph // // template template T& Graph:: new_node () { T* n (new T); //@@ auto nodes_.insert (n); return *n; } template template T& Graph:: new_node (A0 const& a0) { T* n (new T (a0)); //@@ auto nodes_.insert (n); return *n; } template template T& Graph:: new_node (A0 const& a0, A1 const& a1) { T* n (new T (a0, a1)); //@@ auto nodes_.insert (n); return *n; } template template T& Graph:: new_node (A0 const& a0, A1 const& a1, A2 const& a2) { T* n (new T (a0, a1, a2)); //@@ auto nodes_.insert (n); return *n; } template template T& Graph:: new_node (A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3) { T* n (new T (a0, a1, a2, a3)); //@@ auto nodes_.insert (n); return *n; } template void Graph:: delete_node (N const& nr) { N* n (&nr); for (E* e (n->remove_edge_ ()); e != 0; e = n->remove_edge_ ()) { // One endpoint of the edge has removed this edge from // its edge set. Now handle the other endpoint. // if (e->left_ () == n) e->right_ ()->remove_edge_ (e); else e->left_ ()->remove_edge_ (e); // Delete the edge. // edges_.erase (e); delete e; //@@ auto } nodes_.erase (n); delete n; //@@ auto } template template T& Graph:: new_edge (X& left, Y& right) { T* e (new T); //@@ auto e->set_left_node (left); e->set_right_node (right); left.add_edge_left (*e); right.add_edge_right (*e); edges_.insert (e); return *e; } template template T& Graph:: new_edge (X& left, Y& right, A0 const& a0) { T* e (new T (a0)); //@@ auto e->set_left_node (left); e->set_right_node (right); left.add_edge_left (*e); right.add_edge_right (*e); edges_.insert (e); return *e; } template template T& Graph:: new_edge (X& left, Y& right, A0 const& a0, A1 const& a1) { T* e (new T (a0, a1)); //@@ auto e->set_left_node (left); e->set_right_node (right); left.add_edge_left (*e); right.add_edge_right (*e); edges_.insert (e); return *e; } template void Graph:: delete_edge (E const& er) { E* e (&er); e->left_ ()->remove_edge_ (e); e->right_ ()->remove_edge_ (e); edges_.erase (e); delete e; //@@ auto } template Graph:: ~Graph () { //@@ auto for (typename Edges_::iterator i (edges_.begin ()), end (edges_.end ()); i != end; ++i) delete *i; for (typename Nodes_::iterator i (nodes_.begin ()), end (nodes_.end ()); i != end; ++i) delete *i; } } } }