Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r77549 - in trunk/boost: graph graph/detail graph/distributed graph/distributed/adjlist pending pending/detail
From: jewillco_at_[hidden]
Date: 2012-03-25 17:04:04


Author: jewillco
Date: 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
New Revision: 77549
URL: http://svn.boost.org/trac/boost/changeset/77549

Log:
Changed property lookup code to simplify graph implementations (remove most special-casing of bundled properties), made CSR graph work with non-bundled properties (probably), split named parameter algorithms to not use property map code
Text files modified:
   trunk/boost/graph/adjacency_list.hpp | 167 --------------
   trunk/boost/graph/adjacency_list_io.hpp | 6
   trunk/boost/graph/adjacency_matrix.hpp | 464 ++++++++++++++-------------------------
   trunk/boost/graph/bellman_ford_shortest_paths.hpp | 2
   trunk/boost/graph/betweenness_centrality.hpp | 6
   trunk/boost/graph/biconnected_components.hpp | 26 +-
   trunk/boost/graph/breadth_first_search.hpp | 49 +++
   trunk/boost/graph/compressed_sparse_row_graph.hpp | 180 +++++++++-----
   trunk/boost/graph/copy.hpp | 4
   trunk/boost/graph/detail/adjacency_list.hpp | 83 ++----
   trunk/boost/graph/directed_graph.hpp | 43 ---
   trunk/boost/graph/distributed/adjacency_list.hpp | 24 ++
   trunk/boost/graph/distributed/adjlist/redistribute.hpp | 4
   trunk/boost/graph/distributed/betweenness_centrality.hpp | 18
   trunk/boost/graph/distributed/breadth_first_search.hpp | 2
   trunk/boost/graph/distributed/compressed_sparse_row_graph.hpp | 299 +++++--------------------
   trunk/boost/graph/distributed/dijkstra_shortest_paths.hpp | 10
   trunk/boost/graph/distributed/page_rank.hpp | 1
   trunk/boost/graph/edmonds_karp_max_flow.hpp | 14
   trunk/boost/graph/fruchterman_reingold.hpp | 6
   trunk/boost/graph/graph_traits.hpp | 44 ++-
   trunk/boost/graph/named_function_params.hpp | 236 ++++++++++----------
   trunk/boost/graph/named_graph.hpp | 49 ----
   trunk/boost/graph/neighbor_bfs.hpp | 6
   trunk/boost/graph/properties.hpp | 193 +++-------------
   trunk/boost/graph/reverse_graph.hpp | 58 ++--
   trunk/boost/graph/strong_components.hpp | 8
   trunk/boost/graph/subgraph.hpp | 253 ++-------------------
   trunk/boost/graph/undirected_dfs.hpp | 6
   trunk/boost/graph/undirected_graph.hpp | 80 +-----
   trunk/boost/pending/detail/property.hpp | 139 -----------
   trunk/boost/pending/property.hpp | 230 ++++++++++++++-----
   trunk/boost/pending/property_serialize.hpp | 2
   33 files changed, 943 insertions(+), 1769 deletions(-)

Modified: trunk/boost/graph/adjacency_list.hpp
==============================================================================
--- trunk/boost/graph/adjacency_list.hpp (original)
+++ trunk/boost/graph/adjacency_list.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -51,11 +51,6 @@
   // adjacency_list, and the container_gen traits class which is used
   // to map the selectors to the container type used to implement the
   // graph.
- //
- // The main container_gen traits class uses partial specialization,
- // so we also include a workaround.
-
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 
 #if !defined BOOST_NO_SLIST
   struct slistS {};
@@ -130,93 +125,6 @@
     typedef boost::unordered_multiset<ValueType> type;
   };
 
-#else // !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
-
-#if !defined BOOST_NO_SLIST
- struct slistS {
- template <class T>
- struct bind_ { typedef BOOST_STD_EXTENSION_NAMESPACE::slist<T> type; };
- };
-#endif
-
- struct vecS {
- template <class T>
- struct bind_ { typedef std::vector<T> type; };
- };
-
- struct listS {
- template <class T>
- struct bind_ { typedef std::list<T> type; };
- };
-
- struct setS {
- template <class T>
- struct bind_ { typedef std::set<T, std::less<T> > type; };
- };
-
-
- struct mapS {
- template <class T>
- struct bind_ { typedef std::set<T, std::less<T> > type; };
- };
-
- struct multisetS {
- template <class T>
- struct bind_ { typedef std::multiset<T, std::less<T> > type; };
- };
-
- struct multimapS {
- template <class T>
- struct bind_ { typedef std::multiset<T, std::less<T> > type; };
- };
-
- struct hash_setS {
- template <class T>
- struct bind_ { typedef boost::unordered_set<T> type; };
- };
-
- struct hash_mapS {
- template <class T>
- struct bind_ { typedef boost::unordered_set<T> type; };
- };
-
- struct hash_multisetS {
- template <class T>
- struct bind_ { typedef boost::unordered_multiset<T> type; };
- };
-
- struct hash_multimapS {
- template <class T>
- struct bind_ { typedef boost::unordered_multiset<T> type; };
- };
-
- template <class Selector> struct container_selector {
- typedef vecS type;
- };
-
-#define BOOST_CONTAINER_SELECTOR(NAME) \
- template <> struct container_selector<NAME> { \
- typedef NAME type; \
- }
-
- BOOST_CONTAINER_SELECTOR(vecS);
- BOOST_CONTAINER_SELECTOR(listS);
- BOOST_CONTAINER_SELECTOR(mapS);
- BOOST_CONTAINER_SELECTOR(setS);
- BOOST_CONTAINER_SELECTOR(multisetS);
- BOOST_CONTAINER_SELECTOR(hash_mapS);
-#if !defined BOOST_NO_SLIST
- BOOST_CONTAINER_SELECTOR(slistS);
-#endif
-
- template <class Selector, class ValueType>
- struct container_gen {
- typedef typename container_selector<Selector>::type Select;
- typedef typename Select:: template bind_<ValueType>::type type;
- };
-
-#endif // !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
-
   template <class StorageSelector>
   struct parallel_edge_traits { };
 
@@ -354,13 +262,7 @@
       adjacency_list<OutEdgeListS,VertexListS,DirectedS,
                      VertexProperty,EdgeProperty,GraphProperty,EdgeListS>,
       VertexListS, OutEdgeListS, DirectedS,
-#if !defined(BOOST_GRAPH_NO_BUNDLED_PROPERTIES)
- typename detail::retag_property_list<vertex_bundle_t,
- VertexProperty>::type,
- typename detail::retag_property_list<edge_bundle_t, EdgeProperty>::type,
-#else
       VertexProperty, EdgeProperty,
-#endif
       GraphProperty, EdgeListS>::type,
       // Support for named vertices
       public graph::maybe_named_graph<
@@ -371,25 +273,14 @@
         VertexProperty>
   {
       public:
-#if !defined(BOOST_GRAPH_NO_BUNDLED_PROPERTIES)
- typedef typename graph_detail::graph_prop<GraphProperty>::property graph_property_type;
- typedef typename graph_detail::graph_prop<GraphProperty>::bundle graph_bundled;
-
- typedef typename graph_detail::vertex_prop<VertexProperty>::property vertex_property_type;
- typedef typename graph_detail::vertex_prop<VertexProperty>::bundle vertex_bundled;
-
- typedef typename graph_detail::edge_prop<EdgeProperty>::property edge_property_type;
- typedef typename graph_detail::edge_prop<EdgeProperty>::bundle edge_bundled;
-#else
     typedef GraphProperty graph_property_type;
- typedef no_graph_bundle graph_bundled;
+ typedef typename lookup_one_property<GraphProperty, graph_bundle_t>::type graph_bundled;
 
     typedef VertexProperty vertex_property_type;
- typedef no_vertex_bundle vertex_bundled;
+ typedef typename lookup_one_property<VertexProperty, vertex_bundle_t>::type vertex_bundled;
 
     typedef EdgeProperty edge_property_type;
- typedef no_edge_bundle edge_bundled;
-#endif
+ typedef typename lookup_one_property<EdgeProperty, edge_bundle_t>::type edge_bundled;
 
   private:
     typedef adjacency_list self;
@@ -545,58 +436,6 @@
     return e.m_target;
   }
 
