118 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //
 | |
| //=======================================================================
 | |
| // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
 | |
| // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
 | |
| //
 | |
| // Distributed under the Boost Software License, Version 1.0. (See
 | |
| // accompanying file LICENSE_1_0.txt or copy at
 | |
| // http://www.boost.org/LICENSE_1_0.txt)
 | |
| //=======================================================================
 | |
| //
 | |
| #ifndef BOOST_GRAPH_DETAIL_ADJ_LIST_EDGE_ITERATOR_HPP
 | |
| #define BOOST_GRAPH_DETAIL_ADJ_LIST_EDGE_ITERATOR_HPP
 | |
| 
 | |
| #include <iterator>
 | |
| #include <utility>
 | |
| #include <boost/detail/workaround.hpp>
 | |
| 
 | |
| #if BOOST_WORKAROUND( __IBMCPP__, <= 600 )
 | |
| #  define BOOST_GRAPH_NO_OPTIONAL
 | |
| #endif
 | |
| 
 | |
| #ifdef BOOST_GRAPH_NO_OPTIONAL
 | |
| #  define BOOST_GRAPH_MEMBER .
 | |
| #else 
 | |
| #  define BOOST_GRAPH_MEMBER ->
 | |
| #  include <boost/optional.hpp>
 | |
| #endif // ndef BOOST_GRAPH_NO_OPTIONAL
 | |
| 
 | |
| namespace boost {
 | |
| 
 | |
|   namespace detail {
 | |
| 
 | |
|     template <class VertexIterator, class OutEdgeIterator, class Graph>
 | |
|     class adj_list_edge_iterator {
 | |
|       typedef adj_list_edge_iterator self;
 | |
|     public:
 | |
|       typedef std::forward_iterator_tag iterator_category;
 | |
|       typedef typename OutEdgeIterator::value_type value_type;
 | |
|       typedef typename OutEdgeIterator::reference  reference;
 | |
|       typedef typename OutEdgeIterator::pointer    pointer;
 | |
|       typedef typename OutEdgeIterator::difference_type difference_type;
 | |
|       typedef difference_type distance_type;
 | |
| 
 | |
|       inline adj_list_edge_iterator() {}
 | |
| 
 | |
|       inline adj_list_edge_iterator(const self& x) 
 | |
|       : vBegin(x.vBegin), vCurr(x.vCurr), vEnd(x.vEnd),
 | |
|         edges(x.edges), m_g(x.m_g) { }
 | |
| 
 | |
|       template <class G>
 | |
|       inline adj_list_edge_iterator(VertexIterator b, 
 | |
|                                     VertexIterator c,
 | |
|                                     VertexIterator e,
 | |
|                                     const G& g) 
 | |
|         : vBegin(b), vCurr(c), vEnd(e), m_g(&g) {
 | |
|         if ( vCurr != vEnd ) {
 | |
|           while ( vCurr != vEnd && out_degree(*vCurr, *m_g) == 0 )
 | |
|             ++vCurr;
 | |
|           if ( vCurr != vEnd )
 | |
|             edges = out_edges(*vCurr, *m_g);
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       /*Note:
 | |
|         In the directed graph cases, it is fine. 
 | |
|         For undirected graphs, one edge go through twice.
 | |
|       */
 | |
|       inline self& operator++() {
 | |
|         ++edges BOOST_GRAPH_MEMBER first;
 | |
|         if (edges BOOST_GRAPH_MEMBER first == edges BOOST_GRAPH_MEMBER second) 
 | |
|         {
 | |
|           ++vCurr;
 | |
|           while ( vCurr != vEnd && out_degree(*vCurr, *m_g) == 0 )
 | |
|             ++vCurr;
 | |
|           if ( vCurr != vEnd )
 | |
|             edges = out_edges(*vCurr, *m_g);
 | |
|         }
 | |
|         return *this;
 | |
|       }
 | |
|       inline self operator++(int) {
 | |
|         self tmp = *this;
 | |
|         ++(*this);
 | |
|         return tmp;
 | |
|       }
 | |
|       inline value_type operator*() const 
 | |
|       { return *edges BOOST_GRAPH_MEMBER first; } 
 | |
|       inline bool operator==(const self& x) const {
 | |
|         return vCurr == x.vCurr 
 | |
|           && (vCurr == vEnd 
 | |
|               || edges BOOST_GRAPH_MEMBER first == x.edges BOOST_GRAPH_MEMBER first);
 | |
|       }
 | |
|       inline bool operator!=(const self& x) const {
 | |
|         return vCurr != x.vCurr 
 | |
|           || (vCurr != vEnd 
 | |
|               && edges BOOST_GRAPH_MEMBER first != x.edges BOOST_GRAPH_MEMBER first);
 | |
|       }
 | |
|     protected:
 | |
|       VertexIterator vBegin;
 | |
|       VertexIterator vCurr;
 | |
|       VertexIterator vEnd;
 | |
| 
 | |
| #ifdef BOOST_GRAPH_NO_OPTIONAL
 | |
|       std::pair<OutEdgeIterator, OutEdgeIterator> edges;
 | |
| #else
 | |
|       boost::optional<std::pair<OutEdgeIterator, OutEdgeIterator> >
 | |
|         edges;
 | |
| #endif // ndef BOOST_GRAPH_NO_OPTIONAL
 | |
|       const Graph* m_g;
 | |
|     };
 | |
| 
 | |
|   } // namespace detail
 | |
| 
 | |
| }
 | |
| 
 | |
| #undef BOOST_GRAPH_MEMBER
 | |
| 
 | |
| #endif // BOOST_GRAPH_DETAIL_ADJ_LIST_EDGE_ITERATOR_HPP
 | 
