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
 |