- // Support for bundled properties
-#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
- template<typename OutEdgeListS, typename VertexListS, typename DirectedS, typename VertexProperty,
- typename EdgeProperty, typename GraphProperty, typename EdgeListS, typename T, typename Bundle>
- inline
- typename property_map<adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty,
- GraphProperty, EdgeListS>, T Bundle::*>::type
- get(T Bundle::* p, adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty,
- GraphProperty, EdgeListS>& g)
- {
- typedef typename property_map<adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty,
- EdgeProperty, GraphProperty, EdgeListS>, T Bundle::*>::type
- result_type;
- return result_type(&g, p);
- }
-
- template<typename OutEdgeListS, typename VertexListS, typename DirectedS, typename VertexProperty,
- typename EdgeProperty, typename GraphProperty, typename EdgeListS, typename T, typename Bundle>
- inline
- typename property_map<adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty,
- GraphProperty, EdgeListS>, T Bundle::*>::const_type
- get(T Bundle::* p, adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty,
- GraphProperty, EdgeListS> const & g)
- {
- typedef typename property_map<adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty,
- EdgeProperty, GraphProperty, EdgeListS>, T Bundle::*>::const_type
- result_type;
- return result_type(&g, p);
- }
-
- template<typename OutEdgeListS, typename VertexListS, typename DirectedS, typename VertexProperty,
- typename EdgeProperty, typename GraphProperty, typename EdgeListS, typename T, typename Bundle,
- typename Key>
- inline T
- get(T Bundle::* p, adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty,
- GraphProperty, EdgeListS> const & g, const Key& key)
- {
- return get(get(p, g), key);
- }
-
- template<typename OutEdgeListS, typename VertexListS, typename DirectedS, typename VertexProperty,
- typename EdgeProperty, typename GraphProperty, typename EdgeListS, typename T, typename Bundle,
- typename Key>
- inline void
- put(T Bundle::* p, adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty,
- GraphProperty, EdgeListS>& g, const Key& key, const T& value)
- {
- put(get(p, g), key, value);
- }
-
-#endif
-
 // Mutability Traits
 template <ADJLIST_PARAMS>
 struct graph_mutability_traits<ADJLIST> {

Modified: trunk/boost/graph/adjacency_list_io.hpp
==============================================================================
--- trunk/boost/graph/adjacency_list_io.hpp (original)
+++ trunk/boost/graph/adjacency_list_io.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -40,7 +40,7 @@
 template<class Tag, class Value, class Next>
 std::istream& operator >> ( std::istream& in, property<Tag,Value,Next>& p )
 {
- in >> p.m_value >> *(static_cast<Next*>(&p)); // houpla !!
+ in >> p.m_value >> p.m_base; // houpla !!
         return in;
 }
 
@@ -65,7 +65,7 @@
 void get
 ( property<Tag,Value,Next>& p, const V& v, Stag s )
 {
- get( *(static_cast<Next*>(&p)),v,s );
+ get( p.m_base,v,s );
 }
 
 template<class Value, class Next, class V, class Stag>
@@ -82,7 +82,7 @@
 ( property<Tag,Value,Next>& p, const property<Stag,Svalue,Snext>& s )
 {
         get( p, s.m_value, Stag() );
- getSubset( p, Snext(s) );
+ getSubset( p, s.m_base );
 }
 
 template<class Tag, class Value, class Next,

Modified: trunk/boost/graph/adjacency_matrix.hpp
==============================================================================
--- trunk/boost/graph/adjacency_matrix.hpp (original)
+++ trunk/boost/graph/adjacency_matrix.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -21,6 +21,7 @@
 #include <boost/graph/graph_mutability_traits.hpp>
 #include <boost/graph/graph_selectors.hpp>
 #include <boost/mpl/if.hpp>
+#include <boost/mpl/bool.hpp>
 #include <boost/graph/adjacency_iterator.hpp>
 #include <boost/graph/detail/edge.hpp>
 #include <boost/iterator/iterator_adaptor.hpp>
@@ -29,7 +30,10 @@
 #include <boost/graph/properties.hpp>
 #include <boost/tuple/tuple.hpp>
 #include <boost/static_assert.hpp>
-#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/property_map/transform_value_property_map.hpp>
+#include <boost/property_map/function_property_map.hpp>
 
 namespace boost {
 
@@ -484,25 +488,14 @@
     BOOST_STATIC_ASSERT(!(is_same<Directed, bidirectionalS>::value));
 #endif
 
-#if !defined(BOOST_GRAPH_NO_BUNDLED_PROPERTIES)
- typedef typename graph_detail::graph_prop<GraphProperty>::property graph_property_type;
- typedef typename graph_detail::graph_prop<GraphProperty>::bundle graph_bundled;
-
- typedef typename graph_detail::vertex_prop<VertexProperty>::property vertex_property_type;
- typedef typename graph_detail::vertex_prop<VertexProperty>::bundle vertex_bundled;
-
- typedef typename graph_detail::edge_prop<EdgeProperty>::property edge_property_type;
- typedef typename graph_detail::edge_prop<EdgeProperty>::bundle edge_bundled;
-#else
     typedef GraphProperty graph_property_type;
- typedef no_graph_bundle graph_bundled;
+ typedef typename lookup_one_property<GraphProperty, graph_bundle_t>::type graph_bundled;
 
     typedef VertexProperty vertex_property_type;
- typedef no_vertex_bundle vertex_bundled;
+ typedef typename lookup_one_property<VertexProperty, vertex_bundle_t>::type vertex_bundled;
 
     typedef EdgeProperty edge_property_type;
- typedef no_edge_bundle edge_bundled;
-#endif
+ typedef typename lookup_one_property<EdgeProperty, edge_bundle_t>::type edge_bundled;
 
   public: // should be private
     typedef typename mpl::if_<typename has_property<edge_property_type>::type,
@@ -640,16 +633,16 @@
 #ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
     // Directly access a vertex or edge bundle
     vertex_bundled& operator[](vertex_descriptor v)
- { return get(vertex_bundle, *this)[v]; }
+ { return get(vertex_bundle, *this, v); }
 
     const vertex_bundled& operator[](vertex_descriptor v) const
- { return get(vertex_bundle, *this)[v]; }
+ { return get(vertex_bundle, *this, v); }
 
     edge_bundled& operator[](edge_descriptor e)
- { return get(edge_bundle, *this)[e]; }
+ { return get(edge_bundle, *this, e); }
 
     const edge_bundled& operator[](edge_descriptor e) const
- { return get(edge_bundle, *this)[e]; }
+ { return get(edge_bundle, *this, e); }
 
     graph_bundled& operator[](graph_bundle_t)
     { return get_property(*this); }
@@ -1035,256 +1028,194 @@
   //=========================================================================
   // Functions required by the PropertyGraph concept
 
- // O(1)
   template <typename D, typename VP, typename EP, typename GP, typename A,
- typename Tag, typename Value>
- inline void
- set_property(adjacency_matrix<D,VP,EP,GP,A>& g, Tag, const Value& value)
- {
- get_property_value(g.m_property, Tag()) = value;
- }
-
- template <typename D, typename VP, typename EP, typename GP, typename A,
- typename Tag>
- inline typename graph_property<adjacency_matrix<D,VP,EP,GP,A>, Tag>::type&
- get_property(adjacency_matrix<D,VP,EP,GP,A>& g, Tag)
- {
- return get_property_value(g.m_property, Tag());
- }
+ typename Prop, typename Kind>
+ struct adj_mat_pm_helper;
 
   template <typename D, typename VP, typename EP, typename GP, typename A,
- typename Tag>
- inline const typename graph_property<adjacency_matrix<D,VP,EP,GP,A>, Tag>::type&
- get_property(const adjacency_matrix<D,VP,EP,GP,A>& g, Tag)
- {
- return get_property_value(g.m_property, Tag());
- }
-
- //=========================================================================
- // Vertex Property Map
+ typename Prop>
+ struct adj_mat_pm_helper<D, VP, EP, GP, A, Prop, vertex_property_tag> {
+ typedef typename graph_traits<adjacency_matrix<D, VP, EP, GP, A> >::vertex_descriptor arg_type;
+ typedef typed_identity_property_map<arg_type> vi_map_type;
+ typedef iterator_property_map<typename std::vector<VP>::iterator, vi_map_type> all_map_type;
+ typedef iterator_property_map<typename std::vector<VP>::const_iterator, vi_map_type> all_map_const_type;
+ typedef transform_value_property_map<
+ detail::lookup_one_property_f<VP, Prop>,
+ all_map_type>
+ type;
+ typedef transform_value_property_map<
+ detail::lookup_one_property_f<const VP, Prop>,
+ all_map_const_type>
+ const_type;
+ typedef typename property_traits<type>::reference single_nonconst_type;
+ typedef typename property_traits<const_type>::reference single_const_type;
+
+ static type get_nonconst(adjacency_matrix<D, VP, EP, GP, A>& g, Prop prop) {
+ return type(prop, all_map_type(g.m_vertex_properties.begin(), vi_map_type()));
+ }
+
+ static const_type get_const(const adjacency_matrix<D, VP, EP, GP, A>& g, Prop prop) {
+ return const_type(prop, all_map_const_type(g.m_vertex_properties.begin(), vi_map_type()));
+ }
 
- template <typename GraphPtr, typename Vertex, typename T, typename R,
- typename Tag>
- class adj_matrix_vertex_property_map
- : public put_get_helper<R,
- adj_matrix_vertex_property_map<GraphPtr, Vertex, T, R, Tag> >
- {
- public:
- typedef T value_type;
- typedef R reference;
- typedef Vertex key_type;
- typedef boost::lvalue_property_map_tag category;
- adj_matrix_vertex_property_map() { }
- adj_matrix_vertex_property_map(GraphPtr g) : m_g(g) { }
- inline reference operator[](key_type v) const {
- return get_property_value(m_g->m_vertex_properties[v], Tag());
+ static single_nonconst_type get_nonconst_one(adjacency_matrix<D, VP, EP, GP, A>& g, Prop prop, arg_type v) {
+ return lookup_one_property<VP, Prop>::lookup(g.m_vertex_properties[v], prop);
     }
- GraphPtr m_g;
- };
 
- template <class Property, class Vertex>
- struct adj_matrix_vertex_id_map
- : public boost::put_get_helper<Vertex,
- adj_matrix_vertex_id_map<Property, Vertex> >
- {
- typedef Vertex value_type;
- typedef Vertex reference;
- typedef Vertex key_type;
- typedef boost::readable_property_map_tag category;
- adj_matrix_vertex_id_map() { }
- template <class Graph>
- inline adj_matrix_vertex_id_map(const Graph&) { }
- inline value_type operator[](key_type v) const { return v; }
+ static single_const_type get_const_one(const adjacency_matrix<D, VP, EP, GP, A>& g, Prop prop, arg_type v) {
+ return lookup_one_property<const VP, Prop>::lookup(g.m_vertex_properties[v], prop);
+ }
   };
 
- namespace detail {
+ template <typename D, typename VP, typename EP, typename GP, typename A,
+ typename Tag>
+ struct adj_mat_pm_helper<D, VP, EP, GP, A, Tag, edge_property_tag> {
+ typedef typename graph_traits<adjacency_matrix<D, VP, EP, GP, A> >::edge_descriptor edge_descriptor;
 
- struct adj_matrix_any_vertex_pa {
- template <class Tag, class Graph, class Property>
- struct bind_ {
- typedef typename property_value<Property,Tag>::type Value;
- typedef typename boost::graph_traits<Graph>::vertex_descriptor Vertex;
-
- typedef adj_matrix_vertex_property_map<Graph*, Vertex, Value, Value&,
- Tag> type;
- typedef adj_matrix_vertex_property_map<const Graph*, Vertex, Value,
- const Value&, Tag> const_type;
- };
- };
- struct adj_matrix_id_vertex_pa {
- template <class Tag, class Graph, class Property>
- struct bind_ {
- typedef typename Graph::vertex_descriptor Vertex;
- typedef adj_matrix_vertex_id_map<Property, Vertex> type;
- typedef adj_matrix_vertex_id_map<Property, Vertex> const_type;
- };
+ template <typename IsConst>
+ struct lookup_property_from_edge {
+ Tag tag;
+ lookup_property_from_edge(Tag tag): tag(tag) {}
+ typedef typename boost::mpl::if_<IsConst, const EP, EP>::type ep_type_nonref;
+ typedef ep_type_nonref& ep_type;
+ typedef typename lookup_one_property<ep_type_nonref, Tag>::type& result_type;
+ result_type operator()(edge_descriptor e) const {
+ return lookup_one_property<ep_type_nonref, Tag>::lookup(*static_cast<ep_type_nonref*>(e.get_property()), tag);
+ }
     };
 
- template <class Tag>
- struct adj_matrix_choose_vertex_pa_helper {
- typedef adj_matrix_any_vertex_pa type;
- };
- template <>
- struct adj_matrix_choose_vertex_pa_helper<vertex_index_t> {
- typedef adj_matrix_id_vertex_pa type;
- };
+ typedef function_property_map<
+ lookup_property_from_edge<boost::mpl::false_>,
+ typename graph_traits<adjacency_matrix<D, VP, EP, GP, A> >::edge_descriptor> type;
+ typedef function_property_map<
+ lookup_property_from_edge<boost::mpl::true_>,
+ typename graph_traits<adjacency_matrix<D, VP, EP, GP, A> >::edge_descriptor> const_type;
+ typedef edge_descriptor arg_type;
+ typedef typename lookup_property_from_edge<boost::mpl::false_>::result_type single_nonconst_type;
+ typedef typename lookup_property_from_edge<boost::mpl::true_>::result_type single_const_type;
 
- template <class Tag, class Graph, class Property>
- struct adj_matrix_choose_vertex_pa {
- typedef typename adj_matrix_choose_vertex_pa_helper<Tag>::type Helper;
- typedef typename Helper::template bind_<Tag,Graph,Property> Bind;
- typedef typename Bind::type type;
- typedef typename Bind::const_type const_type;
- };
+ static type get_nonconst(adjacency_matrix<D, VP, EP, GP, A>& g, Tag tag) {
+ return type(tag);
+ }
 
- struct adj_matrix_vertex_property_selector {
- template <class Graph, class Property, class Tag>
- struct bind_ {
- typedef adj_matrix_choose_vertex_pa<Tag,Graph,Property> Choice;
- typedef typename Choice::type type;
- typedef typename Choice::const_type const_type;
- };
- };
+ static const_type get_const(const adjacency_matrix<D, VP, EP, GP, A>& g, Tag tag) {
+ return const_type(tag);
+ }
 
- } // namespace detail
+ static single_nonconst_type get_nonconst_one(adjacency_matrix<D, VP, EP, GP, A>& g, Tag tag, edge_descriptor e) {
+ return lookup_one_property<EP, Tag>::lookup(*static_cast<EP*>(e.get_property()), tag);
+ }
 
- template <>
- struct vertex_property_selector<adjacency_matrix_class_tag> {
- typedef detail::adj_matrix_vertex_property_selector type;
+ static single_const_type get_const_one(const adjacency_matrix<D, VP, EP, GP, A>& g, Tag tag, edge_descriptor e) {
+ return lookup_one_property<const EP, Tag>::lookup(*static_cast<const EP*>(e.get_property()), tag);
+ }
   };
 
- //=========================================================================
- // Edge Property Map
-
+ template <typename D, typename VP, typename EP, typename GP, typename A,
+ typename Tag>
+ struct property_map<adjacency_matrix<D,VP,EP,GP,A>, Tag>
+ : adj_mat_pm_helper<D, VP, EP, GP, A, Tag,
+ typename detail::property_kind_from_graph<adjacency_matrix<D, VP, EP, GP, A>, Tag>::type> {};
 
- template <typename Directed, typename Property, typename Vertex,
- typename T, typename R, typename Tag>
- class adj_matrix_edge_property_map
- : public put_get_helper<R,
- adj_matrix_edge_property_map<Directed, Property, Vertex, T, R, Tag> >
- {
- public:
- typedef T value_type;
- typedef R reference;
- typedef detail::matrix_edge_desc_impl<Directed, Vertex> key_type;
- typedef boost::lvalue_property_map_tag category;
- inline reference operator[](key_type e) const {
- Property& p = *(Property*)e.get_property();
- return get_property_value(p, Tag());
- }
- };
- struct adj_matrix_edge_property_selector {
- template <class Graph, class Property, class Tag>
- struct bind_ {
- typedef typename property_value<Property,Tag>::type T;
- typedef typename Graph::vertex_descriptor Vertex;
- typedef adj_matrix_edge_property_map<typename Graph::directed_category,
- Property, Vertex, T, T&, Tag> type;
- typedef adj_matrix_edge_property_map<typename Graph::directed_category,
- Property, Vertex, T, const T&, Tag> const_type;
- };
- };
- template <>
- struct edge_property_selector<adjacency_matrix_class_tag> {
- typedef adj_matrix_edge_property_selector type;
- };
+ template <typename D, typename VP, typename EP, typename GP, typename A,
+ typename Tag>
+ typename property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::type
+ get(Tag tag, adjacency_matrix<D, VP, EP, GP, A>& g) {
+ return property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::get_nonconst(g, tag);
+ }
 
- //=========================================================================
- // Functions required by PropertyGraph
+ template <typename D, typename VP, typename EP, typename GP, typename A,
+ typename Tag>
+ typename property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::const_type
+ get(Tag tag, const adjacency_matrix<D, VP, EP, GP, A>& g) {
+ return property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::get_const(g, tag);
+ }
 
- namespace detail {
+ template <typename D, typename VP, typename EP, typename GP, typename A,
+ typename Tag>
+ typename property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::single_nonconst_type
+ get(Tag tag, adjacency_matrix<D, VP, EP, GP, A>& g, typename property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::arg_type a) {
+ return property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::get_nonconst_one(g, tag, a);
+ }
 
- template <typename Property, typename D, typename VP, typename EP,
- typename GP, typename A>
- typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
- Property>::type
- get_dispatch(adjacency_matrix<D,VP,EP,GP,A>& g, Property,
- vertex_property_tag)
- {
- typedef adjacency_matrix<D,VP,EP,GP,A> Graph;
- typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
- Property>::type PA;
- return PA(&g);
- }
- template <typename Property, typename D, typename VP, typename EP,
- typename GP, typename A>
- typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
- Property>::type
- get_dispatch(adjacency_matrix<D,VP,EP,GP,A>&, Property,
- edge_property_tag)
- {
- typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
- Property>::type PA;
- return PA();
- }
- template <typename Property, typename D, typename VP, typename EP,
- typename GP, typename A>
- typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
- Property>::const_type
- get_dispatch(const adjacency_matrix<D,VP,EP,GP,A>& g, Property,
- vertex_property_tag)
- {
- typedef adjacency_matrix<D,VP,EP,GP,A> Graph;
- typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
- Property>::const_type PA;
- return PA(&g);
- }
- template <typename Property, typename D, typename VP, typename EP,
- typename GP, typename A>
- typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
- Property>::const_type
- get_dispatch(const adjacency_matrix<D,VP,EP,GP,A>&, Property,
- edge_property_tag)
- {
- typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
- Property>::const_type PA;
- return PA();
- }
+ template <typename D, typename VP, typename EP, typename GP, typename A,
+ typename Tag>
+ typename property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::single_const_type
+ get(Tag tag, const adjacency_matrix<D, VP, EP, GP, A>& g, typename property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::arg_type a) {
+ return property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::get_const_one(g, tag, a);
+ }
 
- } // namespace detail
+ template <typename D, typename VP, typename EP, typename GP, typename A,
+ typename Tag>
+ void
+ put(Tag tag,
+ adjacency_matrix<D, VP, EP, GP, A>& g,
+ typename property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::arg_type a,
+ typename property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::single_const_type val) {
+ property_map<adjacency_matrix<D, VP, EP, GP, A>, Tag>::get_nonconst_one(g, tag, a) = val;
+ }
 
- template <typename Property, typename D, typename VP, typename EP,
- typename GP, typename A>
- inline
- typename property_map<adjacency_matrix<D,VP,EP,GP,A>, Property>::type
- get(Property p, adjacency_matrix<D,VP,EP,GP,A>& g)
+ // O(1)
+ template <typename D, typename VP, typename EP, typename GP, typename A,
+ typename Tag, typename Value>
+ inline void
+ set_property(adjacency_matrix<D,VP,EP,GP,A>& g, Tag tag, const Value& value)
   {
- typedef typename property_kind<Property>::type Kind;
- return detail::get_dispatch(g, p, Kind());
+ get_property_value(g.m_property, tag) = value;
   }
 
- template <typename Property, typename D, typename VP, typename EP,
- typename GP, typename A>
- inline
- typename property_map<adjacency_matrix<D,VP,EP,GP,A>, Property>::const_type
- get(Property p, const adjacency_matrix<D,VP,EP,GP,A>& g)
+ template <typename D, typename VP, typename EP, typename GP, typename A,
+ typename Tag>
+ inline typename graph_property<adjacency_matrix<D,VP,EP,GP,A>, Tag>::type&
+ get_property(adjacency_matrix<D,VP,EP,GP,A>& g, Tag tag)
   {
- typedef typename property_kind<Property>::type Kind;
- return detail::get_dispatch(g, p, Kind());
+ return get_property_value(g.m_property, tag);
   }
 
- template <typename Property, typename D, typename VP, typename EP,
- typename GP, typename A, typename Key>
- inline
- typename property_traits<
- typename property_map<adjacency_matrix<D,VP,EP,GP,A>, Property>::const_type
- >::value_type
- get(Property p, const adjacency_matrix<D,VP,EP,GP,A>& g,
- const Key& key)
+ template <typename D, typename VP, typename EP, typename GP, typename A,
+ typename Tag>
+ inline const typename graph_property<adjacency_matrix<D,VP,EP,GP,A>, Tag>::type&
+ get_property(const adjacency_matrix<D,VP,EP,GP,A>& g, Tag tag)
   {
- return get(get(p, g), key);
+ return get_property_value(g.m_property, tag);
   }
 
- template <typename Property, typename D, typename VP, typename EP,
- typename GP, typename A, typename Key, typename Value>
- inline void
- put(Property p, adjacency_matrix<D,VP,EP,GP,A>& g,
- const Key& key, const Value& value)
- {
- typedef adjacency_matrix<D,VP,EP,GP,A> Graph;
- typedef typename boost::property_map<Graph, Property>::type Map;
- Map pmap = get(p, g);
- put(pmap, key, value);
+ //=========================================================================
+ // Vertex Property Map
+
+ template <typename D, typename VP, typename EP, typename GP, typename A>
+ struct property_map<adjacency_matrix<D, VP, EP, GP, A>, vertex_index_t> {
+ typedef typename adjacency_matrix<D, VP, EP, GP, A>::vertex_descriptor Vertex;
+ typedef typed_identity_property_map<Vertex> type;
+ typedef type const_type;
+ };
+
+ template <typename D, typename VP, typename EP, typename GP, typename A>
+ typename property_map<adjacency_matrix<D, VP, EP, GP, A>, vertex_index_t>::const_type
+ get(vertex_index_t, adjacency_matrix<D, VP, EP, GP, A>&) {
+ return typename property_map<adjacency_matrix<D, VP, EP, GP, A>, vertex_index_t>::const_type();
+ }
+
+ template <typename D, typename VP, typename EP, typename GP, typename A>
+ typename adjacency_matrix<D, VP, EP, GP, A>::vertex_descriptor
+ get(vertex_index_t,
+ adjacency_matrix<D, VP, EP, GP, A>&,
+ typename adjacency_matrix<D, VP, EP, GP, A>::vertex_descriptor v) {
+ return v;
+ }
+
+ template <typename D, typename VP, typename EP, typename GP, typename A>
+ typename property_map<adjacency_matrix<D, VP, EP, GP, A>, vertex_index_t>::const_type
+ get(vertex_index_t, const adjacency_matrix<D, VP, EP, GP, A>&) {
+ return typename property_map<adjacency_matrix<D, VP, EP, GP, A>, vertex_index_t>::const_type();
+ }
+
+ template <typename D, typename VP, typename EP, typename GP, typename A>
+ typename adjacency_matrix<D, VP, EP, GP, A>::vertex_descriptor
+ get(vertex_index_t,
+ const adjacency_matrix<D, VP, EP, GP, A>&,
+ typename adjacency_matrix<D, VP, EP, GP, A>::vertex_descriptor v) {
+ return v;
   }
 
   //=========================================================================
@@ -1298,63 +1229,10 @@
     return n;
   }
 
- // Support for bundled properties
-#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
- template <typename Directed, typename VertexProperty, typename EdgeProperty, typename GraphProperty,
- typename Allocator, typename T, typename Bundle>
- inline
- typename property_map<adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, Allocator>,
- T Bundle::*>::type
- get(T Bundle::* p, adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, Allocator>& g)
- {
- typedef typename property_map<adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, Allocator>,
- T Bundle::*>::type
- result_type;
- return result_type(&g, p);
- }
-
- template <typename Directed, typename VertexProperty, typename EdgeProperty, typename GraphProperty,
- typename Allocator, typename T, typename Bundle>
- inline
- typename property_map<adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, Allocator>,
- T Bundle::*>::const_type
- get(T Bundle::* p, adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, Allocator> const & g)
- {
- typedef typename property_map<adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, Allocator>,
- T Bundle::*>::const_type
- result_type;
- return result_type(&g, p);
- }
-
- template <typename Directed, typename VertexProperty, typename EdgeProperty, typename GraphProperty,
- typename Allocator, typename T, typename Bundle, typename Key>
- inline T
- get(T Bundle::* p, adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, Allocator> const & g,
- const Key& key)
- {
- return get(get(p, g), key);
- }
-
- template <typename Directed, typename VertexProperty, typename EdgeProperty, typename GraphProperty,
- typename Allocator, typename T, typename Bundle, typename Key>
- inline void
- put(T Bundle::* p, adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, Allocator>& g,
- const Key& key, const T& value)
- {
- put(get(p, g), key, value);
- }
-
-#endif
-
-#define ADJMAT_PARAMS \
- typename D, typename VP, typename EP, typename GP, typename A
-#define ADJMAT adjacency_matrix<D,VP,EP,GP,A>
-template <ADJMAT_PARAMS>
-struct graph_mutability_traits<ADJMAT> {
- typedef mutable_edge_property_graph_tag category;
+template <typename D, typename VP, typename EP, typename GP, typename A>
+struct graph_mutability_traits<adjacency_matrix<D, VP, EP, GP, A> > {
+ typedef mutable_edge_property_graph_tag category;
 };
-#undef ADJMAT_PARAMS
-#undef ADJMAT
 
 
 } // namespace boost

Modified: trunk/boost/graph/bellman_ford_shortest_paths.hpp
==============================================================================
--- trunk/boost/graph/bellman_ford_shortest_paths.hpp (original)
+++ trunk/boost/graph/bellman_ford_shortest_paths.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -171,7 +171,7 @@
     bool
     bellman_dispatch2
       (VertexAndEdgeListGraph& g,
- detail::error_property_not_found,
+ param_not_found,
        Size N, WeightMap weight, PredecessorMap pred, DistanceMap distance,
        const bgl_named_params<P, T, R>& params)
     {

Modified: trunk/boost/graph/betweenness_centrality.hpp
==============================================================================
--- trunk/boost/graph/betweenness_centrality.hpp (original)
+++ trunk/boost/graph/betweenness_centrality.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -498,14 +498,14 @@
   };
 
   template<>
- struct brandes_betweenness_centrality_dispatch1<error_property_not_found>
+ struct brandes_betweenness_centrality_dispatch1<param_not_found>
   {
     template<typename Graph, typename CentralityMap,
              typename EdgeCentralityMap, typename VertexIndexMap>
     static void
     run(const Graph& g, CentralityMap centrality,
         EdgeCentralityMap edge_centrality_map, VertexIndexMap vertex_index,
- error_property_not_found)
+ param_not_found)
     {
       brandes_betweenness_centrality_dispatch2(g, centrality, edge_centrality_map,
                                                vertex_index);
@@ -532,7 +532,7 @@
 {
   typedef bgl_named_params<Param,Tag,Rest> named_params;
 
- typedef typename property_value<named_params, edge_weight_t>::type ew;
+ typedef typename get_param_type<edge_weight_t, named_params>::type ew;
   detail::graph::brandes_betweenness_centrality_dispatch1<ew>::run(
     g,
     choose_param(get_param(params, vertex_centrality),

Modified: trunk/boost/graph/biconnected_components.hpp
==============================================================================
--- trunk/boost/graph/biconnected_components.hpp (original)
+++ trunk/boost/graph/biconnected_components.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -209,7 +209,7 @@
     };
     
     template <>
- struct bicomp_dispatch3<error_property_not_found>
+ struct bicomp_dispatch3<param_not_found>
     {
       template<typename Graph, typename ComponentMap, typename OutputIterator,
                 typename VertexIndexMap, typename DiscoverTimeMap,
@@ -218,7 +218,7 @@
           ComponentMap comp, OutputIterator out, VertexIndexMap index_map,
           DiscoverTimeMap dtm, LowPointMap lowpt,
           const bgl_named_params<P, T, R>& params,
- error_property_not_found)
+ param_not_found)
   {
     typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
     std::vector<vertex_t> pred(num_vertices(g));
@@ -243,7 +243,7 @@
           DiscoverTimeMap dtm, const bgl_named_params<P, T, R>& params,
           LowPointMap lowpt)
       {
- typedef typename property_value< bgl_named_params<P,T,R>,
+ typedef typename get_param_type< bgl_named_params<P,T,R>,
             vertex_predecessor_t>::type dispatch_type;
 
         return bicomp_dispatch3<dispatch_type>::apply
@@ -254,7 +254,7 @@
 
 
     template <>
- struct bicomp_dispatch2<error_property_not_found>
+ struct bicomp_dispatch2<param_not_found>
     {
       template<typename Graph, typename ComponentMap, typename OutputIterator,
                 typename VertexIndexMap, typename DiscoverTimeMap,
@@ -262,14 +262,14 @@
       static std::pair<std::size_t, OutputIterator> apply (const Graph& g,
           ComponentMap comp, OutputIterator out, VertexIndexMap index_map,
           DiscoverTimeMap dtm, const bgl_named_params<P, T, R>& params,
- error_property_not_found)
+ param_not_found)
   {
     typedef typename graph_traits<Graph>::vertices_size_type
       vertices_size_type;
     std::vector<vertices_size_type> lowpt(num_vertices(g));
         vertices_size_type vst(0);
 
- typedef typename property_value< bgl_named_params<P,T,R>,
+ typedef typename get_param_type< bgl_named_params<P,T,R>,
             vertex_predecessor_t>::type dispatch_type;
   
         return bicomp_dispatch3<dispatch_type>::apply
@@ -288,7 +288,7 @@
           ComponentMap comp, OutputIterator out, VertexIndexMap index_map,
           const bgl_named_params<P, T, R>& params, DiscoverTimeMap dtm)
       {
- typedef typename property_value< bgl_named_params<P,T,R>,
+ typedef typename get_param_type< bgl_named_params<P,T,R>,
             vertex_lowpoint_t>::type dispatch_type;
 
         return bicomp_dispatch2<dispatch_type>::apply
@@ -298,20 +298,20 @@
     };
 
     template <>
- struct bicomp_dispatch1<error_property_not_found>
+ struct bicomp_dispatch1<param_not_found>
     {
       template<typename Graph, typename ComponentMap, typename OutputIterator,
                 typename VertexIndexMap, class P, class T, class R>
       static std::pair<std::size_t, OutputIterator> apply(const Graph& g,
           ComponentMap comp, OutputIterator out, VertexIndexMap index_map,
- const bgl_named_params<P, T, R>& params, error_property_not_found)
+ const bgl_named_params<P, T, R>& params, param_not_found)
       {
         typedef typename graph_traits<Graph>::vertices_size_type
             vertices_size_type;
         std::vector<vertices_size_type> discover_time(num_vertices(g));
     vertices_size_type vst(0);
 
- typedef typename property_value< bgl_named_params<P,T,R>,
+ typedef typename get_param_type< bgl_named_params<P,T,R>,
             vertex_lowpoint_t>::type dispatch_type;
 
         return bicomp_dispatch2<dispatch_type>::apply
@@ -329,14 +329,14 @@
   biconnected_components(const Graph& g, ComponentMap comp,
       OutputIterator out, DiscoverTimeMap dtm, LowPointMap lowpt)
   {
- typedef detail::error_property_not_found dispatch_type;
+ typedef param_not_found dispatch_type;
 
     return detail::bicomp_dispatch3<dispatch_type>::apply
             (g, comp, out,
              get(vertex_index, g),
              dtm, lowpt,
              bgl_named_params<int, buffer_param_t>(0),
- detail::error_property_not_found());
+ param_not_found());
   }
 
   template <typename Graph, typename ComponentMap, typename OutputIterator,
@@ -345,7 +345,7 @@
   biconnected_components(const Graph& g, ComponentMap comp, OutputIterator out,
       const bgl_named_params<P, T, R>& params)
   {
- typedef typename property_value< bgl_named_params<P,T,R>,
+ typedef typename get_param_type< bgl_named_params<P,T,R>,
         vertex_discover_time_t>::type dispatch_type;
 
     return detail::bicomp_dispatch1<dispatch_type>::apply(g, comp, out,

Modified: trunk/boost/graph/breadth_first_search.hpp
==============================================================================
--- trunk/boost/graph/breadth_first_search.hpp (original)
+++ trunk/boost/graph/breadth_first_search.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -53,11 +53,12 @@
   };
 
 
+ // Multiple-source version
   template <class IncidenceGraph, class Buffer, class BFSVisitor,
- class ColorMap>
+ class ColorMap, class SourceIterator>
   void breadth_first_visit
     (const IncidenceGraph& g,
- typename graph_traits<IncidenceGraph>::vertex_descriptor s,
+ SourceIterator sources_begin, SourceIterator sources_end,
      Buffer& Q, BFSVisitor vis, ColorMap color)
   {
     BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept<IncidenceGraph> ));
@@ -70,8 +71,11 @@
     typedef color_traits<ColorValue> Color;
     typename GTraits::out_edge_iterator ei, ei_end;
 
- put(color, s, Color::gray()); vis.discover_vertex(s, g);
- Q.push(s);
+ for (; sources_begin != sources_end; ++sources_begin) {
+ Vertex s = *sources_begin;
+ put(color, s, Color::gray()); vis.discover_vertex(s, g);
+ Q.push(s);
+ }
     while (! Q.empty()) {
       Vertex u = Q.top(); Q.pop(); vis.examine_vertex(u, g);
       for (boost::tie(ei, ei_end) = out_edges(u, g); ei != ei_end; ++ei) {
@@ -89,12 +93,25 @@
     } // end while
   } // breadth_first_visit
 
+ // Single-source version
+ template <class IncidenceGraph, class Buffer, class BFSVisitor,
+ class ColorMap>
+ void breadth_first_visit
+ (const IncidenceGraph& g,
+ typename graph_traits<IncidenceGraph>::vertex_descriptor s,
+ Buffer& Q, BFSVisitor vis, ColorMap color)
+ {
+ typename graph_traits<IncidenceGraph>::vertex_descriptor sources[1] = {s};
+ breadth_first_visit(g, sources, sources + 1, Q, vis, color);
+ }
 
- template <class VertexListGraph, class Buffer, class BFSVisitor,
+
+ template <class VertexListGraph, class SourceIterator,
+ class Buffer, class BFSVisitor,
             class ColorMap>
   void breadth_first_search
     (const VertexListGraph& g,
- typename graph_traits<VertexListGraph>::vertex_descriptor s,
+ SourceIterator sources_begin, SourceIterator sources_end,
      Buffer& Q, BFSVisitor vis, ColorMap color)
   {
     // Initialization
@@ -105,7 +122,18 @@
       vis.initialize_vertex(*i, g);
       put(color, *i, Color::white());
     }
- breadth_first_visit(g, s, Q, vis, color);
+ breadth_first_visit(g, sources_begin, sources_end, Q, vis, color);
+ }
+
+ template <class VertexListGraph, class Buffer, class BFSVisitor,
+ class ColorMap>
+ void breadth_first_search
+ (const VertexListGraph& g,
+ typename graph_traits<VertexListGraph>::vertex_descriptor s,
+ Buffer& Q, BFSVisitor vis, ColorMap color)
+ {
+ typename graph_traits<VertexListGraph>::vertex_descriptor sources[1] = {s};
+ breadth_first_search(g, sources, sources + 1, Q, vis, color);
   }
 
   namespace graph { struct bfs_visitor_event_not_overridden {}; }
@@ -270,13 +298,13 @@
     };
 
     template <>
- struct bfs_dispatch<detail::error_property_not_found> {
+ struct bfs_dispatch<param_not_found> {
       template <class VertexListGraph, class P, class T, class R>
       static void apply
       (VertexListGraph& g,
        typename graph_traits<VertexListGraph>::vertex_descriptor s,
        const bgl_named_params<P, T, R>& params,
- detail::error_property_not_found)
+ param_not_found)
       {
         null_visitor null_vis;
 
@@ -307,8 +335,7 @@
     // graph is not really const since we may write to property maps
     // of the graph.
     VertexListGraph& ng = const_cast<VertexListGraph&>(g);
- typedef typename property_value< bgl_named_params<P,T,R>,
- vertex_color_t>::type C;
+ typedef typename get_param_type< vertex_color_t, bgl_named_params<P,T,R> >::type C;
     detail::bfs_dispatch<C>::apply(ng, s, params,
                                    get_param(params, vertex_color));
   }

Modified: trunk/boost/graph/compressed_sparse_row_graph.hpp
==============================================================================
--- trunk/boost/graph/compressed_sparse_row_graph.hpp (original)
+++ trunk/boost/graph/compressed_sparse_row_graph.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -42,6 +42,7 @@
 #include <boost/static_assert.hpp>
 #include <boost/functional/hash.hpp>
 #include <boost/utility.hpp>
+#include <boost/property_map/transform_value_property_map.hpp>
 
 #ifdef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
 # error The Compressed Sparse Row graph only supports bundled properties.
@@ -195,8 +196,8 @@
 
  public:
   // For Property Graph
- typedef typename graph_detail::graph_prop<GraphProperty>::property graph_property_type;
- typedef typename graph_detail::graph_prop<GraphProperty>::bundle graph_bundled;
+ typedef GraphProperty graph_property_type;
+ typedef typename lookup_one_property<GraphProperty, graph_bundle_t>::type graph_bundled;
 
   typedef detail::compressed_sparse_row_structure<EdgeProperty, Vertex, EdgeIndex> forward_type;
 
@@ -746,8 +747,8 @@
 
  public:
   // For Property Graph
- typedef typename graph_detail::graph_prop<GraphProperty>::property graph_property_type;
- typedef typename graph_detail::graph_prop<GraphProperty>::bundle graph_bundled;
+ typedef GraphProperty graph_property_type;
+ typedef typename lookup_one_property<GraphProperty, graph_bundle_t>::type graph_bundled;
   // typedef GraphProperty graph_property_type;
 
   typedef detail::compressed_sparse_row_structure<EdgeProperty, Vertex, EdgeIndex> forward_type;
@@ -1404,6 +1405,61 @@
   return get_property_value(g.m_property, Tag());
 }
 
+template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename Tag>
+struct property_map<BOOST_CSR_GRAPH_TYPE, Tag> {
+ typedef typename detail::property_kind_from_graph<BOOST_CSR_GRAPH_TYPE, Tag>::type kind;
+ typedef typename boost::mpl::if_<
+ boost::is_same<kind, vertex_property_tag>,
+ vertex_all_t,
+ typename boost::mpl::if_<
+ boost::is_same<kind, edge_property_tag>,
+ edge_all_t,
+ graph_all_t>::type>::type all_tag;
+ typedef typename property_traits<typename property_map<BOOST_CSR_GRAPH_TYPE, all_tag>::type>::key_type key_type;
+ typedef typename property_traits<typename property_map<BOOST_CSR_GRAPH_TYPE, all_tag>::type>::value_type plist_type;
+ typedef transform_value_property_map<detail::lookup_one_property_f<plist_type, Tag>, typename property_map<BOOST_CSR_GRAPH_TYPE, all_tag>::type> type;
+ typedef transform_value_property_map<detail::lookup_one_property_f<const plist_type, Tag>, typename property_map<BOOST_CSR_GRAPH_TYPE, all_tag>::const_type> const_type;
+};
+
+template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename Tag>
+typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::type
+get(Tag tag, BOOST_CSR_GRAPH_TYPE& g) {
+ return typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::type(tag, get(typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::all_tag(), g));
+}
+
+template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename Tag>
+typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::const_type
+get(Tag tag, const BOOST_CSR_GRAPH_TYPE& g) {
+ return typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::const_type(tag, get(typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::all_tag(), g));
+}
+
+template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename Tag>
+typename property_traits<typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::type>::reference
+get(Tag tag, BOOST_CSR_GRAPH_TYPE& g, typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::key_type k) {
+ typedef typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::all_tag all_tag;
+ typedef typename property_map<BOOST_CSR_GRAPH_TYPE, all_tag>::type outer_pm;
+ return lookup_one_property<typename property_traits<outer_pm>::value_type, Tag>::lookup(get(all_tag(), g, k), tag);
+}
+
+template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename Tag>
+typename property_traits<typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::const_type>::reference
+get(Tag tag, const BOOST_CSR_GRAPH_TYPE& g, typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::key_type k) {
+ typedef typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::all_tag all_tag;
+ typedef typename property_map<BOOST_CSR_GRAPH_TYPE, all_tag>::const_type outer_pm;
+ return lookup_one_property<const typename property_traits<outer_pm>::value_type, Tag>::lookup(get(all_tag(), g, k), tag);
+}
+
+template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename Tag>
+void
+put(Tag tag,
+ BOOST_CSR_GRAPH_TYPE& g,
+ typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::key_type k,
+ typename lookup_one_property<typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::plist_type, Tag>::type val) {
+ typedef typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::all_tag all_tag;
+ typedef typename property_map<BOOST_CSR_GRAPH_TYPE, all_tag>::type outer_pm;
+ lookup_one_property<typename property_map<BOOST_CSR_GRAPH_TYPE, Tag>::plist_type, Tag>::lookup(get(all_tag(), g, k), tag) = val;
+}
+
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
 struct property_map<BOOST_CSR_GRAPH_TYPE, vertex_index_t>
 {
@@ -1419,14 +1475,14 @@
 };
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-struct property_map<BOOST_CSR_GRAPH_TYPE, vertex_bundle_t>
+struct property_map<BOOST_CSR_GRAPH_TYPE, vertex_all_t>
 {
   typedef typename BOOST_CSR_GRAPH_TYPE::inherited_vertex_properties::vertex_map_type type;
   typedef typename BOOST_CSR_GRAPH_TYPE::inherited_vertex_properties::const_vertex_map_type const_type;
 };
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-struct property_map<BOOST_CSR_GRAPH_TYPE, edge_bundle_t>
+struct property_map<BOOST_CSR_GRAPH_TYPE, edge_all_t>
 {
   typedef typename BOOST_CSR_GRAPH_TYPE::forward_type::inherited_edge_properties::edge_map_type type;
   typedef typename BOOST_CSR_GRAPH_TYPE::forward_type::inherited_edge_properties::const_edge_map_type const_type;
@@ -1448,6 +1504,21 @@
 }
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline typed_identity_property_map<Vertex>
+get(vertex_index_t, BOOST_CSR_GRAPH_TYPE&)
+{
+ return typed_identity_property_map<Vertex>();
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline Vertex
+get(vertex_index_t,
+ BOOST_CSR_GRAPH_TYPE&, Vertex v)
+{
+ return v;
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
 inline typename property_map<BOOST_CSR_GRAPH_TYPE, edge_index_t>::const_type
 get(edge_index_t, const BOOST_CSR_GRAPH_TYPE&)
 {
@@ -1465,125 +1536,102 @@
 }
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline typename property_map<BOOST_CSR_GRAPH_TYPE, vertex_bundle_t>::type
-get(vertex_bundle_t, BOOST_CSR_GRAPH_TYPE& g)
+inline typename property_map<BOOST_CSR_GRAPH_TYPE, edge_index_t>::const_type
+get(edge_index_t, BOOST_CSR_GRAPH_TYPE&)
+{
+ typedef typename property_map<BOOST_CSR_GRAPH_TYPE, edge_index_t>::const_type
+ result_type;
+ return result_type();
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline EdgeIndex
+get(edge_index_t, BOOST_CSR_GRAPH_TYPE&,
+ typename BOOST_CSR_GRAPH_TYPE::edge_descriptor e)
+{
+ return e.idx;
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename property_map<BOOST_CSR_GRAPH_TYPE, vertex_all_t>::type
+get(vertex_all_t, BOOST_CSR_GRAPH_TYPE& g)
 {
   return g.get_vertex_bundle(get(vertex_index, g));
 }
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline typename property_map<BOOST_CSR_GRAPH_TYPE, vertex_bundle_t>::const_type
-get(vertex_bundle_t, const BOOST_CSR_GRAPH_TYPE& g)
+inline typename property_map<BOOST_CSR_GRAPH_TYPE, vertex_all_t>::const_type
+get(vertex_all_t, const BOOST_CSR_GRAPH_TYPE& g)
 {
   return g.get_vertex_bundle(get(vertex_index, g));
 }
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
 inline VertexProperty&
-get(vertex_bundle_t,
+get(vertex_all_t,
     BOOST_CSR_GRAPH_TYPE& g, Vertex v)
 {
- return get(vertex_bundle, g)[v];
+ return get(vertex_all, g)[v];
 }
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
 inline const VertexProperty&
-get(vertex_bundle_t,
+get(vertex_all_t,
     const BOOST_CSR_GRAPH_TYPE& g, Vertex v)
 {
- return get(vertex_bundle, g)[v];
+ return get(vertex_all, g)[v];
 }
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
 inline void
-put(vertex_bundle_t,
+put(vertex_all_t,
     BOOST_CSR_GRAPH_TYPE& g,
     Vertex v,
     const VertexProperty& val)
 {
- put(get(vertex_bundle, g), v, val);
+ put(get(vertex_all, g), v, val);
 }
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline typename property_map<BOOST_CSR_GRAPH_TYPE, edge_bundle_t>::type
-get(edge_bundle_t, BOOST_CSR_GRAPH_TYPE& g)
+inline typename property_map<BOOST_CSR_GRAPH_TYPE, edge_all_t>::type
+get(edge_all_t, BOOST_CSR_GRAPH_TYPE& g)
 {
   return g.m_forward.get_edge_bundle(get(edge_index, g));
 }
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline typename property_map<BOOST_CSR_GRAPH_TYPE, edge_bundle_t>::const_type
-get(edge_bundle_t, const BOOST_CSR_GRAPH_TYPE& g)
+inline typename property_map<BOOST_CSR_GRAPH_TYPE, edge_all_t>::const_type
+get(edge_all_t, const BOOST_CSR_GRAPH_TYPE& g)
 {
   return g.m_forward.get_edge_bundle(get(edge_index, g));
 }
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
 inline EdgeProperty&
-get(edge_bundle_t,
+get(edge_all_t,
     BOOST_CSR_GRAPH_TYPE& g,
     const typename BOOST_CSR_GRAPH_TYPE::edge_descriptor& e)
 {
- return get(edge_bundle, g)[e];
+ return get(edge_all, g)[e];
 }
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
 inline const EdgeProperty&
-get(edge_bundle_t,
+get(edge_all_t,
     const BOOST_CSR_GRAPH_TYPE& g,
     const typename BOOST_CSR_GRAPH_TYPE::edge_descriptor& e)
 {
- return get(edge_bundle, g)[e];
+ return get(edge_all, g)[e];
 }
 
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
 inline void
-put(edge_bundle_t,
+put(edge_all_t,
     BOOST_CSR_GRAPH_TYPE& g,
     const typename BOOST_CSR_GRAPH_TYPE::edge_descriptor& e,
     const EdgeProperty& val)
 {
- put(get(edge_bundle, g), e, val);
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
-inline
-typename property_map<BOOST_CSR_GRAPH_TYPE, T Bundle::*>::type
-get(T Bundle::* p, BOOST_CSR_GRAPH_TYPE& g)
-{
- typedef typename property_map<BOOST_CSR_GRAPH_TYPE,
- T Bundle::*>::type
- result_type;
- return result_type(&g, p);
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
-inline
-typename property_map<BOOST_CSR_GRAPH_TYPE, T Bundle::*>::const_type
-get(T Bundle::* p, BOOST_CSR_GRAPH_TYPE const & g)
-{
- typedef typename property_map<BOOST_CSR_GRAPH_TYPE,
- T Bundle::*>::const_type
- result_type;
- return result_type(&g, p);
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle,
- typename Key>
-inline T
-get(T Bundle::* p, BOOST_CSR_GRAPH_TYPE const & g,
- const Key& key)
-{
- return get(get(p, g), key);
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle,
- typename Key>
-inline void
-put(T Bundle::* p, BOOST_CSR_GRAPH_TYPE& g,
- const Key& key, const T& value)
-{
- put(get(p, g), key, value);
+ put(get(edge_all, g), e, val);
 }
 
 #undef BOOST_CSR_GRAPH_TYPE

Modified: trunk/boost/graph/copy.hpp
==============================================================================
--- trunk/boost/graph/copy.hpp (original)
+++ trunk/boost/graph/copy.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -280,7 +280,7 @@
       typedef choose_copier_parameter type;
     };
     template <>
- struct choose_edge_copy<detail::error_property_not_found> {
+ struct choose_edge_copy<param_not_found> {
       typedef choose_default_edge_copier type;
     };
     template <class Param, class G1, class G2>
@@ -314,7 +314,7 @@
       typedef choose_copier_parameter type;
     };
     template <>
- struct choose_vertex_copy<detail::error_property_not_found> {
+ struct choose_vertex_copy<param_not_found> {
       typedef choose_default_vertex_copier type;
     };
     template <class Param, class G1, class G2>

Modified: trunk/boost/graph/detail/adjacency_list.hpp
==============================================================================
--- trunk/boost/graph/detail/adjacency_list.hpp (original)
+++ trunk/boost/graph/detail/adjacency_list.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -37,11 +37,6 @@
 #include <boost/static_assert.hpp>
 #include <boost/assert.hpp>
 
-// Symbol truncation problems with MSVC, trying to shorten names.
-#define stored_edge se_
-#define stored_edge_property sep_
-#define stored_edge_iter sei_
-
 /*
   Outline for this file:
 
@@ -67,11 +62,6 @@
  */
 
 
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-// Stay out of the way of the concept checking class
-# define Graph Graph_
-#endif
-
 namespace boost {
 
   namespace detail {
@@ -1511,10 +1501,16 @@
       typedef typename Config::edges_size_type edges_size_type;
       typedef typename Config::degree_size_type degree_size_type;
       typedef typename Config::StoredEdge StoredEdge;
+ typedef typename Config::vertex_property_type vertex_property_type;
       typedef typename Config::edge_property_type edge_property_type;
+ typedef typename Config::graph_property_type graph_property_type;
 
       typedef typename Config::global_edgelist_selector
         global_edgelist_selector;
+
+ typedef typename lookup_one_property<vertex_property_type, vertex_bundle_t>::type vertex_bundled;
+ typedef typename lookup_one_property<edge_property_type, edge_bundle_t>::type edge_bundled;
+ typedef typename lookup_one_property<graph_property_type, graph_bundle_t>::type graph_bundled;
     };
 
     template <class Config, class Base>
@@ -1645,43 +1641,43 @@
       inline
       typename boost::property_map<typename Config::graph_type,
         Property>::type
- get_dispatch(adj_list_helper<Config,Base>&, Property,
+ get_dispatch(adj_list_helper<Config,Base>&, Property p,
                    boost::edge_property_tag) {
         typedef typename Config::graph_type Graph;
         typedef typename boost::property_map<Graph, Property>::type PA;
- return PA();
+ return PA(p);
       }
       template <class Config, class Base, class Property>
       inline
       typename boost::property_map<typename Config::graph_type,
         Property>::const_type
- get_dispatch(const adj_list_helper<Config,Base>&, Property,
+ get_dispatch(const adj_list_helper<Config,Base>&, Property p,
                    boost::edge_property_tag) {
         typedef typename Config::graph_type Graph;
         typedef typename boost::property_map<Graph, Property>::const_type PA;
- return PA();
+ return PA(p);
       }
 
       template <class Config, class Base, class Property>
       inline
       typename boost::property_map<typename Config::graph_type,
         Property>::type
- get_dispatch(adj_list_helper<Config,Base>& g, Property,
+ get_dispatch(adj_list_helper<Config,Base>& g, Property p,
                    boost::vertex_property_tag) {
         typedef typename Config::graph_type Graph;
         typedef typename boost::property_map<Graph, Property>::type PA;
- return PA(&static_cast<Graph&>(g));
+ return PA(&static_cast<Graph&>(g), p);
       }
       template <class Config, class Base, class Property>
       inline
       typename boost::property_map<typename Config::graph_type,
         Property>::const_type
- get_dispatch(const adj_list_helper<Config, Base>& g, Property,
+ get_dispatch(const adj_list_helper<Config, Base>& g, Property p,
                    boost::vertex_property_tag) {
         typedef typename Config::graph_type Graph;
         typedef typename boost::property_map<Graph, Property>::const_type PA;
         const Graph& cg = static_cast<const Graph&>(g);
- return PA(&cg);
+ return PA(&cg, p);
       }
 
     } // namespace detail
@@ -1691,7 +1687,7 @@
     inline
     typename boost::property_map<typename Config::graph_type, Property>::type
     get(Property p, adj_list_helper<Config, Base>& g) {
- typedef typename property_kind<Property>::type Kind;
+ typedef typename detail::property_kind_from_graph<adj_list_helper<Config, Base>, Property>::type Kind;
       return detail::get_dispatch(g, p, Kind());
     }
     template <class Config, class Base, class Property>
@@ -1699,7 +1695,7 @@
     typename boost::property_map<typename Config::graph_type,
       Property>::const_type
     get(Property p, const adj_list_helper<Config, Base>& g) {
- typedef typename property_kind<Property>::type Kind;
+ typedef typename detail::property_kind_from_graph<adj_list_helper<Config, Base>, Property>::type Kind;
       return detail::get_dispatch(g, p, Kind());
     }
 
@@ -2427,15 +2423,15 @@
       typedef Reference reference;
       typedef typename Graph::vertex_descriptor key_type;
       typedef boost::lvalue_property_map_tag category;
- inline adj_list_vertex_property_map() { }
- inline adj_list_vertex_property_map(const Graph*) { }
+ inline adj_list_vertex_property_map(const Graph* = 0, Tag tag = Tag()): m_tag(tag) { }
       inline Reference operator[](key_type v) const {
         StoredVertex* sv = (StoredVertex*)v;
- return get_property_value(sv->m_property, Tag());
+ return get_property_value(sv->m_property, m_tag);
       }
       inline Reference operator()(key_type v) const {
         return this->operator[](v);
       }
+ Tag m_tag;
     };
 
     template <class Graph, class Property, class PropRef>
@@ -2449,8 +2445,7 @@
       typedef PropRef reference;
       typedef typename Graph::vertex_descriptor key_type;
       typedef boost::lvalue_property_map_tag category;
- inline adj_list_vertex_all_properties_map() { }
- inline adj_list_vertex_all_properties_map(const Graph*) { }
+ inline adj_list_vertex_all_properties_map(const Graph* = 0, vertex_all_t = vertex_all_t()) { }
       inline PropRef operator[](key_type v) const {
         StoredVertex* sv = (StoredVertex*)v;
         return sv->m_property;
@@ -2473,15 +2468,15 @@
       typedef Reference reference;
       typedef typename boost::graph_traits<Graph>::vertex_descriptor key_type;
       typedef boost::lvalue_property_map_tag category;
- vec_adj_list_vertex_property_map() { }
- vec_adj_list_vertex_property_map(GraphPtr g) : m_g(g) { }
+ vec_adj_list_vertex_property_map(GraphPtr g = 0, Tag tag = Tag()) : m_g(g), m_tag(tag) { }
       inline Reference operator[](key_type v) const {
- return get_property_value(m_g->m_vertices[v].m_property, Tag());
+ return get_property_value(m_g->m_vertices[v].m_property, m_tag);
       }
       inline Reference operator()(key_type v) const {
         return this->operator[](v);
       }
       GraphPtr m_g;
+ Tag m_tag;
     };
 
     template <class Graph, class GraphPtr, class Property, class PropertyRef>
@@ -2495,8 +2490,7 @@
       typedef PropertyRef reference;
       typedef typename boost::graph_traits<Graph>::vertex_descriptor key_type;
       typedef boost::lvalue_property_map_tag category;
- vec_adj_list_vertex_all_properties_map() { }
- vec_adj_list_vertex_all_properties_map(GraphPtr g) : m_g(g) { }
+ vec_adj_list_vertex_all_properties_map(GraphPtr g = 0, vertex_all_t = vertex_all_t()) : m_g(g) { }
       inline PropertyRef operator[](key_type v) const {
         return m_g->m_vertices[v].m_property;
       }
@@ -2542,7 +2536,7 @@
       typedef boost::readable_property_map_tag category;
       inline vec_adj_list_vertex_id_map() { }
       template <class Graph>
- inline vec_adj_list_vertex_id_map(const Graph&) { }
+ inline vec_adj_list_vertex_id_map(const Graph&, vertex_index_t) { }
       inline value_type operator[](key_type v) const { return v; }
       inline value_type operator()(key_type v) const { return v; }
     };
@@ -2579,17 +2573,11 @@
       };
     };
   namespace detail {
- template <class Tag>
- struct adj_list_choose_vertex_pa_helper {
- typedef adj_list_any_vertex_pa type;
- };
- template <>
- struct adj_list_choose_vertex_pa_helper<vertex_all_t> {
- typedef adj_list_all_vertex_pa type;
- };
     template <class Tag, class Graph, class Property>
     struct adj_list_choose_vertex_pa {
- typedef typename adj_list_choose_vertex_pa_helper<Tag>::type Helper;
+ typedef typename
+ boost::mpl::if_<boost::is_same<Tag, vertex_all_t>, adj_list_all_vertex_pa, adj_list_any_vertex_pa>::type
+ Helper;
       typedef typename Helper::template bind_<Tag,Graph,Property> Bind;
       typedef typename Bind::type type;
       typedef typename Bind::const_type const_type;
@@ -2629,13 +2617,16 @@
             Tag>
>
     {
+ Tag tag;
+ explicit adj_list_edge_property_map(Tag tag = Tag()): tag(tag) {}
+
       typedef Value value_type;
       typedef Ref reference;
       typedef detail::edge_desc_impl<Directed, Vertex> key_type;
       typedef boost::lvalue_property_map_tag category;
       inline Ref operator[](key_type e) const {
         Property& p = *(Property*)e.get_property();
- return get_property_value(p, Tag());
+ return get_property_value(p, tag);
       }
       inline Ref operator()(key_type e) const {
         return this->operator[](e);
@@ -2650,6 +2641,7 @@
             PropPtr, Vertex>
>
     {
+ explicit adj_list_edge_all_properties_map(edge_all_t = edge_all_t()) {}
       typedef Property value_type;
       typedef PropRef reference;
       typedef detail::edge_desc_impl<Directed, Vertex> key_type;
@@ -2793,15 +2785,6 @@
 #endif
 
 
-#undef stored_edge
-#undef stored_edge_property
-#undef stored_edge_iter
-
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-// Stay out of the way of the concept checking class
-#undef Graph
-#endif
-
 #endif // BOOST_GRAPH_DETAIL_DETAIL_ADJACENCY_LIST_CCT
 
 /*

Modified: trunk/boost/graph/directed_graph.hpp
==============================================================================
--- trunk/boost/graph/directed_graph.hpp (original)
+++ trunk/boost/graph/directed_graph.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -33,14 +33,12 @@
 class directed_graph
 {
 public:
- typedef typename graph_detail::graph_prop<GraphProp>::property graph_property_type;
- typedef typename graph_detail::graph_prop<GraphProp>::bundle graph_bundled;
-
- typedef typename graph_detail::vertex_prop<VertexProp>::property vertex_property_type;
- typedef typename graph_detail::vertex_prop<VertexProp>::bundle vertex_bundled;
-
- typedef typename graph_detail::edge_prop<EdgeProp>::property edge_property_type;
- typedef typename graph_detail::edge_prop<EdgeProp>::bundle edge_bundled;
+ typedef GraphProp graph_property_type;
+ typedef VertexProp vertex_property_type;
+ typedef EdgeProp edge_property_type;
+ typedef typename lookup_one_property<GraphProp, graph_bundle_t>::type graph_bundled;
+ typedef typename lookup_one_property<VertexProp, vertex_bundle_t>::type vertex_bundled;
+ typedef typename lookup_one_property<EdgeProp, edge_bundle_t>::type edge_bundled;
 
 private:
     // Wrap the user-specified properties with an index.
@@ -590,35 +588,6 @@
 set_property(DIRECTED_GRAPH& g, Property p, Value v)
 { return set_property(g.impl(), p, v); }
 
-#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
-
-template <DIRECTED_GRAPH_PARAMS, typename Type, typename Bundle>
-inline typename property_map<DIRECTED_GRAPH, Type Bundle::*>::type
-get(Type Bundle::* p, DIRECTED_GRAPH& g) {
- typedef typename property_map<
- DIRECTED_GRAPH, Type Bundle::*
- >::type return_type;
- return return_type(&g, p);
-}
-
-template <DIRECTED_GRAPH_PARAMS, typename Type, typename Bundle>
-inline typename property_map<DIRECTED_GRAPH, Type Bundle::*>::const_type
-get(Type Bundle::* p, DIRECTED_GRAPH const& g) {
- typedef typename property_map<
- DIRECTED_GRAPH, Type Bundle::*
- >::const_type return_type;
- return return_type(&g, p);
-}
-
-template <DIRECTED_GRAPH_PARAMS, typename Type, typename Bundle, typename Key>
-inline Type get(Type Bundle::* p, DIRECTED_GRAPH const& g, Key const& k)
-{ return get(p, g.impl(), k); }
-
-template <DIRECTED_GRAPH_PARAMS, typename Type, typename Bundle, typename Key, typename Value>
-inline void put(Type Bundle::* p, DIRECTED_GRAPH& g, Key const& k, Value const& v)
-{ put(p, g.impl(), k, v); }
-#endif
-
 // Vertex index management
 
 template <DIRECTED_GRAPH_PARAMS>

Modified: trunk/boost/graph/distributed/adjacency_list.hpp
==============================================================================
--- trunk/boost/graph/distributed/adjacency_list.hpp (original)
+++ trunk/boost/graph/distributed/adjacency_list.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -1882,6 +1882,30 @@
     }
     //---------------------------------------------------------------------
 
+ //---------------------------------------------------------------------
+ // Opposite of above.
+ edge_property_type split_edge_property(const base_edge_property_type& p)
+ { return split_edge_property(p, directed_selector()); }
+
+ edge_property_type
+ split_edge_property(const base_edge_property_type& p, directedS)
+ {
+ return p.m_base;
+ }
+
+ edge_property_type
+ split_edge_property(const base_edge_property_type& p, bidirectionalS)
+ {
+ return p.m_base;
+ }
+
+ edge_property_type
+ split_edge_property(const base_edge_property_type& p, undirectedS)
+ {
+ return p.m_base.m_base;
+ }
+ //---------------------------------------------------------------------
+
     /** The set of messages that can be transmitted and received by
      * a distributed adjacency list. This list will eventually be
      * exhaustive, but is currently quite limited.

Modified: trunk/boost/graph/distributed/adjlist/redistribute.hpp
==============================================================================
--- trunk/boost/graph/distributed/adjlist/redistribute.hpp (original)
+++ trunk/boost/graph/distributed/adjlist/redistribute.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -237,8 +237,8 @@
         || get(vertex_to_processor, src) != src.owner
         || get(vertex_to_processor, tgt) != tgt.owner)
       redistributed_edges[get(vertex_to_processor, source(*ei, *this))]
- .push_back(redistributed_edge(*ei, get(edge_all_t(), base(),
- ei->local)));
+ .push_back(redistributed_edge(*ei, split_edge_property(get(edge_all_t(), base(),
+ ei->local))));
   }
   inplace_all_to_all(pg, redistributed_edges);
 

Modified: trunk/boost/graph/distributed/betweenness_centrality.hpp
==============================================================================
--- trunk/boost/graph/distributed/betweenness_centrality.hpp (original)
+++ trunk/boost/graph/distributed/betweenness_centrality.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -1389,7 +1389,7 @@
   };
 
   template<>
- struct brandes_betweenness_centrality_dispatch1<boost::detail::error_property_not_found>
+ struct brandes_betweenness_centrality_dispatch1<boost::param_not_found>
   {
     template<typename Graph, typename CentralityMap, typename EdgeCentralityMap,
              typename VertexIndexMap, typename Buffer>
@@ -1397,7 +1397,7 @@
     run(const Graph& g, CentralityMap centrality, EdgeCentralityMap edge_centrality_map,
         VertexIndexMap vertex_index, Buffer sources,
         typename graph_traits<Graph>::edges_size_type delta,
- boost::detail::error_property_not_found)
+ boost::param_not_found)
     {
       boost::graph::parallel::detail::brandes_betweenness_centrality_dispatch2(
        g, centrality, edge_centrality_map, vertex_index, sources, delta);
@@ -1417,7 +1417,8 @@
   typedef queue<typename graph_traits<Graph>::vertex_descriptor> queue_t;
   queue_t q;
 
- typedef typename property_value<named_params, edge_weight_t>::type ew;
+ typedef typename get_param_type<edge_weight_t, named_params>::type ew_param;
+ typedef typename detail::choose_impl_result<mpl::true_, Graph, ew_param, edge_weight_t>::type ew;
   graph::parallel::detail::brandes_betweenness_centrality_dispatch1<ew>::run(
     g,
     choose_param(get_param(params, vertex_centrality),
@@ -1427,7 +1428,7 @@
     choose_const_pmap(get_param(params, vertex_index), g, vertex_index),
     choose_param(get_param(params, buffer_param_t()), boost::ref(q)),
     choose_param(get_param(params, lookahead_t()), 0),
- get_param(params, edge_weight));
+ choose_const_pmap(get_param(params, edge_weight), g, edge_weight));
 }
 
 template<typename Graph, typename CentralityMap>
@@ -1605,14 +1606,14 @@
   };
 
   template<>
- struct non_distributed_brandes_betweenness_centrality_dispatch1<detail::error_property_not_found>
+ struct non_distributed_brandes_betweenness_centrality_dispatch1<param_not_found>
   {
     template<typename ProcessGroup, typename Graph, typename CentralityMap,
              typename EdgeCentralityMap, typename VertexIndexMap, typename Buffer>
     static void
     run(const ProcessGroup& pg, const Graph& g, CentralityMap centrality,
         EdgeCentralityMap edge_centrality_map, VertexIndexMap vertex_index,
- Buffer sources, detail::error_property_not_found)
+ Buffer sources, param_not_found)
     {
       non_distributed_brandes_betweenness_centrality_dispatch2(pg, g, centrality, edge_centrality_map,
                                                                vertex_index, sources);
@@ -1631,7 +1632,8 @@
   typedef queue<int> queue_t;
   queue_t q;
 
- typedef typename property_value<named_params, edge_weight_t>::type ew;
+ typedef typename get_param_type<edge_weight_t, named_params>::type ew_param;
+ typedef typename detail::choose_impl_result<mpl::true_, Graph, ew_param, edge_weight_t>::type ew;
   detail::graph::non_distributed_brandes_betweenness_centrality_dispatch1<ew>::run(
     pg, g,
     choose_param(get_param(params, vertex_centrality),
@@ -1640,7 +1642,7 @@
                  dummy_property_map()),
     choose_const_pmap(get_param(params, vertex_index), g, vertex_index),
     choose_param(get_param(params, buffer_param_t()), boost::ref(q)),
- get_param(params, edge_weight));
+ choose_const_pmap(get_param(params, edge_weight), g, edge_weight));
 }
 
 template<typename ProcessGroup, typename Graph, typename CentralityMap>

Modified: trunk/boost/graph/distributed/breadth_first_search.hpp
==============================================================================
--- trunk/boost/graph/distributed/breadth_first_search.hpp (original)
+++ trunk/boost/graph/distributed/breadth_first_search.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -118,7 +118,7 @@
        typename graph_traits<DistributedGraph>::vertex_descriptor s,
        ColorMap color,
        BFSVisitor vis,
- error_property_not_found,
+ boost::param_not_found,
        VertexIndexMap vertex_index)
     {
       using boost::graph::parallel::process_group;

Modified: trunk/boost/graph/distributed/compressed_sparse_row_graph.hpp
==============================================================================
--- trunk/boost/graph/distributed/compressed_sparse_row_graph.hpp (original)
+++ trunk/boost/graph/distributed/compressed_sparse_row_graph.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -365,30 +365,22 @@
   // Directly access a vertex or edge bundle
   vertex_bundled& operator[](vertex_descriptor v)
   {
- std::pair<process_id_type, vertex_descriptor> locator
- = get(vertex_global, *this, v);
- BOOST_ASSERT(locator.first == process_id(m_process_group));
- return base().m_vertex_properties[locator.second];
+ return get(vertex_bundle, *this, v);
   }
 
   const vertex_bundled& operator[](vertex_descriptor v) const
   {
- std::pair<process_id_type, vertex_descriptor> locator
- = get(vertex_global, *this, v);
- BOOST_ASSERT(locator.first == process_id(m_process_group));
- return base().m_process_group[locator.second];
+ return get(vertex_bundle, *this, v);
   }
 
   edge_bundled& operator[](edge_descriptor e)
   {
- BOOST_ASSERT(get(vertex_owner, *this, e.src) == process_id(m_process_group));
- return base().m_edge_properties[e.idx];
+ return get(edge_bundle, *this, e);
   }
 
   const edge_bundled& operator[](edge_descriptor e) const
   {
- BOOST_ASSERT(get(vertex_owner, *this, e.src) == process_id(m_process_group));
- return base().m_edge_properties[e.idx];
+ return get(edge_bundle, *this, e);
   }
 
   // Create a vertex descriptor from a process ID and a local index.
@@ -1757,19 +1749,22 @@
  public:
   // -----------------------------------------------------------------
   // Readable Property Map concept requirements
- typedef std::pair<ProcessID, EdgeIndex> value_type;
- typedef value_type reference;
   typedef detail::csr_edge_descriptor<Vertex, EdgeIndex> key_type;
+ typedef std::pair<ProcessID, detail::csr_edge_descriptor<Vertex, EdgeIndex> > value_type;
+ typedef value_type reference;
   typedef readable_property_map_tag category;
 };
 
 template<typename ProcessID, typename Vertex, typename EdgeIndex>
-inline std::pair<ProcessID, EdgeIndex>
+inline std::pair<ProcessID, detail::csr_edge_descriptor<Vertex, EdgeIndex> >
 get(csr_edge_global_map<ProcessID, Vertex, EdgeIndex> pm,
     typename csr_edge_global_map<ProcessID, Vertex, EdgeIndex>::key_type k)
 {
   const int local_index_bits = sizeof(Vertex) * CHAR_BIT - processor_bits;
- return std::pair<ProcessID, EdgeIndex>(k.src >> local_index_bits, k.idx);
+ const Vertex local_index_mask = Vertex(-1) >> processor_bits;
+ return std::pair<ProcessID, detail::csr_edge_descriptor<Vertex, EdgeIndex> >
+ ((k.src >> local_index_bits),
+ detail::csr_edge_descriptor<Vertex, EdgeIndex>(k.src & local_index_mask, k.idx));
 }
 
 template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
@@ -1796,7 +1791,7 @@
 template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
 inline
 std::pair<typename ProcessGroup::process_id_type,
- typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type>
+ typename BOOST_DISTRIB_CSR_GRAPH_TYPE::base_type::edge_descriptor>
 get(edge_global_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
     typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor k)
 {
@@ -1818,7 +1813,7 @@
 template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
 inline
 std::pair<typename ProcessGroup::process_id_type,
- typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type>
+ typename BOOST_DISTRIB_CSR_GRAPH_TYPE::base_type::edge_descriptor>
 get(edge_global_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
     typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor k)
 {
@@ -1827,12 +1822,16 @@
 
   const int local_index_bits =
     sizeof(vertex_descriptor) * CHAR_BIT - processor_bits;
+ const typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type local_index_mask =
+ typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type(-1) >> processor_bits;
   
   typedef std::pair<typename ProcessGroup::process_id_type,
- typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type>
+ typename BOOST_DISTRIB_CSR_GRAPH_TYPE::base_type::edge_descriptor>
     result_type;
 
- return result_type(k.src >> local_index_bits, k.idx);
+ return result_type(k.src >> local_index_bits,
+ typename BOOST_DISTRIB_CSR_GRAPH_TYPE::base_type::edge_descriptor
+ (k.src & local_index_mask, k.idx));
 }
 
 // -----------------------------------------------------------------
@@ -1847,7 +1846,8 @@
   typedef local_property_map<
             typename BOOST_DISTRIB_CSR_GRAPH_TYPE::process_group_type,
             global_map,
- identity_property_map> type;
+ typename property_map<typename BOOST_DISTRIB_CSR_GRAPH_TYPE::base_type, edge_index_t>::type
+ > type;
   typedef type const_type;
 };
 
@@ -1859,7 +1859,7 @@
   typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_index_t>
     ::type result_type;
   return result_type(g.process_group(), get(edge_global, g),
- identity_property_map());
+ get(edge_index, g.base()));
 }
 
 template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
@@ -1878,7 +1878,7 @@
   typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_index_t>
     ::const_type result_type;
   return result_type(g.process_group(), get(edge_global, g),
- identity_property_map());
+ get(edge_index, g.base()));
 }
 
 template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
@@ -1889,229 +1889,67 @@
   return k.idx;
 }
 
-/* Common traits for getting vertex_bundle and edge_bundle maps */
-
-namespace detail {
- template <typename Graph, typename T> struct get_bundles;
-
- template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename T>
- class get_bundles<BOOST_DISTRIB_CSR_GRAPH_TYPE, T> {
- typedef BOOST_DISTRIB_CSR_GRAPH_TYPE Graph;
- typedef typename Graph::process_group_type process_group_type;
-
- // Extract the global property map for our key type.
- typedef typename property_map<Graph, vertex_global_t>::const_type vertex_global_map;
- typedef typename property_traits<vertex_global_map>::value_type vertex_locator;
- typedef typename property_map<Graph, edge_global_t>::const_type edge_global_map;
- typedef typename property_traits<edge_global_map>::value_type edge_locator;
-
- // Build the local property map
- typedef bundle_property_map<std::vector<VertexProperty>,
- typename vertex_locator::second_type,
- VertexProperty,
- T> vertex_local_pmap;
-
- // Build the local const property map
- typedef bundle_property_map<const std::vector<VertexProperty>,
- typename vertex_locator::second_type,
- VertexProperty,
- const T> vertex_local_const_pmap;
-
- // Build the local property map
- typedef bundle_property_map<std::vector<EdgeProperty>,
- typename edge_locator::second_type,
- EdgeProperty,
- T> edge_local_pmap;
-
- // Build the local const property map
- typedef bundle_property_map<const std::vector<EdgeProperty>,
- typename edge_locator::second_type,
- EdgeProperty,
- const T> edge_local_const_pmap;
-
- public:
- typedef ::boost::parallel::distributed_property_map<
- process_group_type, vertex_global_map, vertex_local_pmap> vertex_map_type;
-
- typedef ::boost::parallel::distributed_property_map<
- process_group_type, vertex_global_map, vertex_local_const_pmap> vertex_map_const_type;
-
- typedef ::boost::parallel::distributed_property_map<
- process_group_type, edge_global_map, edge_local_pmap> edge_map_type;
-
- typedef ::boost::parallel::distributed_property_map<
- process_group_type, edge_global_map, edge_local_const_pmap> edge_map_const_type;
-
- };
-
- template <typename Graph> struct get_full_bundles;
-
- template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
- class get_full_bundles<BOOST_DISTRIB_CSR_GRAPH_TYPE> { // For vertex_bundle_t and edge_bundle_t
- typedef BOOST_DISTRIB_CSR_GRAPH_TYPE Graph;
- typedef typename Graph::process_group_type process_group_type;
-
- // Extract the global property map for our key type.
- typedef typename property_map<Graph, vertex_global_t>::const_type vertex_global_map;
- typedef typename property_traits<vertex_global_map>::value_type vertex_locator;
- typedef typename property_map<Graph, edge_global_t>::const_type edge_global_map;
- typedef typename property_traits<edge_global_map>::value_type edge_locator;
-
- // Build the local property maps
- typedef typename property_map<typename Graph::base_type, vertex_bundle_t>::type vertex_local_pmap;
- typedef typename property_map<typename Graph::base_type, vertex_bundle_t>::const_type vertex_local_const_pmap;
- typedef typename property_map<typename Graph::base_type, edge_bundle_t>::type edge_local_pmap;
- typedef typename property_map<typename Graph::base_type, edge_bundle_t>::const_type edge_local_const_pmap;
-
- public:
- typedef ::boost::parallel::distributed_property_map<
- process_group_type, vertex_global_map, vertex_local_pmap> vertex_map_type;
-
- typedef ::boost::parallel::distributed_property_map<
- process_group_type, vertex_global_map, vertex_local_const_pmap> vertex_map_const_type;
-
- typedef ::boost::parallel::distributed_property_map<
- process_group_type, edge_global_map, edge_local_pmap> edge_map_type;
-
- typedef ::boost::parallel::distributed_property_map<
- process_group_type, edge_global_map, edge_local_const_pmap> edge_map_const_type;
-
- };
-}
-
-template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
-struct property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_bundle_t>
-{
- typedef typename detail::get_full_bundles<BOOST_DISTRIB_CSR_GRAPH_TYPE>::vertex_map_type type;
- typedef typename detail::get_full_bundles<BOOST_DISTRIB_CSR_GRAPH_TYPE>::vertex_map_const_type const_type;
-};
-
-template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
-struct property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_bundle_t>
-{
- typedef typename detail::get_full_bundles<BOOST_DISTRIB_CSR_GRAPH_TYPE>::edge_map_type type;
- typedef typename detail::get_full_bundles<BOOST_DISTRIB_CSR_GRAPH_TYPE>::edge_map_const_type const_type;
-};
-
-// -----------------------------------------------------------------
-// Bundled Properties
-template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
-class property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, T Bundle::*>
-{
- typedef BOOST_DISTRIB_CSR_GRAPH_TYPE Graph;
- typedef typename Graph::process_group_type process_group_type;
+template <BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename Tag>
+class property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, Tag> {
+ typedef BOOST_DISTRIB_CSR_GRAPH_TYPE graph_type;
+ typedef typename graph_type::process_group_type process_group_type;
+ typedef typename graph_type::base_type base_graph_type;
+ typedef typename property_map<base_graph_type, Tag>::type
+ local_pmap;
+ typedef typename property_map<base_graph_type, Tag>::const_type
+ local_const_pmap;
+
+ typedef graph_traits<graph_type> traits;
+ typedef typename graph_traits<base_graph_type>::vertex_descriptor local_vertex;
+ typedef typename property_traits<local_pmap>::key_type local_key_type;
+
+ typedef typename property_traits<local_pmap>::value_type value_type;
+
+ typedef typename property_map<graph_type, vertex_global_t>::const_type
+ vertex_global_map;
+ typedef typename property_map<graph_type, edge_global_t>::const_type
+ edge_global_map;
+
+ typedef typename mpl::if_<is_same<typename detail::property_kind_from_graph<base_graph_type, Tag>::type,
+ vertex_property_tag>,
+ vertex_global_map, edge_global_map>::type
+ global_map;
 
 public:
- typedef typename mpl::if_<detail::is_vertex_bundle<VertexProperty,
- EdgeProperty,
- Bundle>,
- typename detail::get_bundles<BOOST_DISTRIB_CSR_GRAPH_TYPE, T>::vertex_map_type,
- typename detail::get_bundles<BOOST_DISTRIB_CSR_GRAPH_TYPE, T>::edge_map_type>
- ::type type;
-
- typedef typename mpl::if_<detail::is_vertex_bundle<VertexProperty,
- EdgeProperty,
- Bundle>,
- typename detail::get_bundles<BOOST_DISTRIB_CSR_GRAPH_TYPE, T>::vertex_map_const_type,
- typename detail::get_bundles<BOOST_DISTRIB_CSR_GRAPH_TYPE, T>::edge_map_const_type>
- ::type const_type;
-};
-
-namespace detail {
- // Retrieve the local bundle_property_map corresponding to a
- // non-const vertex property.
- template<typename Graph, typename T, typename Bundle>
- inline bundle_property_map<std::vector<typename Graph::vertex_bundled>,
- typename Graph::vertex_descriptor,
- typename Graph::vertex_bundled, T>
- get_distrib_csr_bundle(T Bundle::* p, Graph& g, mpl::true_)
- {
- typedef bundle_property_map<std::vector<typename Graph::vertex_bundled>,
- typename Graph::vertex_descriptor,
- typename Graph::vertex_bundled, T> result_type;
- return result_type(&g.base().vertex_properties().m_vertex_properties, p);
- }
-
- // Retrieve the local bundle_property_map corresponding to a
- // const vertex property.
- template<typename Graph, typename T, typename Bundle>
- inline bundle_property_map<const std::vector<typename Graph::vertex_bundled>,
- typename Graph::vertex_descriptor,
- typename Graph::vertex_bundled, const T>
- get_distrib_csr_bundle(T Bundle::* p, const Graph& g, mpl::true_)
- {
- typedef bundle_property_map<
- const std::vector<typename Graph::vertex_bundled>,
- typename Graph::vertex_descriptor,
- typename Graph::vertex_bundled, const T> result_type;
- return result_type(&g.base().vertex_properties().m_vertex_properties, p);
- }
+ typedef ::boost::parallel::distributed_property_map<
+ process_group_type, global_map, local_pmap> type;
 
- // Retrieve the local bundle_property_map corresponding to a
- // non-const edge property.
- template<typename Graph, typename T, typename Bundle>
- inline bundle_property_map<std::vector<typename Graph::edge_bundled>,
- typename Graph::edges_size_type,
- typename Graph::edge_bundled, T>
- get_distrib_csr_bundle(T Bundle::* p, Graph& g, mpl::false_)
- {
- typedef bundle_property_map<std::vector<typename Graph::edge_bundled>,
- typename Graph::edges_size_type,
- typename Graph::edge_bundled, T> result_type;
- return result_type(&g.base().edge_properties().m_edge_properties, p);
- }
-
- // Retrieve the local bundle_property_map corresponding to a
- // const edge property.
- template<typename Graph, typename T, typename Bundle>
- inline bundle_property_map<const std::vector<typename Graph::edge_bundled>,
- typename Graph::edges_size_type,
- typename Graph::edge_bundled, const T>
- get_distrib_csr_bundle(T Bundle::* p, const Graph& g, mpl::false_)
- {
- typedef bundle_property_map<
- const std::vector<typename Graph::edge_bundled>,
- typename Graph::edges_size_type,
- typename Graph::edge_bundled, const T> result_type;
- return result_type(&g.base().edge_properties().m_edge_properties, p);
- }
-}
+ typedef ::boost::parallel::distributed_property_map<
+ process_group_type, global_map, local_const_pmap> const_type;
+};
 
-template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
-typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, T Bundle::*>::type
-get(T Bundle::* p, BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+template <BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename Tag>
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, Tag>::type
+get(Tag tag, BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
 {
   typedef BOOST_DISTRIB_CSR_GRAPH_TYPE Graph;
- typedef typename property_map<Graph, T Bundle::*>::type result_type;
-
- // Resolver
+ typedef typename property_map<Graph, Tag>::type result_type;
   typedef typename property_traits<result_type>::value_type value_type;
- typedef typename property_reduce<T Bundle::*>::template apply<value_type>
+ typedef typename property_reduce<Tag>::template apply<value_type>
     reduce;
 
- typedef typename property_traits<result_type>::key_type descriptor;
- typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
- typedef typename mpl::if_<is_same<descriptor, vertex_descriptor>,
+ typedef typename mpl::if_<is_same<typename detail::property_kind_from_graph<Graph, Tag>::type,
+ vertex_property_tag>,
                             vertex_global_t, edge_global_t>::type
     global_map_t;
 
   return result_type(g.process_group(), get(global_map_t(), g),
- detail::get_distrib_csr_bundle
- (p, g, mpl::bool_<is_same<descriptor,
- vertex_descriptor>::value>()),
- reduce());
+ get(tag, g.base()), reduce());
 }
 
-template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
-typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, T Bundle::*>::const_type
-get(T Bundle::* p, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename Tag>
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, Tag>::const_type
+get(Tag tag, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
 {
   typedef BOOST_DISTRIB_CSR_GRAPH_TYPE Graph;
- typedef typename property_map<Graph, T Bundle::*>::const_type result_type;
-
- // Resolver
+ typedef typename property_map<Graph, Tag>::const_type result_type;
   typedef typename property_traits<result_type>::value_type value_type;
- typedef typename property_reduce<T Bundle::*>::template apply<value_type>
+ typedef typename property_reduce<Tag>::template apply<value_type>
     reduce;
 
   typedef typename property_traits<result_type>::key_type descriptor;
@@ -2121,10 +1959,7 @@
     global_map_t;
 
   return result_type(g.process_group(), get(global_map_t(), g),
- detail::get_distrib_csr_bundle
- (p, g, mpl::bool_<is_same<descriptor,
- vertex_descriptor>::value>()),
- reduce());
+ get(tag, g.base()), reduce());
 }
 
 namespace mpi {

Modified: trunk/boost/graph/distributed/dijkstra_shortest_paths.hpp
==============================================================================
--- trunk/boost/graph/distributed/dijkstra_shortest_paths.hpp (original)
+++ trunk/boost/graph/distributed/dijkstra_shortest_paths.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -49,7 +49,7 @@
     };
 
     template<>
- struct parallel_dijkstra_impl2< ::boost::detail::error_property_not_found >
+ struct parallel_dijkstra_impl2< ::boost::param_not_found >
     {
       template<typename DistributedGraph, typename DijkstraVisitor,
                typename PredecessorMap, typename DistanceMap,
@@ -60,7 +60,7 @@
       run(const DistributedGraph& g,
           typename graph_traits<DistributedGraph>::vertex_descriptor s,
           PredecessorMap predecessor, DistanceMap distance,
- ::boost::detail::error_property_not_found,
+ ::boost::param_not_found,
           WeightMap weight, IndexMap index_map, ColorMap color_map,
           Compare compare, Combine combine, DistInf inf, DistZero zero,
           DijkstraVisitor vis)
@@ -95,7 +95,7 @@
     };
     
     template<>
- struct parallel_dijkstra_impl< ::boost::detail::error_property_not_found >
+ struct parallel_dijkstra_impl< ::boost::param_not_found >
     {
     private:
       template<typename DistributedGraph, typename DijkstraVisitor,
@@ -131,7 +131,7 @@
           typename graph_traits<DistributedGraph>::vertex_descriptor s,
           PredecessorMap predecessor, DistanceMap distance,
           Lookahead lookahead, WeightMap weight, IndexMap index_map,
- ::boost::detail::error_property_not_found,
+ ::boost::param_not_found,
           Compare compare, Combine combine, DistInf inf, DistZero zero,
           DijkstraVisitor vis)
       {
@@ -190,7 +190,7 @@
                                   IndexMap> DefColorMap;
     DefColorMap color_map(color.begin(), index_map);
 
- typedef typename property_value< bgl_named_params<T, Tag, Base>,
+ typedef typename get_param_type< bgl_named_params<T, Tag, Base>,
       vertex_color_t>::type color_map_type;
 
     graph::detail::parallel_dijkstra_impl<color_map_type>

Modified: trunk/boost/graph/distributed/page_rank.hpp
==============================================================================
--- trunk/boost/graph/distributed/page_rank.hpp (original)
+++ trunk/boost/graph/distributed/page_rank.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -93,6 +93,7 @@
     ::const_type vertex_owner_map;
   typename property_map<Graph, vertex_owner_t>::const_type
     owner = get(vertex_owner, g);
+ (void)owner;
 
   typedef typename boost::graph::parallel::process_group_type<Graph>
     ::type process_group_type;

Modified: trunk/boost/graph/edmonds_karp_max_flow.hpp
==============================================================================
--- trunk/boost/graph/edmonds_karp_max_flow.hpp (original)
+++ trunk/boost/graph/edmonds_karp_max_flow.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -140,7 +140,7 @@
       }
     };
     template<>
- struct edmonds_karp_dispatch2<detail::error_property_not_found> {
+ struct edmonds_karp_dispatch2<param_not_found> {
       template <class Graph, class PredMap, class P, class T, class R>
       static typename edge_capacity_value<Graph, P, T, R>::type
       apply
@@ -149,7 +149,7 @@
        typename graph_traits<Graph>::vertex_descriptor sink,
        PredMap pred,
        const bgl_named_params<P, T, R>& params,
- detail::error_property_not_found)
+ param_not_found)
       {
         typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
         typedef typename graph_traits<Graph>::vertices_size_type size_type;
@@ -183,13 +183,13 @@
             const bgl_named_params<P, T, R>& params,
             PredMap pred)
       {
- typedef typename property_value< bgl_named_params<P,T,R>, vertex_color_t>::type C;
+ typedef typename get_param_type< bgl_named_params<P,T,R>, vertex_color_t>::type C;
         return edmonds_karp_dispatch2<C>::apply
           (g, src, sink, pred, params, get_param(params, vertex_color));
       }
     };
     template<>
- struct edmonds_karp_dispatch1<detail::error_property_not_found> {
+ struct edmonds_karp_dispatch1<param_not_found> {
 
       template <class Graph, class P, class T, class R>
       static typename edge_capacity_value<Graph, P, T, R>::type
@@ -198,7 +198,7 @@
        typename graph_traits<Graph>::vertex_descriptor src,
        typename graph_traits<Graph>::vertex_descriptor sink,
        const bgl_named_params<P, T, R>& params,
- detail::error_property_not_found)
+ param_not_found)
       {
         typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
         typedef typename graph_traits<Graph>::vertices_size_type size_type;
@@ -206,7 +206,7 @@
           num_vertices(g) : 1;
         std::vector<edge_descriptor> pred_vec(n);
         
- typedef typename property_value< bgl_named_params<P,T,R>, vertex_color_t>::type C;
+ typedef typename get_param_type< bgl_named_params<P,T,R>, vertex_color_t>::type C;
         return edmonds_karp_dispatch2<C>::apply
           (g, src, sink,
            make_iterator_property_map(pred_vec.begin(), choose_const_pmap
@@ -227,7 +227,7 @@
      typename graph_traits<Graph>::vertex_descriptor sink,
      const bgl_named_params<P, T, R>& params)
   {
- typedef typename property_value< bgl_named_params<P,T,R>, vertex_predecessor_t>::type Pred;
+ typedef typename get_param_type< bgl_named_params<P,T,R>, vertex_predecessor_t>::type Pred;
     return detail::edmonds_karp_dispatch1<Pred>::apply
       (g, src, sink, params, get_param(params, vertex_predecessor));
   }

Modified: trunk/boost/graph/fruchterman_reingold.hpp
==============================================================================
--- trunk/boost/graph/fruchterman_reingold.hpp (original)
+++ trunk/boost/graph/fruchterman_reingold.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -363,7 +363,7 @@
   };
 
   template<>
- struct fr_force_directed_layout<error_property_not_found>
+ struct fr_force_directed_layout<param_not_found>
   {
     template<typename Topology, typename Graph, typename PositionMap,
              typename AttractiveForce, typename RepulsiveForce,
@@ -377,7 +377,7 @@
         RepulsiveForce repulsive_force,
         ForcePairs force_pairs,
         Cooling cool,
- error_property_not_found,
+ param_not_found,
         const bgl_named_params<Param, Tag, Rest>& params)
     {
       typedef typename Topology::point_difference_type PointDiff;
@@ -404,7 +404,7 @@
    const Topology& topology,
    const bgl_named_params<Param, Tag, Rest>& params)
 {
- typedef typename property_value<bgl_named_params<Param,Tag,Rest>,
+ typedef typename get_param_type<bgl_named_params<Param,Tag,Rest>,
                                   vertex_displacement_t>::type D;
 
   detail::fr_force_directed_layout<D>::run

Modified: trunk/boost/graph/graph_traits.hpp
==============================================================================
--- trunk/boost/graph/graph_traits.hpp (original)
+++ trunk/boost/graph/graph_traits.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -15,8 +15,11 @@
 #include <utility> /* Primarily for std::pair */
 #include <boost/tuple/tuple.hpp>
 #include <boost/mpl/if.hpp>
+#include <boost/mpl/eval_if.hpp>
 #include <boost/mpl/bool.hpp>
 #include <boost/mpl/not.hpp>
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/void.hpp>
 #include <boost/type_traits/is_same.hpp>
 #include <boost/iterator/iterator_categories.hpp>
 #include <boost/iterator/iterator_adaptor.hpp>
@@ -218,28 +221,31 @@
     //?? not the right place ?? Lee
     typedef boost::forward_traversal_tag multi_pass_input_iterator_tag;
 
- // Forward declare graph_bundle_t property name (from
- // boost/graph/properties.hpp, which includes this file) for
- // bundled_result.
- enum graph_bundle_t {graph_bundle};
+ namespace detail {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(graph_property_type)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(edge_property_type)
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(vertex_property_type)
+
+ template <typename G> struct get_graph_property_type {typedef typename G::graph_property_type type;};
+ template <typename G> struct get_edge_property_type {typedef typename G::edge_property_type type;};
+ template <typename G> struct get_vertex_property_type {typedef typename G::vertex_property_type type;};
+ }
 
     template <typename G>
- struct graph_property_type {
- typedef typename G::graph_property_type type;
- };
+ struct graph_property_type
+ : boost::mpl::eval_if<detail::has_graph_property_type<G>,
+ detail::get_graph_property_type<G>,
+ boost::mpl::void_> {};
     template <typename G>
- struct edge_property_type {
- typedef typename G::edge_property_type type;
- };
+ struct edge_property_type
+ : boost::mpl::eval_if<detail::has_edge_property_type<G>,
+ detail::get_edge_property_type<G>,
+ boost::mpl::void_> {};
     template <typename G>
- struct vertex_property_type {
- typedef typename G::vertex_property_type type;
- };
-
- struct no_bundle { };
- struct no_graph_bundle : no_bundle { };
- struct no_vertex_bundle : no_bundle { };
- struct no_edge_bundle : no_bundle { };
+ struct vertex_property_type
+ : boost::mpl::eval_if<detail::has_vertex_property_type<G>,
+ detail::get_vertex_property_type<G>,
+ boost::mpl::void_> {};
 
     template<typename G>
     struct graph_bundle_type {
@@ -281,7 +287,7 @@
       // A helper metafunction for determining whether or not a type is
       // bundled.
       template <typename T>
- struct is_no_bundle : mpl::bool_<is_convertible<T, no_bundle>::value>
+ struct is_no_bundle : mpl::bool_<is_same<T, no_property>::value>
       { };
     } // namespace graph_detail
 

Modified: trunk/boost/graph/named_function_params.hpp
==============================================================================
--- trunk/boost/graph/named_function_params.hpp (original)
+++ trunk/boost/graph/named_function_params.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -111,15 +111,16 @@
     BOOST_BGL_ONE_PARAM_REF(max_priority_queue, max_priority_queue)
 
   template <typename T, typename Tag, typename Base = no_property>
- struct bgl_named_params : public Base
+ struct bgl_named_params
   {
     typedef bgl_named_params self;
     typedef Base next_type;
     typedef Tag tag_type;
     typedef T value_type;
     bgl_named_params(T v = T()) : m_value(v) { }
- bgl_named_params(T v, const Base& b) : Base(b), m_value(v) { }
+ bgl_named_params(T v, const Base& b) : m_value(v), m_base(b) { }
     T m_value;
+ Base m_base;
 
 #define BOOST_BGL_ONE_PARAM_REF(name, key) \
     template <typename PType> \
@@ -182,145 +183,142 @@
   //===========================================================================
   // Functions for extracting parameters from bgl_named_params
 
- template <class Tag1, class Tag2, class T1, class Base>
- inline
- typename property_value< bgl_named_params<T1,Tag1,Base>, Tag2>::type
- get_param(const bgl_named_params<T1,Tag1,Base>& p, Tag2 tag2)
- {
- enum { match = detail::same_property<Tag1,Tag2>::value };
- typedef typename
- property_value< bgl_named_params<T1,Tag1,Base>, Tag2>::type T2;
- T2* t2 = 0;
- typedef detail::property_value_dispatch<match> Dispatcher;
- return Dispatcher::const_get_value(p, t2, tag2);
- }
+ template <typename Tag, typename Args>
+ struct lookup_named_param {};
 
+ template <typename T, typename Tag, typename Base>
+ struct lookup_named_param<Tag, bgl_named_params<T, Tag, Base> > {
+ typedef T type;
+ static const T& get(const bgl_named_params<T, Tag, Base>& p) {
+ return p.m_value;
+ }
+ };
 
- namespace detail {
- // MSVC++ workaround
- template <class Param>
- struct choose_param_helper {
- template <class Default> struct result { typedef Param type; };
- template <typename Default>
- static const Param& apply(const Param& p, const Default&) { return p; }
- };
- template <>
- struct choose_param_helper<error_property_not_found> {
- template <class Default> struct result { typedef Default type; };
- template <typename Default>
- static const Default& apply(const error_property_not_found&, const Default& d)
- { return d; }
- };
- } // namespace detail
+ template <typename Tag1, typename T, typename Tag, typename Base>
+ struct lookup_named_param<Tag1, bgl_named_params<T, Tag, Base> > {
+ typedef typename lookup_named_param<Tag1, Base>::type type;
+ static const type& get(const bgl_named_params<T, Tag, Base>& p) {
+ return lookup_named_param<Tag1, Base>::get(p.m_base);
+ }
+ };
+
+ template <typename Tag, typename Args, typename Def>
+ struct lookup_named_param_def {
+ typedef Def type;
+ static const Def& get(const Args&, const Def& def) {return def;}
+ };
+
+ template <typename T, typename Tag, typename Base, typename Def>
+ struct lookup_named_param_def<Tag, bgl_named_params<T, Tag, Base>, Def> {
+ typedef T type;
+ static const type& get(const bgl_named_params<T, Tag, Base>& p, const Def&) {
+ return p.m_value;
+ }
+ };
+
+ template <typename Tag1, typename T, typename Tag, typename Base, typename Def>
+ struct lookup_named_param_def<Tag1, bgl_named_params<T, Tag, Base>, Def> {
+ typedef typename lookup_named_param_def<Tag1, Base, Def>::type type;
+ static const type& get(const bgl_named_params<T, Tag, Base>& p, const Def& def) {
+ return lookup_named_param_def<Tag1, Base, Def>::get(p.m_base, def);
+ }
+ };
+
+ struct param_not_found {};
+
+ template <typename Tag, typename Args>
+ struct get_param_type:
+ lookup_named_param_def<Tag, Args, param_not_found> {};
+
+ template <class Tag, typename Args>
+ inline
+ const typename lookup_named_param_def<Tag, Args, param_not_found>::type&
+ get_param(const Args& p, Tag) {
+ return lookup_named_param_def<Tag, Args, param_not_found>::get(p, param_not_found());
+ }
 
   template <class P, class Default>
- const typename detail::choose_param_helper<P>::template result<Default>::type&
- choose_param(const P& param, const Default& d) {
- return detail::choose_param_helper<P>::apply(param, d);
+ const P& choose_param(const P& param, const Default&) {
+ return param;
+ }
+
+ template <class Default>
+ Default choose_param(const param_not_found&, const Default& d) {
+ return d;
   }
 
   template <typename T>
   inline bool is_default_param(const T&) { return false; }
 
- inline bool is_default_param(const detail::error_property_not_found&)
+ inline bool is_default_param(const param_not_found&)
     { return true; }
 
   namespace detail {
-
- struct choose_parameter {
- template <class P, class Graph, class Tag>
- struct bind_ {
- typedef const P& const_result_type;
- typedef const P& result_type;
- typedef P type;
- };
-
- template <class P, class Graph, class Tag>
- static typename bind_<P, Graph, Tag>::const_result_type
- const_apply(const P& p, const Graph&, Tag&)
- { return p; }
-
- template <class P, class Graph, class Tag>
- static typename bind_<P, Graph, Tag>::result_type
- apply(const P& p, Graph&, Tag&)
- { return p; }
- };
-
- struct choose_default_param {
- template <class P, class Graph, class Tag>
- struct bind_ {
- typedef typename property_map<Graph, Tag>::type
- result_type;
- typedef typename property_map<Graph, Tag>::const_type
- const_result_type;
- typedef typename property_map<Graph, Tag>::const_type
- type;
- };
-
- template <class P, class Graph, class Tag>
- static typename bind_<P, Graph, Tag>::const_result_type
- const_apply(const P&, const Graph& g, Tag tag) {
- return get(tag, g);
- }
- template <class P, class Graph, class Tag>
- static typename bind_<P, Graph, Tag>::result_type
- apply(const P&, Graph& g, Tag tag) {
- return get(tag, g);
- }
- };
-
- template <class Param>
- struct choose_property_map {
- typedef choose_parameter type;
- };
- template <>
- struct choose_property_map<detail::error_property_not_found> {
- typedef choose_default_param type;
- };
-
- template <class Param, class Graph, class Tag>
- struct choose_pmap_helper {
- typedef typename choose_property_map<Param>::type Selector;
- typedef typename Selector:: template bind_<Param, Graph, Tag> Bind;
- typedef Bind type;
- typedef typename Bind::result_type result_type;
- typedef typename Bind::const_result_type const_result_type;
- typedef typename Bind::type result;
- };
-
- // used in the max-flow algorithms
- template <class Graph, class P, class T, class R>
- struct edge_capacity_value
- {
- typedef bgl_named_params<P, T, R> Params;
- typedef typename property_value< Params, edge_capacity_t>::type Param;
- typedef typename detail::choose_pmap_helper<Param, Graph,
- edge_capacity_t>::result CapacityEdgeMap;
- typedef typename property_traits<CapacityEdgeMap>::value_type type;
- };
-
+ template <typename T>
+ struct const_type_as_type {typedef typename T::const_type type;};
   } // namespace detail
   
 
   // Use this function instead of choose_param() when you want
   // to avoid requiring get(tag, g) when it is not used.
+ namespace detail {
+ template <typename GraphIsConst, typename Graph, typename Param, typename Tag>
+ struct choose_impl_result:
+ boost::mpl::eval_if<
+ boost::is_same<Param, param_not_found>,
+ boost::mpl::eval_if<
+ GraphIsConst,
+ detail::const_type_as_type<property_map<Graph, Tag> >,
+ property_map<Graph, Tag> >,
+ boost::mpl::identity<Param> > {};
+
+ // Parameters are (NotFound, GraphIsConst, Graph, Param, Tag)
+ template <typename Param, typename Graph, typename PropertyTag>
+ typename property_map<Graph, PropertyTag>::const_type
+ choose_impl(boost::mpl::true_, boost::mpl::true_, const Graph& g, const Param&, PropertyTag tag) {
+ return get(tag, g);
+ }
+
+ template <typename Param, typename Graph, typename PropertyTag>
+ typename property_map<Graph, PropertyTag>::type
+ choose_impl(boost::mpl::true_, boost::mpl::false_, Graph& g, const Param&, PropertyTag tag) {
+ return get(tag, g);
+ }
+
+ template <typename GraphIsConst, typename Param, typename Graph, typename PropertyTag>
+ Param
+ choose_impl(boost::mpl::false_, GraphIsConst, const Graph&, const Param& p, PropertyTag) {
+ return p;
+ }
+ }
+
   template <typename Param, typename Graph, typename PropertyTag>
- typename
- detail::choose_pmap_helper<Param,Graph,PropertyTag>::const_result_type
+ typename detail::choose_impl_result<boost::mpl::true_, Graph, Param, PropertyTag>::type
   choose_const_pmap(const Param& p, const Graph& g, PropertyTag tag)
   {
- typedef typename
- detail::choose_pmap_helper<Param,Graph,PropertyTag>::Selector Choice;
- return Choice::const_apply(p, g, tag);
+ return detail::choose_impl(boost::mpl::bool_<boost::is_same<Param, param_not_found>::value>(),
+ boost::mpl::true_(), g, p, tag);
   }
 
   template <typename Param, typename Graph, typename PropertyTag>
- typename detail::choose_pmap_helper<Param,Graph,PropertyTag>::result_type
+ typename detail::choose_impl_result<boost::mpl::false_, Graph, Param, PropertyTag>::type
   choose_pmap(const Param& p, Graph& g, PropertyTag tag)
   {
- typedef typename
- detail::choose_pmap_helper<Param,Graph,PropertyTag>::Selector Choice;
- return Choice::apply(p, g, tag);
+ return detail::choose_impl(boost::mpl::bool_<boost::is_same<Param, param_not_found>::value>(),
+ boost::mpl::false_(), g, p, tag);
+ }
+
+ namespace detail {
+
+ // used in the max-flow algorithms
+ template <class Graph, class P, class T, class R>
+ struct edge_capacity_value
+ {
+ typedef bgl_named_params<P, T, R> Params;
+ typedef typename detail::choose_impl_result<boost::mpl::true_, Graph, typename get_param_type<Params, edge_capacity_t>::type, edge_capacity_t>::type CapacityEdgeMap;
+ typedef typename property_traits<CapacityEdgeMap>::value_type type;
+ };
+
   }
 
   // Declare all new tags
@@ -353,7 +351,7 @@
       typedef convert_bgl_params_to_boost_parameter<typename T::next_type> rest_conv;
       typedef boost::parameter::aux::arg_list<tagged_arg_type, typename rest_conv::type> type;
       static type conv(const T& x) {
- return type(tagged_arg_type(x.m_value), rest_conv::conv(x));
+ return type(tagged_arg_type(x.m_value), rest_conv::conv(x.m_base));
       }
     };
 
@@ -362,7 +360,7 @@
       typedef convert_bgl_params_to_boost_parameter<R> rest_conv;
       typedef typename rest_conv::type type;
       static type conv(const bgl_named_params<P, int, R>& x) {
- return rest_conv::conv(x);
+ return rest_conv::conv(x.m_base);
       }
     };
 
@@ -375,7 +373,7 @@
     template <>
     struct convert_bgl_params_to_boost_parameter<boost::no_named_parameters> {
       typedef boost::parameter::aux::empty_arg_list type;
- static type conv(const boost::no_property&) {return type();}
+ static type conv(const boost::no_named_parameters&) {return type();}
     };
 
     struct bgl_parameter_not_found_type {};

Modified: trunk/boost/graph/named_graph.hpp
==============================================================================
--- trunk/boost/graph/named_graph.hpp (original)
+++ trunk/boost/graph/named_graph.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -156,51 +156,6 @@
 #endif
 
 /*******************************************************************
- * Named graph-specific metafunctions *
- *******************************************************************/
-namespace detail {
- /** @internal
- * Extracts the type of a bundled vertex property from a vertex
- * property. The primary template matches when we have hit the end
- * of the @c property<> list.
- */
- template<typename VertexProperty>
- struct extract_bundled_vertex
- {
- typedef VertexProperty type;
- };
-
- /** @internal
- * Recursively extract the bundled vertex property from a vertex
- * property.
- */
- template<typename Tag, typename T, typename Base>
- struct extract_bundled_vertex<property<Tag, T, Base> >
- : extract_bundled_vertex<Base>
- { };
-
- /**
- * We have found the bundled vertex property type, marked with
- * vertex_bundle_t.
- */
- template<typename T, typename Base>
- struct extract_bundled_vertex<property<vertex_bundle_t, T, Base> >
- {
- typedef T type;
- };
-
- /**
- * Translate @c no_property into @c error_property_not_found when we
- * have failed to extract a bundled vertex property type.
- */
- template<>
- struct extract_bundled_vertex<no_property>
- {
- typedef boost::detail::error_property_not_found type;
- };
-}
-
-/*******************************************************************
  * Named graph mixin *
  *******************************************************************/
 
@@ -228,7 +183,7 @@
   typedef typename internal_vertex_name<VertexProperty>::type extract_name_type;
   /// The type of the "bundled" property, from which the name can be
   /// extracted.
- typedef typename detail::extract_bundled_vertex<VertexProperty>::type
+ typedef typename lookup_one_property<VertexProperty, vertex_bundle_t>::type
     bundled_vertex_property_type;
 
   /// The type of the function object that generates vertex properties
@@ -477,7 +432,7 @@
 {
   /// The type of the "bundled" property, from which the name can be
   /// extracted.
- typedef typename detail::extract_bundled_vertex<VertexProperty>::type
+ typedef typename lookup_one_property<VertexProperty, vertex_bundle_t>::type
     bundled_vertex_property_type;
 
   /// Notify the named_graph that we have added the given vertex. This

Modified: trunk/boost/graph/neighbor_bfs.hpp
==============================================================================
--- trunk/boost/graph/neighbor_bfs.hpp (original)
+++ trunk/boost/graph/neighbor_bfs.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -250,13 +250,13 @@
     };
 
     template <>
- struct neighbor_bfs_dispatch<detail::error_property_not_found> {
+ struct neighbor_bfs_dispatch<param_not_found> {
       template <class VertexListGraph, class P, class T, class R>
       static void apply
       (VertexListGraph& g,
        typename graph_traits<VertexListGraph>::vertex_descriptor s,
        const bgl_named_params<P, T, R>& params,
- detail::error_property_not_found)
+ param_not_found)
       {
         std::vector<default_color_type> color_vec(num_vertices(g));
         null_visitor null_vis;
@@ -288,7 +288,7 @@
     // graph is not really const since we may write to property maps
     // of the graph.
     VertexListGraph& ng = const_cast<VertexListGraph&>(g);
- typedef typename property_value< bgl_named_params<P,T,R>,
+ typedef typename get_param_type< bgl_named_params<P,T,R>,
       vertex_color_t>::type C;
     detail::neighbor_bfs_dispatch<C>::apply(ng, s, params,
                                             get_param(params, vertex_color));

Modified: trunk/boost/graph/properties.hpp
==============================================================================
--- trunk/boost/graph/properties.hpp (original)
+++ trunk/boost/graph/properties.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -68,26 +68,20 @@
   struct vertex_property_tag { };
   struct edge_property_tag { };
 
-#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
   // See examples/edge_property.cpp for how to use this.
 #define BOOST_INSTALL_PROPERTY(KIND, NAME) \
   template <> struct property_kind<KIND##_##NAME##_t> { \
     typedef KIND##_property_tag type; \
   }
-#else
-#define BOOST_INSTALL_PROPERTY(KIND, NAME) \
- template <> struct property_kind<KIND##_##NAME##_t> { \
- typedef KIND##_property_tag type; \
- }
-#endif
 
 #define BOOST_DEF_PROPERTY(KIND, NAME) \
   enum KIND##_##NAME##_t { KIND##_##NAME }; \
   BOOST_INSTALL_PROPERTY(KIND, NAME)
 
- BOOST_DEF_PROPERTY(vertex, all);
- BOOST_DEF_PROPERTY(edge, all);
- BOOST_DEF_PROPERTY(graph, all);
+ // These three are defined in boost/pending/property.hpp
+ BOOST_INSTALL_PROPERTY(vertex, all);
+ BOOST_INSTALL_PROPERTY(edge, all);
+ BOOST_INSTALL_PROPERTY(graph, all);
   BOOST_DEF_PROPERTY(vertex, index);
   BOOST_DEF_PROPERTY(vertex, index1);
   BOOST_DEF_PROPERTY(vertex, index2);
@@ -128,10 +122,10 @@
   BOOST_DEF_PROPERTY(graph, visitor);
 
   // These tags are used for property bundles
- // BOOST_DEF_PROPERTY(graph, bundle); -- needed in graph_traits.hpp, so enum is defined there
+ // These three are defined in boost/pending/property.hpp
   BOOST_INSTALL_PROPERTY(graph, bundle);
- BOOST_DEF_PROPERTY(vertex, bundle);
- BOOST_DEF_PROPERTY(edge, bundle);
+ BOOST_INSTALL_PROPERTY(vertex, bundle);
+ BOOST_INSTALL_PROPERTY(edge, bundle);
 
   // These tags are used to denote the owners and local descriptors
   // for the vertices and edges of a distributed graph.
@@ -148,6 +142,25 @@
 
   namespace detail {
 
+ template <typename G, typename Tag>
+ struct property_kind_from_graph: property_kind<Tag> {};
+
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+ template <typename G, typename R, typename T>
+ struct property_kind_from_graph<G, R T::*> {
+ typedef typename boost::mpl::if_<
+ boost::is_same<T, typename vertex_bundle_type<G>::type>,
+ vertex_property_tag,
+ typename boost::mpl::if_<
+ boost::is_same<T, typename edge_bundle_type<G>::type>,
+ edge_property_tag,
+ typename boost::mpl::if_<
+ boost::is_same<T, typename graph_bundle_type<G>::type>,
+ graph_property_tag,
+ void>::type>::type>::type type;
+ };
+#endif
+
     struct dummy_edge_property_selector {
       template <class Graph, class Property, class Tag>
       struct bind_ {
@@ -213,45 +226,16 @@
       typedef typename Bind::type type;
       typedef typename Bind::const_type const_type;
     };
-
- // This selects the kind of property map, whether is maps from
- // edges or from vertices.
- //
- // It is overly complicated because it's a workaround for
- // partial specialization.
- struct choose_vertex_property_map {
- template <class Graph, class Property>
- struct bind_ {
- typedef vertex_property_map<Graph, Property> type;
- };
- };
- struct choose_edge_property_map {
- template <class Graph, class Property>
- struct bind_ {
- typedef edge_property_map<Graph, Property> type;
- };
- };
- template <class Kind>
- struct property_map_kind_selector {
- // VC++ gets confused if this isn't defined, even though
- // this never gets used.
- typedef choose_vertex_property_map type;
- };
- template <> struct property_map_kind_selector<vertex_property_tag> {
- typedef choose_vertex_property_map type;
- };
- template <> struct property_map_kind_selector<edge_property_tag> {
- typedef choose_edge_property_map type;
- };
   } // namespace detail
 
   template <class Graph, class Property>
   struct property_map {
   // private:
- typedef typename property_kind<Property>::type Kind;
- typedef typename detail::property_map_kind_selector<Kind>::type Selector;
- typedef typename Selector::template bind_<Graph, Property> Bind;
- typedef typename Bind::type Map;
+ typedef typename detail::property_kind_from_graph<Graph, Property>::type Kind;
+ typedef typename mpl::if_<
+ is_same<Kind, edge_property_tag>,
+ detail::edge_property_map<Graph, Property>,
+ detail::vertex_property_map<Graph, Property> >::type Map;
   public:
     typedef typename Map::type type;
     typedef typename Map::const_type const_type;
@@ -273,16 +257,8 @@
>::type type;
   };
 
- template <class Graph>
- class vertex_property {
- public:
- typedef typename Graph::vertex_property_type type;
- };
- template <class Graph>
- class edge_property {
- public:
- typedef typename Graph::edge_property_type type;
- };
+ template <class Graph> class vertex_property: vertex_property_type<Graph> {};
+ template <class Graph> class edge_property: edge_property_type<Graph> {};
 
   template <typename Graph>
   class degree_property_map
@@ -383,99 +359,6 @@
 # define BOOST_GRAPH_NO_BUNDLED_PROPERTIES
 #endif
 
-#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
- template<typename Graph, typename Descriptor, typename Bundle, typename T>
- struct bundle_property_map
- : put_get_helper<T&, bundle_property_map<Graph, Descriptor, Bundle, T> >
- {
- typedef Descriptor key_type;
- typedef typename remove_const<T>::type value_type;
- typedef T& reference;
- typedef lvalue_property_map_tag category;
-
- bundle_property_map() { }
- bundle_property_map(Graph* g_, T Bundle::* pm_) : g(g_), pm(pm_) {}
-
- reference operator[](key_type k) const { return (*g)[k].*pm; }
- private:
- Graph* g;
- T Bundle::* pm;
- };
-
- namespace detail {
- template<typename VertexBundle, typename EdgeBundle, typename Bundle>
- struct is_vertex_bundle
- : mpl::and_<is_convertible<VertexBundle*, Bundle*>,
- mpl::and_<mpl::not_<is_void<VertexBundle> >,
- mpl::not_<is_same<VertexBundle, no_property> > > >
- { };
- }
-
- // Specialize the property map template to generate bundled property maps.
- template <typename Graph, typename T, typename Bundle>
- struct property_map<Graph, T Bundle::*>
- {
- private:
- typedef graph_traits<Graph> traits;
- typedef typename Graph::vertex_bundled vertex_bundled;
- typedef typename Graph::edge_bundled edge_bundled;
- typedef typename mpl::if_c<(detail::is_vertex_bundle<vertex_bundled, edge_bundled, Bundle>::value),
- typename traits::vertex_descriptor,
- typename traits::edge_descriptor>::type
- descriptor;
- typedef typename mpl::if_c<(detail::is_vertex_bundle<vertex_bundled, edge_bundled, Bundle>::value),
- vertex_bundled,
- edge_bundled>::type
- actual_bundle;
-
- public:
- typedef bundle_property_map<Graph, descriptor, actual_bundle, T> type;
- typedef bundle_property_map<const Graph, descriptor, actual_bundle, const T>
- const_type;
- };
-#endif
-
-// These metafunctions help implement the process of determining the vertex
-// and edge properties of a graph.
-namespace graph_detail {
- template<typename Retag>
- struct retagged_property {
- typedef typename Retag::type type;
- };
-
- // Search the normalized PropList (as returned by retagged<>::type) for
- // the given bundle. Return the type error if no such bundle can be found.
- template <typename PropList, typename Bundle>
- struct retagged_bundle {
- typedef typename property_value<PropList, Bundle>::type Value;
- typedef typename mpl::if_<
- is_same<Value, detail::error_property_not_found>, no_bundle, Value
- >::type type;
- };
-
- template<typename Prop, typename Bundle>
- class normal_property {
- // Normalize the property into a property list.
- typedef detail::retag_property_list<Bundle, Prop> List;
- public:
- // Extract the normalized property and bundle types.
- typedef typename retagged_property<List>::type property;
- typedef typename retagged_bundle<property, Bundle>::type bundle;
- };
-
- template<typename Prop>
- struct graph_prop : normal_property<Prop, graph_bundle_t>
- { };
-
- template<typename Prop>
- struct vertex_prop : normal_property<Prop, vertex_bundle_t>
- { };
-
- template<typename Prop>
- struct edge_prop : normal_property<Prop, edge_bundle_t>
- { };
-} // namespace graph_detail
-
 // NOTE: These functions are declared, but never defined since they need to
 // be overloaded by graph implementations. However, we need them to be
 // declared for the functions below.
@@ -498,17 +381,11 @@
 
 template<typename Graph>
 inline typename graph_property<Graph, graph_bundle_t>::type const&
-get_property(Graph const& g) {
+get_property(const Graph& g) {
   return get_property(g, graph_bundle);
 }
 #endif
 
 } // namespace boost
 
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-// Stay out of the way of the concept checking class
-# undef Graph
-# undef RandomAccessIterator
-#endif
-
-#endif /* BOOST_GRAPH_PROPERTIES_HPPA */
+#endif /* BOOST_GRAPH_PROPERTIES_HPP */

Modified: trunk/boost/graph/reverse_graph.hpp
==============================================================================
--- trunk/boost/graph/reverse_graph.hpp (original)
+++ trunk/boost/graph/reverse_graph.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -358,36 +358,23 @@
     }
   };
 
- struct reverse_graph_vertex_property_selector {
- template <class ReverseGraph, class Property, class Tag>
- struct bind_ {
- typedef typename ReverseGraph::base_type Graph;
- typedef property_map<Graph, Tag> PMap;
- typedef typename PMap::type type;
- typedef typename PMap::const_type const_type;
- };
- };
-
- struct reverse_graph_edge_property_selector {
- template <class ReverseGraph, class Property, class Tag>
- struct bind_ {
- typedef typename ReverseGraph::base_type Graph;
- typedef property_map<Graph, Tag> PMap;
- typedef reverse_graph_edge_property_map<typename PMap::type> type;
- typedef reverse_graph_edge_property_map<typename PMap::const_type> const_type;
- };
- };
-
 } // namespace detail
 
-template <>
-struct vertex_property_selector<reverse_graph_tag> {
- typedef detail::reverse_graph_vertex_property_selector type;
+template <class BidirGraph, class GRef, class Property>
+struct property_map<reverse_graph<BidirGraph, GRef>, Property> {
+ typedef boost::is_same<typename detail::property_kind_from_graph<BidirGraph, Property>::type, edge_property_tag> is_edge_prop;
+ typedef typename property_map<BidirGraph, Property>::type orig_type;
+ typedef typename property_map<BidirGraph, Property>::const_type orig_const_type;
+ typedef typename boost::mpl::if_<is_edge_prop, detail::reverse_graph_edge_property_map<orig_type>, orig_type>::type type;
+ typedef typename boost::mpl::if_<is_edge_prop, detail::reverse_graph_edge_property_map<orig_const_type>, orig_const_type>::type const_type;
 };
 
-template <>
-struct edge_property_selector<reverse_graph_tag> {
- typedef detail::reverse_graph_edge_property_selector type;
+template <class BidirGraph, class GRef, class Property>
+struct property_map<const reverse_graph<BidirGraph, GRef>, Property> {
+ typedef boost::is_same<typename detail::property_kind_from_graph<BidirGraph, Property>::type, edge_property_tag> is_edge_prop;
+ typedef typename property_map<BidirGraph, Property>::const_type orig_const_type;
+ typedef typename boost::mpl::if_<is_edge_prop, detail::reverse_graph_edge_property_map<orig_const_type>, orig_const_type>::type const_type;
+ typedef const_type type;
 };
 
 template <class BidirGraph, class GRef, class Property>
@@ -407,7 +394,7 @@
 
 template <class BidirectionalGraph, class GRef, class Property, class Key>
 typename property_traits<
- typename property_map<BidirectionalGraph, Property>::const_type
+ typename property_map<reverse_graph<BidirectionalGraph, GRef>, Property>::const_type
>::value_type
 get(Property p, const reverse_graph<BidirectionalGraph,GRef>& g, const Key& k)
 {
@@ -462,6 +449,23 @@
 template <class Graph, class GRef>
 detail::underlying_edge_desc_map_type<typename graph_traits<Graph>::edge_descriptor>
 get(edge_underlying_t,
+ reverse_graph<Graph,GRef>& g)
+{
+ return detail::underlying_edge_desc_map_type<typename graph_traits<Graph>::edge_descriptor>();
+}
+
+template <class Graph, class GRef>
+typename graph_traits<Graph>::edge_descriptor
+get(edge_underlying_t,
+ reverse_graph<Graph,GRef>& g,
+ const typename graph_traits<reverse_graph<Graph, GRef> >::edge_descriptor& k)
+{
+ return k.underlying_descx;
+}
+
+template <class Graph, class GRef>
+detail::underlying_edge_desc_map_type<typename graph_traits<Graph>::edge_descriptor>
+get(edge_underlying_t,
     const reverse_graph<Graph,GRef>& g)
 {
   return detail::underlying_edge_desc_map_type<typename graph_traits<Graph>::edge_descriptor>();

Modified: trunk/boost/graph/strong_components.hpp
==============================================================================
--- trunk/boost/graph/strong_components.hpp (original)
+++ trunk/boost/graph/strong_components.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -131,7 +131,7 @@
 
 
     template <>
- struct strong_comp_dispatch2<detail::error_property_not_found> {
+ struct strong_comp_dispatch2<param_not_found> {
       template <class Graph, class ComponentMap, class RootMap,
                 class P, class T, class R>
       inline static typename property_traits<ComponentMap>::value_type
@@ -139,7 +139,7 @@
             ComponentMap comp,
             RootMap r_map,
             const bgl_named_params<P, T, R>& params,
- detail::error_property_not_found)
+ param_not_found)
       {
         typedef typename graph_traits<Graph>::vertices_size_type size_type;
         size_type n = num_vertices(g) > 0 ? num_vertices(g) : 1;
@@ -179,7 +179,7 @@
       }
     };
     template <>
- struct strong_comp_dispatch1<detail::error_property_not_found> {
+ struct strong_comp_dispatch1<param_not_found> {
 
       template <class Graph, class ComponentMap,
                 class P, class T, class R>
@@ -187,7 +187,7 @@
       apply(const Graph& g,
             ComponentMap comp,
             const bgl_named_params<P, T, R>& params,
- detail::error_property_not_found)
+ param_not_found)
       {
         typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
         typename std::vector<Vertex>::size_type

Modified: trunk/boost/graph/subgraph.hpp
==============================================================================
--- trunk/boost/graph/subgraph.hpp (original)
+++ trunk/boost/graph/subgraph.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -103,13 +103,11 @@
 
     typedef typename Traits::in_edge_iterator in_edge_iterator;
 
- typedef typename Graph::edge_property_type edge_property_type;
- typedef typename Graph::vertex_property_type vertex_property_type;
- typedef typename Graph::vertex_bundled vertex_bundled;
- typedef typename Graph::edge_bundled edge_bundled;
+ typedef typename edge_property_type<Graph>::type edge_property_type;
+ typedef typename vertex_property_type<Graph>::type vertex_property_type;
     typedef subgraph_tag graph_tag;
     typedef Graph graph_type;
- typedef typename Graph::graph_property_type graph_property_type;
+ typedef typename graph_property_type<Graph>::type graph_property_type;
 
     // Create the main graph, the root of the subgraph tree
     subgraph()
@@ -348,9 +346,6 @@
     }
 };
 
-#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
-// TODO: I don't think these are required since the default metafunction
-// returns Graph::vertex_bundled.
 template <typename Graph>
 struct vertex_bundle_type<subgraph<Graph> >
     : vertex_bundle_type<Graph>
@@ -360,7 +355,11 @@
 struct edge_bundle_type<subgraph<Graph> >
     : edge_bundle_type<Graph>
 { };
-#endif // BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+
+template<typename Graph>
+struct graph_bundle_type<subgraph<Graph> >
+ : graph_bundle_type<Graph>
+{ };
 
 //===========================================================================
 // Functions special to the Subgraph Class
@@ -786,18 +785,19 @@
     subgraph_global_property_map()
     { }
 
- subgraph_global_property_map(GraphPtr g)
- : m_g(g)
+ subgraph_global_property_map(GraphPtr g, Tag tag)
+ : m_g(g), m_tag(tag)
     { }
 
     reference operator[](key_type e) const {
- PropertyMap pmap = get(Tag(), m_g->root().m_graph);
+ PropertyMap pmap = get(m_tag, m_g->root().m_graph);
         return m_g->is_root()
             ? pmap[e]
             : pmap[m_g->local_to_global(e)];
     }
 
     GraphPtr m_g;
+ Tag m_tag;
 };
 
 /**
@@ -824,17 +824,18 @@
     subgraph_local_property_map()
     { }
 
- subgraph_local_property_map(GraphPtr g)
- : m_g(g)
+ subgraph_local_property_map(GraphPtr g, Tag tag)
+ : m_g(g), m_tag(tag)
     { }
 
     reference operator[](key_type e) const {
         // Get property map on the underlying graph.
- PropertyMap pmap = get(Tag(), m_g->m_graph);
+ PropertyMap pmap = get(m_tag, m_g->m_graph);
         return pmap[e];
     }
 
     GraphPtr m_g;
+ Tag m_tag;
 };
 
 namespace detail {
@@ -949,139 +950,37 @@
     typedef detail::subgraph_property_generator type;
 };
 
-#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
-/** @internal
- * This property map implements local or global bundled property access on
- * an underlying graph. The LocalGlobal template template parameter must be
- * one of the local_property or global_property templates.
- */
-template <
- typename Graph, typename Descriptor, typename Bundle, typename T,
- template <typename> class LocalGlobal>
-struct subgraph_lg_bundle_property_map
- : put_get_helper<
- T&,
- subgraph_lg_bundle_property_map<Graph, Descriptor, Bundle, T, LocalGlobal>
- >
-{
-private:
- typedef LocalGlobal<Descriptor> Wrap;
-public:
- typedef Descriptor key_type;
- typedef typename remove_const<T>::type value_type;
- typedef T& reference;
- typedef lvalue_property_map_tag category;
-
- subgraph_lg_bundle_property_map()
- { }
-
- subgraph_lg_bundle_property_map(Graph* g, T Bundle::* p)
- : m_g(g), m_prop(p)
- { }
-
- reference operator[](key_type k) const
- { return (*m_g)[Wrap(k)].*m_prop; }
-
-private:
- Graph* m_g;
- T Bundle::* m_prop;
-};
-
-// Specialize the property map template to generate bundled property maps.
-// NOTE: I'm cheating (actually double-dipping) with the local/global subgraph
-// property templates. I'm not using them store descriptors, just specialize
-// the property map template for specific lookups.
-namespace graph_detail {
- // Help decoding some of the types required for property map definitions.
- template <typename Graph, typename T, typename Bundle>
- struct bundled_subgraph_pmap_helper {
- typedef subgraph<Graph> Subgraph;
- typedef graph_traits<Subgraph> Traits;
- typedef typename Subgraph::vertex_bundled VertBundled;
- typedef typename Subgraph::edge_bundled EdgeBundled;
-
- // Deduce the descriptor from the template params
- typedef typename mpl::if_<
- detail::is_vertex_bundle<VertBundled, EdgeBundled, Bundle>,
- typename Traits::vertex_descriptor, typename Traits::edge_descriptor
- >::type Desc;
-
- // Deduce the bundled property type
- typedef typename mpl::if_<
- detail::is_vertex_bundle<VertBundled, EdgeBundled, Bundle>,
- VertBundled, EdgeBundled
- >::type Prop;
- };
-} // namespace graph_detail
-
-template <typename Graph, typename T, typename Bundle>
-struct property_map<subgraph<Graph>, local_property<T Bundle::*> >
- : graph_detail::bundled_subgraph_pmap_helper<Graph, T, Bundle>
-{
-private:
- typedef graph_detail::bundled_subgraph_pmap_helper<Graph, T, Bundle> Base;
- typedef typename Base::Subgraph Subgraph;
- typedef typename Base::Desc Desc;
- typedef typename Base::Prop Prop;
-public:
- typedef subgraph_lg_bundle_property_map<
- Subgraph, Desc, Prop, T, local_property
- > type;
- typedef subgraph_lg_bundle_property_map<
- Subgraph const, Desc, Prop, T const, local_property
- > const_type;
-};
-
-template <typename Graph, typename T, typename Bundle>
-struct property_map<subgraph<Graph>, global_property<T Bundle::*> >
- : graph_detail::bundled_subgraph_pmap_helper<Graph, T, Bundle>
-{
-private:
- typedef graph_detail::bundled_subgraph_pmap_helper<Graph, T, Bundle> Base;
- typedef typename Base::Subgraph Subgraph;
- typedef typename Base::Desc Desc;
- typedef typename Base::Prop Prop;
-public:
- typedef subgraph_lg_bundle_property_map<
- Subgraph, Desc, Prop, T, global_property
- > type;
- typedef subgraph_lg_bundle_property_map<
- Subgraph const, Desc, Prop, T const, global_property
- > const_type;
-};
-#endif
-
 // ==================================================
 // get(p, g), get(p, g, k), and put(p, g, k, v)
 // ==================================================
 template <typename G, typename Property>
 typename property_map<subgraph<G>, Property>::type
-get(Property, subgraph<G>& g) {
+get(Property p, subgraph<G>& g) {
     typedef typename property_map< subgraph<G>, Property>::type PMap;
- return PMap(&g);
+ return PMap(&g, p);
 }
 
 template <typename G, typename Property>
 typename property_map<subgraph<G>, Property>::const_type
-get(Property, const subgraph<G>& g) {
+get(Property p, const subgraph<G>& g) {
     typedef typename property_map< subgraph<G>, Property>::const_type PMap;
- return PMap(&g);
+ return PMap(&g, p);
 }
 
 template <typename G, typename Property, typename Key>
 typename property_traits<
     typename property_map<subgraph<G>, Property>::const_type
>::value_type
-get(Property, const subgraph<G>& g, const Key& k) {
+get(Property p, const subgraph<G>& g, const Key& k) {
     typedef typename property_map< subgraph<G>, Property>::const_type PMap;
- PMap pmap(&g);
+ PMap pmap(&g, p);
     return pmap[k];
 }
 
 template <typename G, typename Property, typename Key, typename Value>
-void put(Property, subgraph<G>& g, const Key& k, const Value& val) {
+void put(Property p, subgraph<G>& g, const Key& k, const Value& val) {
     typedef typename property_map< subgraph<G>, Property>::type PMap;
- PMap pmap(&g);
+ PMap pmap(&g, p);
     pmap[k] = val;
 }
 
@@ -1091,20 +990,20 @@
 // ==================================================
 template <typename G, typename Property>
 typename property_map<subgraph<G>, global_property<Property> >::type
-get(global_property<Property>, subgraph<G>& g) {
+get(global_property<Property> p, subgraph<G>& g) {
     typedef typename property_map<
         subgraph<G>, global_property<Property>
>::type Map;
- return Map(&g);
+ return Map(&g, p.value);
 }
 
 template <typename G, typename Property>
 typename property_map<subgraph<G>, global_property<Property> >::const_type
-get(global_property<Property>, const subgraph<G>& g) {
+get(global_property<Property> p, const subgraph<G>& g) {
     typedef typename property_map<
         subgraph<G>, global_property<Property>
>::const_type Map;
- return Map(&g);
+ return Map(&g, p.value);
 }
 
 // ==================================================
@@ -1113,112 +1012,22 @@
 // ==================================================
 template <typename G, typename Property>
 typename property_map<subgraph<G>, local_property<Property> >::type
-get(local_property<Property>, subgraph<G>& g) {
+get(local_property<Property> p, subgraph<G>& g) {
     typedef typename property_map<
         subgraph<G>, local_property<Property>
>::type Map;
- return Map(&g);
+ return Map(&g, p.value);
 }
 
 template <typename G, typename Property>
 typename property_map<subgraph<G>, local_property<Property> >::const_type
-get(local_property<Property>, const subgraph<G>& g) {
+get(local_property<Property> p, const subgraph<G>& g) {
     typedef typename property_map<
         subgraph<G>, local_property<Property>
>::const_type Map;
- return Map(&g);
-}
-
-#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
-// ==================================================
-// get(bundle(p), g)
-// ==================================================
-
-template<typename G, typename T, typename Bundle>
-inline typename property_map<subgraph<G>, T Bundle::*>::type
-get(T Bundle::* p, subgraph<G>& g) {
- typedef typename property_map<subgraph<G>, T Bundle::*>::type Map;
- return Map(&g, p);
-}
-
-template<typename G, typename T, typename Bundle>
-inline typename property_map<subgraph<G>, T Bundle::*>::const_type
-get(T Bundle::* p, subgraph<G> const& g) {
- typedef typename property_map<subgraph<G>, T Bundle::*>::const_type Map;
- return Map(&g, p);
-}
-
-template <typename Graph, typename Type, typename Bundle, typename Key>
-inline Type get(Type Bundle::* p, subgraph<Graph> const& g, Key const& k)
-{ return get(get(p, g), k); }
-
-template <typename Graph, typename Type, typename Bundle, typename Key,
- typename Value>
-inline void put(Type Bundle::* p, Graph& g, Key const& k, Value const& v)
-{ put(get(p, g), k, v); }
-
-// =========================================================
-// Local bundled, get
-
-template<typename G, typename T, typename Bundle>
-inline typename property_map<
- subgraph<G>, local_property<T Bundle::*>
->::type
-get(local_property<T Bundle::*> p, subgraph<G>& g) {
- typedef typename property_map<
- subgraph<G>, local_property<T Bundle::*>
- >::type Map;
     return Map(&g, p.value);
 }
 
-template<typename G, typename T, typename Bundle>
-inline typename property_map<
- subgraph<G>, local_property<T Bundle::*>
->::const_type
-get(local_property<T Bundle::*> p, subgraph<G> const& g) {
- typedef typename property_map<
- subgraph<G>, local_property<T Bundle::*>
- >::const_type Map;
- return Map(&g, p.value);
-}
-
-template <typename Graph, typename Type, typename Bundle, typename Key>
-inline Type get(local_property<Type Bundle::*> p, subgraph<Graph> const& g,
- Key const& k)
-{ return get(get(p, g), k); }
-
-// =========================================================
-// Global bundled, get
-
-template<typename G, typename T, typename Bundle>
-inline typename property_map<
- subgraph<G>, global_property<T Bundle::*>
->::type
-get(global_property<T Bundle::*> p, subgraph<G>& g) {
- typedef typename property_map<
- subgraph<G>, global_property<T Bundle::*>
- >::type Map;
- return Map(&g, p.value);
-}
-
-template<typename G, typename T, typename Bundle>
-inline typename property_map<
- subgraph<G>, global_property<T Bundle::*>
->::const_type
-get(global_property<T Bundle::*> p, subgraph<G> const& g) {
- typedef typename property_map<
- subgraph<G>, global_property<T Bundle::*>
- >::const_type Map;
- return Map(&g, p.value);
-}
-
-template <typename Graph, typename Type, typename Bundle, typename Key>
-inline Type get(global_property<Type Bundle::*> p, subgraph<Graph> const& g,
- Key const& k)
-{ return get(get(p, g), k); }
-
-#endif
-
 template <typename G, typename Tag>
 inline typename graph_property<G, Tag>::type&
 get_property(subgraph<G>& g, Tag tag) {

Modified: trunk/boost/graph/undirected_dfs.hpp
==============================================================================
--- trunk/boost/graph/undirected_dfs.hpp (original)
+++ trunk/boost/graph/undirected_dfs.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -188,7 +188,7 @@
     };
 
     template <>
- struct udfs_dispatch<detail::error_property_not_found> {
+ struct udfs_dispatch<param_not_found> {
       template <typename Graph, typename Vertex, typename DFSVisitor,
                 typename EdgeColorMap,
                 typename P, typename T, typename R>
@@ -196,7 +196,7 @@
       apply(const Graph& g, DFSVisitor vis, Vertex start_vertex,
             const bgl_named_params<P, T, R>& params,
             EdgeColorMap edge_color,
- detail::error_property_not_found)
+ param_not_found)
       {
         std::vector<default_color_type> color_vec(num_vertices(g));
         default_color_type c = white_color; // avoid warning about un-init
@@ -219,7 +219,7 @@
   undirected_dfs(const Graph& g,
                  const bgl_named_params<P, T, R>& params)
   {
- typedef typename property_value< bgl_named_params<P, T, R>,
+ typedef typename get_param_type< bgl_named_params<P, T, R>,
       vertex_color_t>::type C;
     detail::udfs_dispatch<C>::apply
       (g,

Modified: trunk/boost/graph/undirected_graph.hpp
==============================================================================
--- trunk/boost/graph/undirected_graph.hpp (original)
+++ trunk/boost/graph/undirected_graph.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -38,14 +38,12 @@
 class undirected_graph
 {
 public:
- typedef typename graph_detail::graph_prop<GraphProp>::property graph_property_type;
- typedef typename graph_detail::graph_prop<GraphProp>::bundle graph_bundled;
-
- typedef typename graph_detail::vertex_prop<VertexProp>::property vertex_property_type;
- typedef typename graph_detail::vertex_prop<VertexProp>::bundle vertex_bundled;
-
- typedef typename graph_detail::edge_prop<EdgeProp>::property edge_property_type;
- typedef typename graph_detail::edge_prop<EdgeProp>::bundle edge_bundled;
+ typedef GraphProp graph_property_type;
+ typedef VertexProp vertex_property_type;
+ typedef EdgeProp edge_property_type;
+ typedef typename lookup_one_property<GraphProp, graph_bundle_t>::type graph_bundled;
+ typedef typename lookup_one_property<VertexProp, vertex_bundle_t>::type vertex_bundled;
+ typedef typename lookup_one_property<EdgeProp, edge_bundle_t>::type edge_bundled;
 
 private:
     // Embed indices into the vertex type.
@@ -530,36 +528,12 @@
                   UNDIRECTED_GRAPH& g)
 { return remove_in_edge_if(v, pred, g.impl()); }
 
-// Helper code for working with property maps
-namespace detail {
- struct undirected_graph_vertex_property_selector {
- template <class UndirectedGraph, class Property, class Tag>
- struct bind_ {
- typedef typename UndirectedGraph::graph_type Graph;
- typedef property_map<Graph, Tag> PropertyMap;
- typedef typename PropertyMap::type type;
- typedef typename PropertyMap::const_type const_type;
- };
- };
-
- struct undirected_graph_edge_property_selector {
- template <class UndirectedGraph, class Property, class Tag>
- struct bind_ {
- typedef typename UndirectedGraph::graph_type Graph;
- typedef property_map<Graph, Tag> PropertyMap;
- typedef typename PropertyMap::type type;
- typedef typename PropertyMap::const_type const_type;
- };
- };
-} // namespace detail
-
-template <>
-struct vertex_property_selector<undirected_graph_tag>
-{ typedef detail::undirected_graph_vertex_property_selector type; };
-
-template <>
-struct edge_property_selector<undirected_graph_tag>
-{ typedef detail::undirected_graph_edge_property_selector type; };
+template <UNDIRECTED_GRAPH_PARAMS, typename Property>
+struct property_map<UNDIRECTED_GRAPH, Property> {
+ typedef typename UNDIRECTED_GRAPH::graph_type Graph;
+ typedef typename property_map<Graph, Property>::type type;
+ typedef typename property_map<Graph, Property>::const_type const_type;
+};
 
 // PropertyGraph concepts
 template <UNDIRECTED_GRAPH_PARAMS, typename Property>
@@ -599,36 +573,6 @@
 inline void set_property(UNDIRECTED_GRAPH& g, Property p, Value v)
 { return set_property(g.impl(), p, v); }
 
-#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
-template <UNDIRECTED_GRAPH_PARAMS, typename Type, typename Bundle>
-inline typename property_map<UNDIRECTED_GRAPH, Type Bundle::*>::type
-get(Type Bundle::* p, UNDIRECTED_GRAPH& g) {
- typedef typename property_map<
- UNDIRECTED_GRAPH, Type Bundle::*
- >::type return_type;
- return return_type(&g, p);
-}
-
-template <UNDIRECTED_GRAPH_PARAMS, typename Type, typename Bundle>
-inline typename property_map<UNDIRECTED_GRAPH, Type Bundle::*>::const_type
-get(Type Bundle::* p, UNDIRECTED_GRAPH const& g) {
- typedef typename property_map<
- UNDIRECTED_GRAPH, Type Bundle::*
- >::const_type return_type;
- return return_type(&g, p);
-}
-
-template <UNDIRECTED_GRAPH_PARAMS, typename Type, typename Bundle, typename Key>
-inline Type
-get(Type Bundle::* p, UNDIRECTED_GRAPH const& g, Key const& k)
-{ return get(p, g.impl(), k); }
-
-template <UNDIRECTED_GRAPH_PARAMS, typename Type, typename Bundle, typename Key, typename Value>
-inline void
-put(Type Bundle::* p, UNDIRECTED_GRAPH& g, Key const& k, Value const& v)
-{ put(p, g.impl(), k, v); }
-#endif
-
 // Indexed Vertex graph
 
 template <UNDIRECTED_GRAPH_PARAMS>

Modified: trunk/boost/pending/detail/property.hpp
==============================================================================
--- trunk/boost/pending/detail/property.hpp (original)
+++ trunk/boost/pending/detail/property.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -13,147 +13,8 @@
 
   namespace detail {
 
- template <class PropertyTag1, class PropertyTag2>
- struct same_property {
- enum { value = is_same<PropertyTag1,PropertyTag2>::value };
- };
-
     struct error_property_not_found { };
 
- template <int TagMatched>
- struct property_value_dispatch {
- template <class PropertyTag, class T, class Tag>
- inline static T& get_value(PropertyTag& p, T*, Tag) {
- return p.m_value;
- }
- template <class PropertyTag, class T, class Tag>
- inline static const T& const_get_value(const PropertyTag& p, T*, Tag) {
- return p.m_value;
- }
- };
-
- template <class PropertyList>
- struct property_value_end {
- template <class T> struct result { typedef T type; };
-
- template <class T, class Tag>
- inline static T& get_value(PropertyList& p, T* t, Tag tag) {
- typedef typename PropertyList::next_type Next;
- typedef typename Next::tag_type Next_tag;
- enum { match = same_property<Next_tag,Tag>::value };
- return property_value_dispatch<match>
- ::get_value(static_cast<Next&>(p), t, tag);
- }
- template <class T, class Tag>
- inline static const T& const_get_value(const PropertyList& p, T* t, Tag tag) {
- typedef typename PropertyList::next_type Next;
- typedef typename Next::tag_type Next_tag;
- enum { match = same_property<Next_tag,Tag>::value };
- return property_value_dispatch<match>
- ::const_get_value(static_cast<const Next&>(p), t, tag);
- }
- };
- template <>
- struct property_value_end<no_property> {
- template <class T> struct result {
- typedef detail::error_property_not_found type;
- };
-
- // Stop the recursion and return error
- template <class T, class Tag>
- inline static detail::error_property_not_found&
- get_value(no_property&, T*, Tag) {
- static error_property_not_found s_prop_not_found;
- return s_prop_not_found;
- }
- template <class T, class Tag>
- inline static const detail::error_property_not_found&
- const_get_value(const no_property&, T*, Tag) {
- static error_property_not_found s_prop_not_found;
- return s_prop_not_found;
- }
- };
-
- template <>
- struct property_value_dispatch<0> {
- template <class PropertyList, class T, class Tag>
- inline static typename property_value_end<PropertyList>::template result<T>::type&
- get_value(PropertyList& p, T* t, Tag tag) {
- return property_value_end<PropertyList>::get_value(p, t, tag);
- }
- template <class PropertyList, class T, class Tag>
- inline static const typename property_value_end<PropertyList>::template result<T>::type&
- const_get_value(const PropertyList& p, T* t, Tag tag) {
- return property_value_end<PropertyList>::const_get_value(p, t, tag);
- }
- };
-
- template <class PropertyList>
- struct build_property_tag_value_alist
- {
- typedef typename PropertyList::next_type NextProperty;
- typedef typename PropertyList::value_type Value;
- typedef typename PropertyList::tag_type Tag;
- typedef typename build_property_tag_value_alist<NextProperty>::type Next;
- typedef std::pair< std::pair<Tag,Value>, Next> type;
- };
- template <>
- struct build_property_tag_value_alist<no_property>
- {
- typedef no_property type;
- };
-
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- template <class TagValueAList, class Tag>
- struct extract_value {
- typedef error_property_not_found type;
- };
- template <class Value, class Tag1, class Tag2, class Rest>
- struct extract_value< std::pair<std::pair<Tag1,Value>,Rest>, Tag2> {
- typedef typename extract_value<Rest,Tag2>::type type;
- };
- template <class Value, class Tag, class Rest>
- struct extract_value< std::pair<std::pair<Tag,Value>,Rest>, Tag> {
- typedef Value type;
- };
-#else
- // VC++ workaround:
- // The main idea here is to replace partial specialization with
- // nested template member classes. Of course there is the
- // further complication that the outer class of the nested
- // template class cannot itself be a template class.
- // Hence the need for the ev_selector. -JGS
-
- struct recursive_extract;
- struct end_extract;
-
- template <class TagValueAList>
- struct ev_selector { typedef recursive_extract type; };
- template <>
- struct ev_selector<no_property> { typedef end_extract type; };
-
- struct recursive_extract {
- template <class TagValueAList, class Tag1>
- struct bind_ {
- typedef typename TagValueAList::first_type AListFirst;
- typedef typename AListFirst::first_type Tag2;
- typedef typename AListFirst::second_type Value;
- enum { match = same_property<Tag1,Tag2>::value };
- typedef typename TagValueAList::second_type Next;
- typedef typename ev_selector<Next>::type Extractor;
- typedef typename boost::ct_if< match, Value,
- typename Extractor::template bind_<Next,Tag1>::type
- >::type type;
- };
- };
- struct end_extract {
- template <class AList, class Tag1>
- struct bind_ {
- typedef error_property_not_found type;
- };
- };
-#endif //!defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
-
   } // namespace detail
 } // namespace boost
 

Modified: trunk/boost/pending/property.hpp
==============================================================================
--- trunk/boost/pending/property.hpp (original)
+++ trunk/boost/pending/property.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -7,32 +7,146 @@
 #define BOOST_PROPERTY_HPP
 
 #include <boost/mpl/bool.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits.hpp>
 
 namespace boost {
 
- struct no_property {
- typedef no_property tag_type;
- typedef no_property next_type;
- typedef no_property value_type;
- enum { num = 0 };
- typedef void kind;
- };
+ struct no_property {};
 
   template <class Tag, class T, class Base = no_property>
- struct property : public Base {
+ struct property {
     typedef Base next_type;
     typedef Tag tag_type;
     typedef T value_type;
-#if BOOST_WORKAROUND (__GNUC__, < 3)
- property() { }
-#else
- property() : m_value() { }
-#endif
- property(const T& v) : m_value(v) { }
- property(const T& v, const Base& b) : Base(b), m_value(v) { }
+ property(const T& v = T()) : m_value(v) { }
+ property(const T& v, const Base& b) : m_value(v), m_base(b) { }
     // copy constructor and assignment operator will be generated by compiler
 
     T m_value;
+ Base m_base;
+ };
+
+ // Kinds of properties
+ template <class PropertyTag>
+ struct property_kind {
+ typedef typename PropertyTag::kind type;
+ };
+
+ // Some standard properties defined independently of Boost.Graph:
+ enum vertex_all_t {vertex_all};
+ enum edge_all_t {edge_all};
+ enum graph_all_t {graph_all};
+ enum vertex_bundle_t {vertex_bundle};
+ enum edge_bundle_t {edge_bundle};
+ enum graph_bundle_t {graph_bundle};
+
+ // Code to look up one property in a property list:
+ template <typename PList, typename PropName>
+ struct lookup_one_property_internal {BOOST_STATIC_CONSTANT(bool, found = false);};
+
+ // Special-case properties (vertex_all, edge_all, graph_all)
+#define BGL_ALL_PROP(tag) \
+ template <typename T> \
+ struct lookup_one_property_internal<T, tag> { \
+ BOOST_STATIC_CONSTANT(bool, found = true); \
+ typedef T type; \
+ static T& lookup(T& x, tag) {return x;} \
+ static const T& lookup(const T& x, tag) {return x;} \
+ }; \
+ template <typename Tag, typename T, typename Base> \
+ struct lookup_one_property_internal<property<Tag, T, Base>, tag> { /* Avoid ambiguity */ \
+ BOOST_STATIC_CONSTANT(bool, found = true); \
+ typedef property<Tag, T, Base> type; \
+ static type& lookup(type& x, tag) {return x;} \
+ static const type& lookup(const type& x, tag) {return x;} \
+ };
+
+ BGL_ALL_PROP(vertex_all_t)
+ BGL_ALL_PROP(edge_all_t)
+ BGL_ALL_PROP(graph_all_t)
+#undef BGL_ALL_PROP
+
+ // *_bundled; these need to be macros rather than inheritance to resolve ambiguities
+ #define BGL_DO_ONE_BUNDLE_TYPE(kind) \
+ template <typename T> \
+ struct lookup_one_property_internal<T, BOOST_JOIN(kind, _bundle_t)> { \
+ BOOST_STATIC_CONSTANT(bool, found = true); \
+ typedef T type; \
+ static T& lookup(T& x, BOOST_JOIN(kind, _bundle_t)) {return x;} \
+ static const T& lookup(const T& x, BOOST_JOIN(kind, _bundle_t)) {return x;} \
+ }; \
+ \
+ template <typename Tag, typename T, typename Base> \
+ struct lookup_one_property_internal<property<Tag, T, Base>, BOOST_JOIN(kind, _bundle_t)>: lookup_one_property_internal<Base, BOOST_JOIN(kind, _bundle_t)> { \
+ private: \
+ typedef lookup_one_property_internal<Base, BOOST_JOIN(kind, _bundle_t)> base_type; \
+ public: \
+ static typename base_type::type& lookup(property<Tag, T, Base>& p, BOOST_JOIN(kind, _bundle_t)) {return base_type::lookup(p.m_base, BOOST_JOIN(kind, _bundle_t)());} \
+ static const typename base_type::type& lookup(const property<Tag, T, Base>& p, BOOST_JOIN(kind, _bundle_t)) {return base_type::lookup(p.m_base, BOOST_JOIN(kind, _bundle_t)());} \
+ }; \
+
+ BGL_DO_ONE_BUNDLE_TYPE(vertex)
+ BGL_DO_ONE_BUNDLE_TYPE(edge)
+ BGL_DO_ONE_BUNDLE_TYPE(graph)
+#undef BGL_DO_ONE_BUNDLE_TYPE
+
+ // Normal old-style properties; second case also handles chaining of bundled property accesses
+ template <typename Tag, typename T, typename Base>
+ struct lookup_one_property_internal<boost::property<Tag, T, Base>, Tag> {
+ BOOST_STATIC_CONSTANT(bool, found = true);
+ typedef property<Tag, T, Base> prop;
+ typedef T type;
+ template <typename U>
+ static typename enable_if<is_same<prop, U>, T&>::type
+ lookup(U& prop, const Tag&) {return prop.m_value;}
+ template <typename U>
+ static typename enable_if<is_same<prop, U>, const T&>::type
+ lookup(const U& prop, const Tag&) {return prop.m_value;}
+ };
+
+ template <typename Tag, typename T, typename Base, typename PropName>
+ struct lookup_one_property_internal<boost::property<Tag, T, Base>, PropName>: lookup_one_property_internal<Base, PropName> {
+ private:
+ typedef lookup_one_property_internal<Base, PropName> base_type;
+ public:
+ template <typename PL>
+ static typename enable_if<is_same<PL, boost::property<Tag, T, Base> >, typename base_type::type&>::type
+ lookup(PL& prop, const PropName& tag) {
+ return base_type::lookup(prop.m_base, tag);
+ }
+ template <typename PL>
+ static typename enable_if<is_same<PL, boost::property<Tag, T, Base> >, const typename base_type::type&>::type
+ lookup(const PL& prop, const PropName& tag) {
+ return base_type::lookup(prop.m_base, tag);
+ }
+ };
+
+ // Pointer-to-member access to bundled properties
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+ template <typename T, typename R>
+ struct lookup_one_property_internal<T, R T::*> {
+ BOOST_STATIC_CONSTANT(bool, found = true);
+ typedef R type;
+ static R& lookup(T& x, R T::*ptr) {return x.*ptr;}
+ static const R& lookup(const T& x, R T::*ptr) {return x.*ptr;}
+ };
+#endif
+
+ // Version of above handling const property lists properly
+ template <typename T, typename Tag>
+ struct lookup_one_property: lookup_one_property_internal<T, Tag> {};
+
+ template <typename T, typename Tag>
+ struct lookup_one_property<const T, Tag> {
+ BOOST_STATIC_CONSTANT(bool, found = (lookup_one_property_internal<T, Tag>::found));
+ typedef const typename lookup_one_property_internal<T, Tag>::type type;
+ template <typename U>
+ static typename enable_if<is_same<T, U>, const typename lookup_one_property_internal<T, Tag>::type&>::type
+ lookup(const U& p, Tag tag) {
+ return lookup_one_property_internal<T, Tag>::lookup(p, tag);
+ }
   };
 
   // The BGL properties specialize property_kind and
@@ -41,11 +155,6 @@
   // instead with a nested kind type and num. Also, we may want to
   // switch BGL back to using class types for properties at some point.
 
- template <class PropertyTag>
- struct property_kind {
- typedef typename PropertyTag::kind type;
- };
-
   template <class P>
   struct has_property : boost::mpl::true_ {};
   template <>
@@ -58,45 +167,18 @@
 namespace boost {
 
   template <class PropertyList, class Tag>
- struct property_value {
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- typedef typename detail::build_property_tag_value_alist<PropertyList>::type AList;
- typedef typename detail::extract_value<AList,Tag>::type type;
-#else
- typedef typename detail::build_property_tag_value_alist<PropertyList>::type AList;
- typedef typename detail::ev_selector<AList>::type Extractor;
- typedef typename Extractor::template bind_<AList,Tag>::type type;
-#endif
- };
+ struct property_value: lookup_one_property<PropertyList, Tag> {};
 
- template <class Tag2>
- inline detail::error_property_not_found
- get_property_value(const no_property&, Tag2) {
- return detail::error_property_not_found();
+ template <class PropertyList, class Tag>
+ inline typename lookup_one_property<PropertyList, Tag>::type&
+ get_property_value(PropertyList& p, Tag tag) {
+ return lookup_one_property<PropertyList, Tag>::lookup(p, tag);
   }
 
- template <class Tag1, class Tag2, class T1, class Base>
- inline typename property_value<property<Tag1,T1,Base>, Tag2>::type&
- get_property_value(property<Tag1,T1,Base>& p, Tag2 tag2) {
- BOOST_STATIC_CONSTANT(bool,
- match = (detail::same_property<Tag1,Tag2>::value));
- typedef property<Tag1,T1,Base> Prop;
- typedef typename property_value<Prop, Tag2>::type T2;
- T2* t2 = 0;
- typedef detail::property_value_dispatch<match> Dispatcher;
- return Dispatcher::get_value(p, t2, tag2);
- }
- template <class Tag1, class Tag2, class T1, class Base>
- inline
- const typename property_value<property<Tag1,T1,Base>, Tag2>::type&
- get_property_value(const property<Tag1,T1,Base>& p, Tag2 tag2) {
- BOOST_STATIC_CONSTANT(bool,
- match = (detail::same_property<Tag1,Tag2>::value));
- typedef property<Tag1,T1,Base> Prop;
- typedef typename property_value<Prop, Tag2>::type T2;
- T2* t2 = 0;
- typedef detail::property_value_dispatch<match> Dispatcher;
- return Dispatcher::const_get_value(p, t2, tag2);
+ template <class PropertyList, class Tag>
+ inline const typename lookup_one_property<PropertyList, Tag>::type&
+ get_property_value(const PropertyList& p, Tag tag) {
+ return lookup_one_property<PropertyList, Tag>::lookup(p, tag);
   }
 
  namespace detail {
@@ -107,7 +189,6 @@
         : mpl::bool_<is_same<T, no_property>::value>
     { };
 
-#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
     /** @internal @name Retag Property List
      * This metafunction is used internally to normalize a property if it is
      * actually modeling a property. Specifically this is used in Boost.Graph
@@ -159,7 +240,40 @@
         typedef no_property retagged;
     };
     //@}
-#endif
+
+ template <typename PList, typename Tag>
+ class lookup_one_property_f;
+
+ template <typename PList, typename Tag, typename F> struct lookup_one_property_f_result;
+
+ template <typename PList, typename Tag>
+ struct lookup_one_property_f_result<PList, Tag, const lookup_one_property_f<PList, Tag>(PList)> {
+ typedef typename lookup_one_property<PList, Tag>::type type;
+ };
+
+ template <typename PList, typename Tag>
+ struct lookup_one_property_f_result<PList, Tag, const lookup_one_property_f<PList, Tag>(PList&)> {
+ typedef typename lookup_one_property<PList, Tag>::type& type;
+ };
+
+ template <typename PList, typename Tag>
+ struct lookup_one_property_f_result<PList, Tag, const lookup_one_property_f<PList, Tag>(const PList&)> {
+ typedef const typename lookup_one_property<PList, Tag>::type& type;
+ };
+
+ template <typename PList, typename Tag>
+ class lookup_one_property_f {
+ Tag tag;
+ public:
+ lookup_one_property_f(Tag tag): tag(tag) {}
+ template <typename F> struct result: lookup_one_property_f_result<PList, Tag, F> {};
+
+ typename lookup_one_property_f_result<PList, Tag, const lookup_one_property_f(PList&)>::type
+ operator()(PList& pl) const {
+ return lookup_one_property<PList, Tag>::lookup(pl, tag);
+ }
+ };
+
 } // namespace detail
 
 } // namesapce boost

Modified: trunk/boost/pending/property_serialize.hpp
==============================================================================
--- trunk/boost/pending/property_serialize.hpp (original)
+++ trunk/boost/pending/property_serialize.hpp 2012-03-25 17:03:59 EDT (Sun, 25 Mar 2012)
@@ -24,8 +24,8 @@
   serialize(Archive& ar, property<Tag, T, Base>& prop,
             const unsigned int /*version*/)
   {
- ar & serialization::make_nvp( "property_base" , boost::serialization::base_object<Base>(prop) );
     ar & serialization::make_nvp( "property_value" , prop.m_value );
+ ar & serialization::make_nvp( "property_base" , prop.m_base );
   }
 
 #ifdef BOOST_GRAPH_USE_MPI


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk