MCPcopy Create free account
hub / github.com/BirolLab/abyss / edge_iterator

Class edge_iterator

Graph/UndirectedGraph.h:193–260  ·  view source on GitHub ↗

Iterate through edges. */

Source from the content-addressed store, hash-verified

191
192/** Iterate through edges. */
193class edge_iterator
194 : public std::iterator<std::input_iterator_tag, edge_descriptor>
195{
196 void nextVertex()
197 {
198 vertex_iterator vlast = m_g->vertices().second;
199 for (; m_vit != vlast; ++m_vit) {
200 std::pair<adjacency_iterator, adjacency_iterator>
201 adj = m_g->adjacent_vertices(*m_vit);
202 /*
203 * Since each edge exists as both (u, v) and
204 * (v, u), require `adj.first >= *m_vit` to visit only
205 * one of the two possible forms.
206 */
207 if (adj.first != adj.second && *adj.first >= *m_vit) {
208 m_eit = adj.first;
209 return;
210 }
211 }
212 // Set m_eit to a known value.
213 static const adjacency_iterator s_eitNULL;
214 m_eit = s_eitNULL;
215 }
216
217 public:
218 edge_iterator() { }
219 edge_iterator(const UndirectedGraph* g, const vertex_iterator& vit)
220 : m_g(g), m_vit(vit)
221 {
222 nextVertex();
223 }
224
225 edge_descriptor operator*() const
226 {
227 return edge_descriptor(*m_vit, *m_eit);
228 }
229
230 bool operator==(const edge_iterator& it) const
231 {
232 return m_vit == it.m_vit && m_eit == it.m_eit;
233 }
234
235 bool operator!=(const edge_iterator& it) const
236 {
237 return !(*this == it);
238 }
239
240 edge_iterator& operator++()
241 {
242 if (++m_eit == m_g->adjacent_vertices(*m_vit).second) {
243 ++m_vit;
244 nextVertex();
245 }
246 return *this;
247 }
248
249 edge_iterator operator++(int)
250 {

Callers 2

edgesFunction · 0.70
edgesFunction · 0.50

Calls 1

adjacent_verticesMethod · 0.45

Tested by

no test coverage detected