Iterate through edges. */
| 191 | |
| 192 | /** Iterate through edges. */ |
| 193 | class 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 | { |
no test coverage detected