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 |