46 } |
46 } |
47 |
47 |
48 }; |
48 }; |
49 |
49 |
50 template <typename _Base> |
50 template <typename _Base> |
51 class ExtendableUndirGraphExtender : public _Base { |
51 class ExtendableUGraphExtender : public _Base { |
52 public: |
52 public: |
53 |
53 |
54 typedef ExtendableUndirGraphExtender Graph; |
54 typedef ExtendableUGraphExtender Graph; |
55 typedef _Base Parent; |
55 typedef _Base Parent; |
56 |
56 |
57 typedef typename Parent::Node Node; |
57 typedef typename Parent::Node Node; |
58 typedef typename Parent::Edge Edge; |
58 typedef typename Parent::Edge Edge; |
59 typedef typename Parent::UndirEdge UndirEdge; |
59 typedef typename Parent::UEdge UEdge; |
60 |
60 |
61 Node addNode() { |
61 Node addNode() { |
62 Node node = Parent::addNode(); |
62 Node node = Parent::addNode(); |
63 Parent::getNotifier(Node()).add(node); |
63 Parent::getNotifier(Node()).add(node); |
64 return node; |
64 return node; |
65 } |
65 } |
66 |
66 |
67 UndirEdge addEdge(const Node& from, const Node& to) { |
67 UEdge addEdge(const Node& from, const Node& to) { |
68 UndirEdge uedge = Parent::addEdge(from, to); |
68 UEdge uedge = Parent::addEdge(from, to); |
69 Parent::getNotifier(UndirEdge()).add(uedge); |
69 Parent::getNotifier(UEdge()).add(uedge); |
70 |
70 |
71 std::vector<Edge> edges; |
71 std::vector<Edge> edges; |
72 edges.push_back(Parent::direct(uedge, true)); |
72 edges.push_back(Parent::direct(uedge, true)); |
73 edges.push_back(Parent::direct(uedge, false)); |
73 edges.push_back(Parent::direct(uedge, false)); |
74 Parent::getNotifier(Edge()).add(edges); |
74 Parent::getNotifier(Edge()).add(edges); |
77 } |
77 } |
78 |
78 |
79 }; |
79 }; |
80 |
80 |
81 template <typename _Base> |
81 template <typename _Base> |
82 class ExtendableUndirEdgeSetExtender : public _Base { |
82 class ExtendableUEdgeSetExtender : public _Base { |
83 public: |
83 public: |
84 |
84 |
85 typedef ExtendableUndirEdgeSetExtender Graph; |
85 typedef ExtendableUEdgeSetExtender Graph; |
86 typedef _Base Parent; |
86 typedef _Base Parent; |
87 |
87 |
88 typedef typename Parent::Node Node; |
88 typedef typename Parent::Node Node; |
89 typedef typename Parent::Edge Edge; |
89 typedef typename Parent::Edge Edge; |
90 typedef typename Parent::UndirEdge UndirEdge; |
90 typedef typename Parent::UEdge UEdge; |
91 |
91 |
92 UndirEdge addEdge(const Node& from, const Node& to) { |
92 UEdge addEdge(const Node& from, const Node& to) { |
93 UndirEdge uedge = Parent::addEdge(from, to); |
93 UEdge uedge = Parent::addEdge(from, to); |
94 Parent::getNotifier(UndirEdge()).add(uedge); |
94 Parent::getNotifier(UEdge()).add(uedge); |
95 |
95 |
96 std::vector<Edge> edges; |
96 std::vector<Edge> edges; |
97 edges.push_back(Parent::direct(uedge, true)); |
97 edges.push_back(Parent::direct(uedge, true)); |
98 edges.push_back(Parent::direct(uedge, false)); |
98 edges.push_back(Parent::direct(uedge, false)); |
99 Parent::getNotifier(Edge()).add(edges); |
99 Parent::getNotifier(Edge()).add(edges); |
103 |
103 |
104 }; |
104 }; |
105 |
105 |
106 |
106 |
107 template <typename _Base> |
107 template <typename _Base> |
108 class ExtendableUndirBipartiteGraphExtender : public _Base { |
108 class ExtendableUBipartiteGraphExtender : public _Base { |
109 public: |
109 public: |
110 |
110 |
111 typedef _Base Parent; |
111 typedef _Base Parent; |
112 typedef ExtendableUndirBipartiteGraphExtender Graph; |
112 typedef ExtendableUBipartiteGraphExtender Graph; |
113 |
113 |
114 typedef typename Parent::Node Node; |
114 typedef typename Parent::Node Node; |
115 typedef typename Parent::LowerNode LowerNode; |
115 typedef typename Parent::LowerNode LowerNode; |
116 typedef typename Parent::UpperNode UpperNode; |
116 typedef typename Parent::UpperNode UpperNode; |
117 typedef typename Parent::Edge Edge; |
117 typedef typename Parent::Edge Edge; |
118 typedef typename Parent::UndirEdge UndirEdge; |
118 typedef typename Parent::UEdge UEdge; |
119 |
119 |
120 Node addUpperNode() { |
120 Node addUpperNode() { |
121 Node node = Parent::addUpperNode(); |
121 Node node = Parent::addUpperNode(); |
122 Parent::getNotifier(UpperNode()).add(node); |
122 Parent::getNotifier(UpperNode()).add(node); |
123 Parent::getNotifier(Node()).add(node); |
123 Parent::getNotifier(Node()).add(node); |
129 Parent::getNotifier(LowerNode()).add(node); |
129 Parent::getNotifier(LowerNode()).add(node); |
130 Parent::getNotifier(Node()).add(node); |
130 Parent::getNotifier(Node()).add(node); |
131 return node; |
131 return node; |
132 } |
132 } |
133 |
133 |
134 UndirEdge addEdge(const Node& source, const Node& target) { |
134 UEdge addEdge(const Node& source, const Node& target) { |
135 UndirEdge undiredge = Parent::addEdge(source, target); |
135 UEdge uedge = Parent::addEdge(source, target); |
136 Parent::getNotifier(UndirEdge()).add(undiredge); |
136 Parent::getNotifier(UEdge()).add(uedge); |
137 |
137 |
138 std::vector<Edge> edges; |
138 std::vector<Edge> edges; |
139 edges.push_back(Parent::direct(undiredge, true)); |
139 edges.push_back(Parent::direct(uedge, true)); |
140 edges.push_back(Parent::direct(undiredge, false)); |
140 edges.push_back(Parent::direct(uedge, false)); |
141 Parent::getNotifier(Edge()).add(edges); |
141 Parent::getNotifier(Edge()).add(edges); |
142 |
142 |
143 return undiredge; |
143 return uedge; |
144 } |
144 } |
145 |
145 |
146 }; |
146 }; |
147 |
147 |
148 } |
148 } |