1 // (C) Copyright 2007-2009 Andrew Sutton 2 // 3 // Use, modification and distribution are subject to the 4 // Boost Software License, Version 1.0 (See accompanying file 5 // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) 6 7 #ifndef BOOST_GRAPH_DETAIL_INDEX_HPP 8 #define BOOST_GRAPH_DETAIL_INDEX_HPP 9 10 #include <boost/graph/graph_traits.hpp> 11 12 // The structures in this module are responsible for selecting and defining 13 // types for accessing a builting index map. Note that the selection of these 14 // types requires the Graph parameter to model either VertexIndexGraph or 15 // EdgeIndexGraph. 16 17 namespace boost 18 { 19 namespace detail 20 { 21 template <typename Graph> 22 struct vertex_indexer 23 { 24 typedef vertex_index_t index_type; 25 typedef typename property_map<Graph, vertex_index_t>::type map_type; 26 typedef typename property_map<Graph, vertex_index_t>::const_type const_map_type; 27 typedef typename property_traits<map_type>::value_type value_type; 28 typedef typename graph_traits<Graph>::vertex_descriptor key_type; 29 index_mapboost::detail::vertex_indexer30 static const_map_type index_map(const Graph& g) 31 { return get(vertex_index, g); } 32 index_mapboost::detail::vertex_indexer33 static map_type index_map(Graph& g) 34 { return get(vertex_index, g); } 35 indexboost::detail::vertex_indexer36 static value_type index(key_type k, const Graph& g) 37 { return get(vertex_index, g, k); } 38 }; 39 40 template <typename Graph> 41 struct edge_indexer 42 { 43 typedef edge_index_t index_type; 44 typedef typename property_map<Graph, edge_index_t>::type map_type; 45 typedef typename property_map<Graph, edge_index_t>::const_type const_map_type; 46 typedef typename property_traits<map_type>::value_type value_type; 47 typedef typename graph_traits<Graph>::edge_descriptor key_type; 48 index_mapboost::detail::edge_indexer49 static const_map_type index_map(const Graph& g) 50 { return get(edge_index, g); } 51 index_mapboost::detail::edge_indexer52 static map_type index_map(Graph& g) 53 { return get(edge_index, g); } 54 indexboost::detail::edge_indexer55 static value_type index(key_type k, const Graph& g) 56 { return get(edge_index, g, k); } 57 }; 58 59 // NOTE: The Graph parameter MUST be a model of VertexIndexGraph or 60 // VertexEdgeGraph - whichever type Key is selecting. 61 template <typename Graph, typename Key> 62 struct choose_indexer 63 { 64 typedef typename mpl::if_< 65 is_same<Key, typename graph_traits<Graph>::vertex_descriptor>, 66 vertex_indexer<Graph>, 67 edge_indexer<Graph> 68 >::type indexer_type; 69 typedef typename indexer_type::index_type index_type; 70 }; 71 } 72 } 73 74 #endif 75