PageRenderTime 29ms CodeModel.GetById 12ms app.highlight 14ms RepoModel.GetById 1ms app.codeStats 0ms

/Src/Dependencies/Boost/boost/graph/property_iter_range.hpp

http://hadesmem.googlecode.com/
C++ Header | 118 lines | 80 code | 20 blank | 18 comment | 0 complexity | 6bcb72a385a653ed6b5c8de42f028d1d MD5 | raw file
  1
  2// (C) Copyright Francois Faure, iMAGIS-GRAVIR / UJF, 2001.
  3//
  4// Distributed under the Boost Software License, Version 1.0. (See
  5// accompanying file LICENSE_1_0.txt or copy at
  6// http://www.boost.org/LICENSE_1_0.txt)
  7//
  8// Revision History:
  9// 03 May 2001   Jeremy Siek
 10//      Generalized the property map iterator and moved that
 11//      part to boost/property_map.hpp. Also modified to
 12//      differentiate between const/mutable graphs and
 13//      added a workaround to avoid partial specialization.
 14
 15// 02 May 2001   Francois Faure
 16//     Initial version.
 17
 18#ifndef BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP
 19#define BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP
 20
 21#include <boost/property_map/property_map_iterator.hpp>
 22#include <boost/graph/properties.hpp>
 23#include <boost/mpl/if.hpp>
 24#include <boost/type_traits/same_traits.hpp>
 25
 26namespace boost {
 27
 28//======================================================================
 29// graph property iterator range
 30
 31  template <class Graph, class PropertyTag>
 32  class graph_property_iter_range {
 33    typedef typename property_map<Graph, PropertyTag>::type map_type;
 34    typedef typename property_map<Graph, PropertyTag>::const_type 
 35      const_map_type;
 36    typedef typename property_kind<PropertyTag>::type Kind;
 37    typedef typename mpl::if_c<is_same<Kind, vertex_property_tag>::value,
 38       typename graph_traits<Graph>::vertex_iterator,
 39       typename graph_traits<Graph>::edge_iterator>::type iter;
 40  public:
 41    typedef typename property_map_iterator_generator<map_type, iter>::type 
 42      iterator;
 43    typedef typename property_map_iterator_generator<const_map_type, iter>
 44      ::type const_iterator;
 45    typedef std::pair<iterator, iterator> type;
 46    typedef std::pair<const_iterator, const_iterator> const_type;
 47  };
 48
 49  namespace detail {
 50
 51    template<class Graph,class Tag>
 52    typename graph_property_iter_range<Graph,Tag>::type
 53    get_property_iter_range_kind(Graph& graph, const Tag& tag, 
 54                                 const vertex_property_tag& )
 55    {
 56      typedef typename graph_property_iter_range<Graph,Tag>::iterator iter;
 57      return std::make_pair(iter(vertices(graph).first, get(tag, graph)),
 58                            iter(vertices(graph).second, get(tag, graph)));
 59    }
 60
 61    template<class Graph,class Tag>
 62    typename graph_property_iter_range<Graph,Tag>::const_type
 63    get_property_iter_range_kind(const Graph& graph, const Tag& tag, 
 64                                 const vertex_property_tag& )
 65    {
 66      typedef typename graph_property_iter_range<Graph,Tag>
 67        ::const_iterator iter;
 68      return std::make_pair(iter(vertices(graph).first, get(tag, graph)),
 69                            iter(vertices(graph).second, get(tag, graph)));
 70    }
 71
 72
 73    template<class Graph,class Tag>
 74    typename graph_property_iter_range<Graph,Tag>::type
 75    get_property_iter_range_kind(Graph& graph, const Tag& tag, 
 76                                 const edge_property_tag& )
 77    {
 78      typedef typename graph_property_iter_range<Graph,Tag>::iterator iter;
 79      return std::make_pair(iter(edges(graph).first, get(tag, graph)),
 80                            iter(edges(graph).second, get(tag, graph)));
 81    }
 82
 83    template<class Graph,class Tag>
 84    typename graph_property_iter_range<Graph,Tag>::const_type
 85    get_property_iter_range_kind(const Graph& graph, const Tag& tag, 
 86                                 const edge_property_tag& )
 87    {
 88      typedef typename graph_property_iter_range<Graph,Tag>
 89        ::const_iterator iter;
 90      return std::make_pair(iter(edges(graph).first, get(tag, graph)),
 91                            iter(edges(graph).second, get(tag, graph)));
 92    }
 93
 94  } // namespace detail
 95
 96  //======================================================================
 97  // get an iterator range of properties
 98
 99  template<class Graph, class Tag>
100  typename graph_property_iter_range<Graph, Tag>::type
101  get_property_iter_range(Graph& graph, const Tag& tag)
102  {
103    typedef typename property_kind<Tag>::type Kind;
104    return detail::get_property_iter_range_kind(graph, tag, Kind());
105  }
106
107  template<class Graph, class Tag>
108  typename graph_property_iter_range<Graph, Tag>::const_type
109  get_property_iter_range(const Graph& graph, const Tag& tag)
110  {
111    typedef typename property_kind<Tag>::type Kind;
112    return detail::get_property_iter_range_kind(graph, tag, Kind());
113  }
114
115} // namespace boost
116
117
118#endif // BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP