klao@946: // -*- c++ -*- klao@946: klao@946: #ifndef LEMON_EXTENDABLE_GRAPH_EXTENDER_H klao@946: #define LEMON_EXTENDABLE_GRAPH_EXTENDER_H klao@946: klao@946: namespace lemon { klao@946: klao@946: template klao@946: class ExtendableGraphExtender : public _Base { klao@946: public: klao@946: klao@946: typedef ExtendableGraphExtender Graph; klao@946: typedef _Base Parent; klao@946: klao@946: typedef typename Parent::Node Node; klao@946: typedef typename Parent::Edge Edge; klao@946: klao@946: Node addNode() { klao@946: Node node = Parent::addNode(); deba@1039: Parent::getNotifier(Node()).add(node); klao@946: return node; klao@946: } klao@946: klao@946: Edge addEdge(const Node& from, const Node& to) { klao@946: Edge edge = Parent::addEdge(from, to); deba@1039: Parent::getNotifier(Edge()).add(edge); klao@946: return edge; klao@946: } klao@946: klao@946: }; klao@946: klao@1022: template deba@1842: class ExtendableEdgeSetExtender : public _Base { deba@1842: public: deba@1842: deba@1842: typedef ExtendableEdgeSetExtender Graph; deba@1842: typedef _Base Parent; deba@1842: deba@1842: typedef typename Parent::Edge Edge; deba@1842: typedef typename Parent::Node Node; deba@1842: deba@1842: Edge addEdge(const Node& from, const Node& to) { deba@1842: Edge edge = Parent::addEdge(from, to); deba@1842: Parent::getNotifier(Edge()).add(edge); deba@1842: return edge; deba@1842: } deba@1842: deba@1842: }; deba@1842: deba@1842: template klao@1022: class ExtendableUndirGraphExtender : public _Base { klao@1022: public: klao@1022: klao@1022: typedef ExtendableUndirGraphExtender Graph; klao@1022: typedef _Base Parent; klao@1022: klao@1022: typedef typename Parent::Node Node; klao@1022: typedef typename Parent::Edge Edge; klao@1022: typedef typename Parent::UndirEdge UndirEdge; klao@1022: klao@1022: Node addNode() { klao@1022: Node node = Parent::addNode(); deba@1039: Parent::getNotifier(Node()).add(node); klao@1022: return node; klao@1022: } klao@1022: klao@1022: UndirEdge addEdge(const Node& from, const Node& to) { klao@1022: UndirEdge uedge = Parent::addEdge(from, to); deba@1039: Parent::getNotifier(UndirEdge()).add(uedge); klao@1022: deba@1414: std::vector edges; deba@1627: edges.push_back(Parent::direct(uedge, true)); deba@1627: edges.push_back(Parent::direct(uedge, false)); deba@1414: Parent::getNotifier(Edge()).add(edges); klao@1022: klao@1022: return uedge; klao@1022: } klao@1022: klao@1022: }; klao@1022: deba@1842: template deba@1842: class ExtendableUndirEdgeSetExtender : public _Base { deba@1842: public: deba@1842: deba@1842: typedef ExtendableUndirEdgeSetExtender Graph; deba@1842: typedef _Base Parent; deba@1842: deba@1842: typedef typename Parent::Node Node; deba@1842: typedef typename Parent::Edge Edge; deba@1842: typedef typename Parent::UndirEdge UndirEdge; deba@1842: deba@1842: UndirEdge addEdge(const Node& from, const Node& to) { deba@1842: UndirEdge uedge = Parent::addEdge(from, to); deba@1842: Parent::getNotifier(UndirEdge()).add(uedge); deba@1842: deba@1842: std::vector edges; deba@1842: edges.push_back(Parent::direct(uedge, true)); deba@1842: edges.push_back(Parent::direct(uedge, false)); deba@1842: Parent::getNotifier(Edge()).add(edges); deba@1842: deba@1842: return uedge; deba@1842: } deba@1842: deba@1842: }; deba@1842: deba@1820: deba@1820: template deba@1820: class ExtendableUndirBipartiteGraphExtender : public _Base { deba@1820: public: deba@1820: deba@1820: typedef _Base Parent; deba@1820: typedef ExtendableUndirBipartiteGraphExtender Graph; deba@1820: deba@1820: typedef typename Parent::Node Node; deba@1820: typedef typename Parent::LowerNode LowerNode; deba@1820: typedef typename Parent::UpperNode UpperNode; deba@1820: typedef typename Parent::Edge Edge; deba@1820: typedef typename Parent::UndirEdge UndirEdge; deba@1820: deba@1820: Node addUpperNode() { deba@1820: Node node = Parent::addUpperNode(); deba@1820: Parent::getNotifier(UpperNode()).add(node); deba@1820: Parent::getNotifier(Node()).add(node); deba@1820: return node; deba@1820: } deba@1820: deba@1820: Node addLowerNode() { deba@1820: Node node = Parent::addLowerNode(); deba@1820: Parent::getNotifier(LowerNode()).add(node); deba@1820: Parent::getNotifier(Node()).add(node); deba@1820: return node; deba@1820: } deba@1820: deba@1820: UndirEdge addEdge(const Node& source, const Node& target) { deba@1820: UndirEdge undiredge = Parent::addEdge(source, target); deba@1820: Parent::getNotifier(UndirEdge()).add(undiredge); deba@1820: deba@1820: std::vector edges; deba@1820: edges.push_back(Parent::direct(undiredge, true)); deba@1820: edges.push_back(Parent::direct(undiredge, false)); deba@1820: Parent::getNotifier(Edge()).add(edges); deba@1820: deba@1820: return undiredge; deba@1820: } deba@1820: deba@1820: }; deba@1820: klao@946: } klao@946: klao@946: #endif