| 147 | |
| 148 | /** Iterate through edges. */ |
| 149 | class edge_iterator |
| 150 | : public std::iterator<std::input_iterator_tag, edge_descriptor> |
| 151 | { |
| 152 | void nextVertex() |
| 153 | { |
| 154 | vertex_iterator vlast = m_g->vertices().second; |
| 155 | for (; m_vit != vlast; ++m_vit) { |
| 156 | std::pair<adjacency_iterator, adjacency_iterator> |
| 157 | adj = m_g->adjacent_vertices(*m_vit); |
| 158 | if (adj.first != adj.second) { |
| 159 | m_eit = adj.first; |
| 160 | return; |
| 161 | } |
| 162 | } |
| 163 | // Set m_eit to a known value. |
| 164 | static const adjacency_iterator s_eitNULL; |
| 165 | m_eit = s_eitNULL; |
| 166 | } |
| 167 | |
| 168 | public: |
| 169 | edge_iterator() { } |
| 170 | edge_iterator(const DirectedGraph* g, const vertex_iterator& vit) |
| 171 | : m_g(g), m_vit(vit) |
| 172 | { |
| 173 | nextVertex(); |
| 174 | } |
| 175 | |
| 176 | edge_descriptor operator*() const |
| 177 | { |
| 178 | return edge_descriptor(*m_vit, *m_eit); |
| 179 | } |
| 180 | |
| 181 | const edge_property_type& get_property() const |
| 182 | { |
| 183 | return m_eit->get_property(); |
| 184 | } |
| 185 | |
| 186 | bool operator==(const edge_iterator& it) const |
| 187 | { |
| 188 | return m_vit == it.m_vit && m_eit == it.m_eit; |
| 189 | } |
| 190 | |
| 191 | bool operator!=(const edge_iterator& it) const |
| 192 | { |
| 193 | return !(*this == it); |
| 194 | } |
| 195 | |
| 196 | edge_iterator& operator++() |
| 197 | { |
| 198 | if (++m_eit == m_g->adjacent_vertices(*m_vit).second) { |
| 199 | ++m_vit; |
| 200 | nextVertex(); |
| 201 | } |
| 202 | return *this; |
| 203 | } |
| 204 | |
| 205 | edge_iterator operator++(int) |
| 206 | { |
no test coverage detected