// file : cutl/container/graph.hxx // copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC // license : MIT; see accompanying LICENSE file #ifndef CUTL_CONTAINER_GRAPH_HXX #define CUTL_CONTAINER_GRAPH_HXX #include #include #include #include namespace cutl { namespace container { struct LIBCUTL_EXPORT no_edge: exception {}; struct LIBCUTL_EXPORT no_node: exception {}; template class graph { public: typedef N node_base; typedef E edge_base; public: template T& new_node (); template T& new_node (A0 const&); template T& new_node (A0 const&, A1 const&); template T& new_node (A0 const&, A1 const&, A2 const&); template T& new_node (A0 const&, A1 const&, A2 const&, A3 const&); template T& new_node (A0 const&, A1 const&, A2 const&, A3 const&, A4 const&); template T& new_node (A0 const&, A1 const&, A2 const&, A3 const&, A4 const&, A5 const&); template T& new_node (A0 const&, A1 const&, A2 const&, A3 const&, A4 const&, A5 const&, A6 const&); template T& new_node (A0 const&, A1 const&, A2 const&, A3 const&, A4 const&, A5 const&, A6 const&, A7 const&); template T& new_node (A0 const&, A1 const&, A2 const&, A3 const&, A4 const&, A5 const&, A6 const&, A7 const&, A8 const&); template T& new_node (A0 const&, A1 const&, A2 const&, A3 const&, A4 const&, A5 const&, A6 const&, A7 const&, A8 const&, A9 const&); public: template T& new_edge (L&, R&); template T& new_edge (L&, R&, A0 const&); template T& new_edge (L&, R&, A0 const&, A1 const&); template T& new_edge (L&, R&, A0 const&, A1 const&, A2 const&); template T& new_edge (L&, R&, A0 const&, A1 const&, A2 const&, A3 const&); template T& new_edge (L&, R&, A0 const&, A1 const&, A2 const&, A3 const&, A4 const&); template T& new_edge (L&, R&, A0 const&, A1 const&, A2 const&, A3 const&, A4 const&, A5 const&); // Functions to reset edge's nodes. // public: template void reset_left_node (TE& edge, TN& node) { edge.set_left_node (node); } template void reset_right_node (TE& edge, TN& node) { edge.set_right_node (node); } // Functions to add edges to a node. // public: template void add_edge_left (TN& node, TE& edge) { node.add_edge_left (edge); } template void add_edge_right (TN& node, TE& edge) { node.add_edge_right (edge); } // Functions to delete edges and nodes. In order to delete a // a node without leaving any dangling edges you need to make // sure that each edge pointing to it is either deleted or reset // to some other node. // public: template void delete_edge (L& left_node, R& right_node, T& edge); void delete_node (node_base& node) { if (nodes_.erase (&node) == 0) throw no_node (); } public: graph () {} private: graph (graph const&); graph& operator= (graph const&); protected: typedef shared_ptr node_ptr; typedef shared_ptr edge_ptr; typedef std::map nodes; typedef std::map edges; nodes nodes_; edges edges_; }; } } #include #endif // CUTL_CONTAINER_GRAPH_HXX