// file : cutl/container/graph.txx // author : Boris Kolpackov // copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC // license : MIT; see accompanying LICENSE file namespace cutl { namespace container { // Nodes. // template template T& graph:: new_node () { shared_ptr node (new (shared) T); nodes_[node.get ()] = node; return *node; } template template T& graph:: new_node (A0 const& a0) { shared_ptr node (new (shared) T (a0)); nodes_[node.get ()] = node; return *node; } template template T& graph:: new_node (A0 const& a0, A1 const& a1) { shared_ptr node (new (shared) T (a0, a1)); nodes_[node.get ()] = node; return *node; } template template T& graph:: new_node (A0 const& a0, A1 const& a1, A2 const& a2) { shared_ptr node (new (shared) T (a0, a1, a2)); nodes_[node.get ()] = node; return *node; } template template T& graph:: new_node (A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3) { shared_ptr node (new (shared) T (a0, a1, a2, a3)); nodes_[node.get ()] = node; return *node; } template template T& graph:: new_node (A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4) { shared_ptr node (new (shared) T (a0, a1, a2, a3, a4)); nodes_[node.get ()] = node; return *node; } template template T& graph:: new_node (A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4, A5 const& a5) { shared_ptr node (new (shared) T (a0, a1, a2, a3, a4, a5)); nodes_[node.get ()] = node; return *node; } template template T& graph:: new_node (A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4, A5 const& a5, A6 const& a6) { shared_ptr node (new (shared) T (a0, a1, a2, a3, a4, a5, a6)); nodes_[node.get ()] = node; return *node; } template template T& graph:: new_node (A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4, A5 const& a5, A6 const& a6, A7 const& a7) { shared_ptr node (new (shared) T (a0, a1, a2, a3, a4, a5, a6, a7)); nodes_[node.get ()] = node; return *node; } template template T& graph:: new_node (A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4, A5 const& a5, A6 const& a6, A7 const& a7, A8 const& a8) { shared_ptr node ( new (shared) T (a0, a1, a2, a3, a4, a5, a6, a7, a8)); nodes_[node.get ()] = node; return *node; } template template T& graph:: new_node (A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4, A5 const& a5, A6 const& a6, A7 const& a7, A8 const& a8, A9 const& a9) { shared_ptr node ( new (shared) T (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)); nodes_[node.get ()] = node; return *node; } // Edges. // template template T& graph:: new_edge (L& l, R& r) { shared_ptr edge (new (shared) T); edges_[edge.get ()] = edge; edge->set_left_node (l); edge->set_right_node (r); l.add_edge_left (*edge); r.add_edge_right (*edge); return *edge; } template template T& graph:: new_edge (L& l, R& r, A0 const& a0) { shared_ptr edge (new (shared) T (a0)); edges_[edge.get ()] = edge; edge->set_left_node (l); edge->set_right_node (r); l.add_edge_left (*edge); r.add_edge_right (*edge); return *edge; } template template T& graph:: new_edge (L& l, R& r, A0 const& a0, A1 const& a1) { shared_ptr edge (new (shared) T (a0, a1)); edges_[edge.get ()] = edge; edge->set_left_node (l); edge->set_right_node (r); l.add_edge_left (*edge); r.add_edge_right (*edge); return *edge; } template template T& graph:: new_edge (L& l, R& r, A0 const& a0, A1 const& a1, A2 const& a2) { shared_ptr edge (new (shared) T (a0, a1, a2)); edges_[edge.get ()] = edge; edge->set_left_node (l); edge->set_right_node (r); l.add_edge_left (*edge); r.add_edge_right (*edge); return *edge; } template template T& graph:: new_edge (L& l, R& r, A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3) { shared_ptr edge (new (shared) T (a0, a1, a2, a3)); edges_[edge.get ()] = edge; edge->set_left_node (l); edge->set_right_node (r); l.add_edge_left (*edge); r.add_edge_right (*edge); return *edge; } template template T& graph:: new_edge (L& l, R& r, A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4) { shared_ptr edge (new (shared) T (a0, a1, a2, a3, a4)); edges_[edge.get ()] = edge; edge->set_left_node (l); edge->set_right_node (r); l.add_edge_left (*edge); r.add_edge_right (*edge); return *edge; } template template T& graph:: new_edge (L& l, R& r, A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4, A5 const& a5) { shared_ptr edge (new (shared) T (a0, a1, a2, a3, a4, a5)); edges_[edge.get ()] = edge; edge->set_left_node (l); edge->set_right_node (r); l.add_edge_left (*edge); r.add_edge_right (*edge); return *edge; } template template void graph:: delete_edge (L& l, R& r, T& edge) { typename edges::iterator i (edges_.find (&edge)); if (i == edges_.end () || nodes_.find (&l) == nodes_.end () || nodes_.find (&r) == nodes_.end ()) throw no_edge (); r.remove_edge_right (edge); l.remove_edge_left (edge); edge.clear_right_node (r); edge.clear_left_node (l); edges_.erase (i); } } }