Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r65766 - in branches/release: . boost boost/algorithm/string boost/archive boost/bimap boost/config boost/detail boost/filesystem boost/functional/hash boost/fusion boost/gil boost/graph boost/graph/detail boost/graph/distributed boost/integer boost/interprocess boost/intrusive boost/io boost/iostreams boost/math boost/msm boost/numeric/ublas boost/pending boost/program_options boost/property_tree boost/python boost/range boost/regex boost/serialization boost/signals boost/signals2 boost/spirit boost/spirit/home boost/spirit/home/karma boost/spirit/home/support boost/statechart boost/system boost/thread boost/tr1 boost/type_traits boost/unordered boost/utility boost/uuid boost/variant boost/wave doc libs libs/algorithm/string libs/array/doc libs/array/test libs/bimap libs/config libs/filesystem libs/functional/hash libs/fusion libs/graph/test libs/graph_parallel libs/graph_parallel/test libs/integer libs/interprocess libs/intrusive libs/iostreams libs/math libs/math/doc/sf_and_dist libs/mpi/build libs/mpl/doc/refmanual libs/mpl/doc/src/refmanual libs/msm libs/numeric/ublas libs/numeric/ublas/doc libs/program_options libs/property_tree libs/python libs/range libs/regex libs/serialization libs/serialization/doc libs/serialization/test libs/signals libs/signals2 libs/spirit libs/spirit/classic/example libs/spirit/doc libs/spirit/example libs/spirit/phoenix libs/spirit/test libs/spirit/test/qi libs/statechart libs/static_assert libs/system libs/thread libs/timer libs/tr1 libs/type_traits libs/type_traits/doc libs/unordered libs/utility libs/utility/swap/test libs/uuid libs/wave more more/getting_started status tools tools/bcp tools/boostbook tools/build/v2 tools/inspect tools/quickbook tools/regression tools/release tools/wave
From: jewillco_at_[hidden]
Date: 2010-10-05 13:42:58


Author: jewillco
Date: 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
New Revision: 65766
URL: http://svn.boost.org/trac/boost/changeset/65766

Log:
Merged r64074, r64645, r64935, r65198, r65385, r65764 (all related to bundled graph properties as far as I remember)
Properties modified:
   branches/release/ (props changed)
   branches/release/INSTALL (props changed)
   branches/release/Jamroot (props changed)
   branches/release/LICENSE_1_0.txt (props changed)
   branches/release/boost/ (props changed)
   branches/release/boost-build.jam (props changed)
   branches/release/boost.css (props changed)
   branches/release/boost.png (props changed)
   branches/release/boost/algorithm/string/ (props changed)
   branches/release/boost/archive/ (props changed)
   branches/release/boost/archive/basic_archive.hpp (props changed)
   branches/release/boost/array.hpp (props changed)
   branches/release/boost/bimap/ (props changed)
   branches/release/boost/config/ (props changed)
   branches/release/boost/config.hpp (props changed)
   branches/release/boost/detail/ (props changed)
   branches/release/boost/detail/endian.hpp (props changed)
   branches/release/boost/filesystem/ (props changed)
   branches/release/boost/filesystem.hpp (props changed)
   branches/release/boost/functional/hash/ (props changed)
   branches/release/boost/fusion/ (props changed)
   branches/release/boost/gil/ (props changed)
   branches/release/boost/graph/ (props changed)
   branches/release/boost/integer/ (props changed)
   branches/release/boost/interprocess/ (props changed)
   branches/release/boost/intrusive/ (props changed)
   branches/release/boost/io/ (props changed)
   branches/release/boost/iostreams/ (props changed)
   branches/release/boost/math/ (props changed)
   branches/release/boost/math_fwd.hpp (props changed)
   branches/release/boost/msm/ (props changed)
   branches/release/boost/numeric/ublas/ (props changed)
   branches/release/boost/numeric/ublas/functional.hpp (props changed)
   branches/release/boost/program_options/ (props changed)
   branches/release/boost/property_tree/ (props changed)
   branches/release/boost/python/ (props changed)
   branches/release/boost/range/ (props changed)
   branches/release/boost/regex/ (props changed)
   branches/release/boost/serialization/ (props changed)
   branches/release/boost/signals/ (props changed)
   branches/release/boost/signals2/ (props changed)
   branches/release/boost/signals2.hpp (props changed)
   branches/release/boost/spirit/ (props changed)
   branches/release/boost/spirit/home/ (props changed)
   branches/release/boost/spirit/home/karma/ (props changed)
   branches/release/boost/spirit/home/support/attributes.hpp (props changed)
   branches/release/boost/statechart/ (props changed)
   branches/release/boost/system/ (props changed)
   branches/release/boost/thread/ (props changed)
   branches/release/boost/thread.hpp (props changed)
   branches/release/boost/tr1/ (props changed)
   branches/release/boost/type_traits/ (props changed)
   branches/release/boost/unordered/ (props changed)
   branches/release/boost/utility/ (props changed)
   branches/release/boost/utility/value_init.hpp (props changed)
   branches/release/boost/uuid/ (props changed)
   branches/release/boost/variant/ (props changed)
   branches/release/boost/version.hpp (props changed)
   branches/release/boost/wave/ (props changed)
   branches/release/bootstrap.bat (props changed)
   branches/release/bootstrap.sh (props changed)
   branches/release/doc/ (props changed)
   branches/release/index.htm (props changed)
   branches/release/index.html (props changed)
   branches/release/libs/ (props changed)
   branches/release/libs/algorithm/string/ (props changed)
   branches/release/libs/array/doc/array.xml (props changed)
   branches/release/libs/array/test/array0.cpp (props changed)
   branches/release/libs/array/test/array2.cpp (props changed)
   branches/release/libs/bimap/ (props changed)
   branches/release/libs/config/ (props changed)
   branches/release/libs/filesystem/ (props changed)
   branches/release/libs/functional/hash/ (props changed)
   branches/release/libs/fusion/ (props changed)
   branches/release/libs/graph_parallel/ (props changed)
   branches/release/libs/integer/ (props changed)
   branches/release/libs/interprocess/ (props changed)
   branches/release/libs/intrusive/ (props changed)
   branches/release/libs/iostreams/ (props changed)
   branches/release/libs/libraries.htm (props changed)
   branches/release/libs/maintainers.txt (props changed)
   branches/release/libs/math/ (props changed)
   branches/release/libs/math/doc/sf_and_dist/ (props changed)
   branches/release/libs/mpi/build/ (props changed)
   branches/release/libs/mpl/doc/refmanual/broken-compiler-workarounds.html (props changed)
   branches/release/libs/mpl/doc/refmanual/categorized-index-concepts.html (props changed)
   branches/release/libs/mpl/doc/refmanual/cfg-no-preprocessed-headers.html (props changed)
   branches/release/libs/mpl/doc/refmanual/composition-and-argument-binding.html (props changed)
   branches/release/libs/mpl/doc/refmanual/data-types-concepts.html (props changed)
   branches/release/libs/mpl/doc/refmanual/data-types-miscellaneous.html (props changed)
   branches/release/libs/mpl/doc/refmanual/extensible-associative-sequence.html (props changed)
   branches/release/libs/mpl/doc/refmanual/inserter-class.html (props changed)
   branches/release/libs/mpl/doc/refmanual/tag-dispatched-metafunction.html (props changed)
   branches/release/libs/mpl/doc/refmanual/trivial-metafunctions-summary.html (props changed)
   branches/release/libs/mpl/doc/src/refmanual/Iterators-Iterator.rst (props changed)
   branches/release/libs/msm/ (props changed)
   branches/release/libs/numeric/ublas/ (props changed)
   branches/release/libs/numeric/ublas/doc/ (props changed)
   branches/release/libs/program_options/ (props changed)
   branches/release/libs/property_tree/ (props changed)
   branches/release/libs/python/ (props changed)
   branches/release/libs/range/ (props changed)
   branches/release/libs/regex/ (props changed)
   branches/release/libs/serialization/ (props changed)
   branches/release/libs/serialization/doc/ (props changed)
   branches/release/libs/serialization/test/ (props changed)
   branches/release/libs/serialization/test/A.cpp (props changed)
   branches/release/libs/serialization/test/A.hpp (props changed)
   branches/release/libs/serialization/test/A.ipp (props changed)
   branches/release/libs/serialization/test/B.hpp (props changed)
   branches/release/libs/serialization/test/C.hpp (props changed)
   branches/release/libs/serialization/test/D.hpp (props changed)
   branches/release/libs/serialization/test/J.hpp (props changed)
   branches/release/libs/serialization/test/Jamfile.v2 (props changed)
   branches/release/libs/serialization/test/base.hpp (props changed)
   branches/release/libs/serialization/test/binary_archive.hpp (props changed)
   branches/release/libs/serialization/test/binary_warchive.hpp (props changed)
   branches/release/libs/serialization/test/derived2.hpp (props changed)
   branches/release/libs/serialization/test/dll_a.cpp (props changed)
   branches/release/libs/serialization/test/dll_base.cpp (props changed)
   branches/release/libs/serialization/test/dll_derived2.cpp (props changed)
   branches/release/libs/serialization/test/polymorphic_array_binary_archive.hpp (props changed)
   branches/release/libs/serialization/test/polymorphic_base.cpp (props changed)
   branches/release/libs/serialization/test/polymorphic_base.hpp (props changed)
   branches/release/libs/serialization/test/polymorphic_binary_archive.hpp (props changed)
   branches/release/libs/serialization/test/polymorphic_derived1.cpp (props changed)
   branches/release/libs/serialization/test/polymorphic_derived1.hpp (props changed)
   branches/release/libs/serialization/test/polymorphic_derived2.cpp (props changed)
   branches/release/libs/serialization/test/polymorphic_derived2.hpp (props changed)
   branches/release/libs/serialization/test/polymorphic_text_archive.hpp (props changed)
   branches/release/libs/serialization/test/polymorphic_text_warchive.hpp (props changed)
   branches/release/libs/serialization/test/polymorphic_xml_archive.hpp (props changed)
   branches/release/libs/serialization/test/polymorphic_xml_warchive.hpp (props changed)
   branches/release/libs/serialization/test/portable_binary_archive.hpp (props changed)
   branches/release/libs/serialization/test/test_array.cpp (props changed)
   branches/release/libs/serialization/test/test_binary.cpp (props changed)
   branches/release/libs/serialization/test/test_bitset.cpp (props changed)
   branches/release/libs/serialization/test/test_check.cpp (props changed)
   branches/release/libs/serialization/test/test_class_info_load.cpp (props changed)
   branches/release/libs/serialization/test/test_class_info_save.cpp (props changed)
   branches/release/libs/serialization/test/test_codecvt_null.cpp (props changed)
   branches/release/libs/serialization/test/test_complex.cpp (props changed)
   branches/release/libs/serialization/test/test_const_load_fail1.cpp (props changed)
   branches/release/libs/serialization/test/test_const_load_fail1_nvp.cpp (props changed)
   branches/release/libs/serialization/test/test_const_load_fail2.cpp (props changed)
   branches/release/libs/serialization/test/test_const_load_fail2_nvp.cpp (props changed)
   branches/release/libs/serialization/test/test_const_load_fail3.cpp (props changed)
   branches/release/libs/serialization/test/test_const_load_fail3_nvp.cpp (props changed)
   branches/release/libs/serialization/test/test_const_pass.cpp (props changed)
   branches/release/libs/serialization/test/test_const_save_warn1.cpp (props changed)
   branches/release/libs/serialization/test/test_const_save_warn1_nvp.cpp (props changed)
   branches/release/libs/serialization/test/test_const_save_warn2.cpp (props changed)
   branches/release/libs/serialization/test/test_const_save_warn2_nvp.cpp (props changed)
   branches/release/libs/serialization/test/test_const_save_warn3.cpp (props changed)
   branches/release/libs/serialization/test/test_const_save_warn3_nvp.cpp (props changed)
   branches/release/libs/serialization/test/test_const_save_warn4.cpp (props changed)
   branches/release/libs/serialization/test/test_const_save_warn4_nvp.cpp (props changed)
   branches/release/libs/serialization/test/test_contained_class.cpp (props changed)
   branches/release/libs/serialization/test/test_cyclic_ptrs.cpp (props changed)
   branches/release/libs/serialization/test/test_decl.hpp (props changed)
   branches/release/libs/serialization/test/test_delete_pointer.cpp (props changed)
   branches/release/libs/serialization/test/test_deque.cpp (props changed)
   branches/release/libs/serialization/test/test_derived.cpp (props changed)
   branches/release/libs/serialization/test/test_derived_class.cpp (props changed)
   branches/release/libs/serialization/test/test_derived_class_ptr.cpp (props changed)
   branches/release/libs/serialization/test/test_diamond.cpp (props changed)
   branches/release/libs/serialization/test/test_diamond_complex.cpp (props changed)
   branches/release/libs/serialization/test/test_dll_exported.cpp (props changed)
   branches/release/libs/serialization/test/test_dll_plugin.cpp (props changed)
   branches/release/libs/serialization/test/test_dll_simple.cpp (props changed)
   branches/release/libs/serialization/test/test_exported.cpp (props changed)
   branches/release/libs/serialization/test/test_inclusion.cpp (props changed)
   branches/release/libs/serialization/test/test_iterators.cpp (props changed)
   branches/release/libs/serialization/test/test_iterators_base64.cpp (props changed)
   branches/release/libs/serialization/test/test_list.cpp (props changed)
   branches/release/libs/serialization/test/test_list_ptrs.cpp (props changed)
   branches/release/libs/serialization/test/test_map.cpp (props changed)
   branches/release/libs/serialization/test/test_mi.cpp (props changed)
   branches/release/libs/serialization/test/test_mult_archive_types.cpp (props changed)
   branches/release/libs/serialization/test/test_multiple_inheritance.cpp (props changed)
   branches/release/libs/serialization/test/test_multiple_ptrs.cpp (props changed)
   branches/release/libs/serialization/test/test_new_operator.cpp (props changed)
   branches/release/libs/serialization/test/test_no_rtti.cpp (props changed)
   branches/release/libs/serialization/test/test_non_default_ctor.cpp (props changed)
   branches/release/libs/serialization/test/test_non_default_ctor2.cpp (props changed)
   branches/release/libs/serialization/test/test_non_intrusive.cpp (props changed)
   branches/release/libs/serialization/test/test_not_serializable.cpp (props changed)
   branches/release/libs/serialization/test/test_null_ptr.cpp (props changed)
   branches/release/libs/serialization/test/test_nvp.cpp (props changed)
   branches/release/libs/serialization/test/test_object.cpp (props changed)
   branches/release/libs/serialization/test/test_optional.cpp (props changed)
   branches/release/libs/serialization/test/test_pimpl.cpp (props changed)
   branches/release/libs/serialization/test/test_polymorphic.cpp (props changed)
   branches/release/libs/serialization/test/test_polymorphic2.cpp (props changed)
   branches/release/libs/serialization/test/test_polymorphic2.hpp (props changed)
   branches/release/libs/serialization/test/test_polymorphic2imp.cpp (props changed)
   branches/release/libs/serialization/test/test_polymorphic_A.cpp (props changed)
   branches/release/libs/serialization/test/test_polymorphic_A.hpp (props changed)
   branches/release/libs/serialization/test/test_primitive.cpp (props changed)
   branches/release/libs/serialization/test/test_private_base.cpp (props changed)
   branches/release/libs/serialization/test/test_private_ctor.cpp (props changed)
   branches/release/libs/serialization/test/test_recursion.cpp (props changed)
   branches/release/libs/serialization/test/test_registered.cpp (props changed)
   branches/release/libs/serialization/test/test_reset_object_address.cpp (props changed)
   branches/release/libs/serialization/test/test_set.cpp (props changed)
   branches/release/libs/serialization/test/test_shared_ptr.cpp (props changed)
   branches/release/libs/serialization/test/test_shared_ptr_132.cpp (props changed)
   branches/release/libs/serialization/test/test_shared_ptr_multi_base.cpp (props changed)
   branches/release/libs/serialization/test/test_simple_class.cpp (props changed)
   branches/release/libs/serialization/test/test_simple_class_ptr.cpp (props changed)
   branches/release/libs/serialization/test/test_singleton.cpp (props changed)
   branches/release/libs/serialization/test/test_smart_cast.cpp (props changed)
   branches/release/libs/serialization/test/test_split.cpp (props changed)
   branches/release/libs/serialization/test/test_static_warning.cpp (props changed)
   branches/release/libs/serialization/test/test_tools.hpp (props changed)
   branches/release/libs/serialization/test/test_tracking.cpp (props changed)
   branches/release/libs/serialization/test/test_traits_fail.cpp (props changed)
   branches/release/libs/serialization/test/test_traits_pass.cpp (props changed)
   branches/release/libs/serialization/test/test_unregistered.cpp (props changed)
   branches/release/libs/serialization/test/test_utf8_codecvt.cpp (props changed)
   branches/release/libs/serialization/test/test_valarray.cpp (props changed)
   branches/release/libs/serialization/test/test_variant.cpp (props changed)
   branches/release/libs/serialization/test/test_vector.cpp (props changed)
   branches/release/libs/serialization/test/test_void_cast.cpp (props changed)
   branches/release/libs/serialization/test/text_archive.hpp (props changed)
   branches/release/libs/serialization/test/text_warchive.hpp (props changed)
   branches/release/libs/serialization/test/xml_archive.hpp (props changed)
   branches/release/libs/serialization/test/xml_warchive.hpp (props changed)
   branches/release/libs/signals/ (props changed)
   branches/release/libs/signals2/ (props changed)
   branches/release/libs/spirit/ (props changed)
   branches/release/libs/spirit/classic/example/ (props changed)
   branches/release/libs/spirit/doc/ (props changed)
   branches/release/libs/spirit/example/ (props changed)
   branches/release/libs/spirit/phoenix/ (props changed)
   branches/release/libs/spirit/test/ (props changed)
   branches/release/libs/spirit/test/qi/optional.cpp (props changed)
   branches/release/libs/statechart/ (props changed)
   branches/release/libs/static_assert/ (props changed)
   branches/release/libs/system/ (props changed)
   branches/release/libs/thread/ (props changed)
   branches/release/libs/timer/ (props changed)
   branches/release/libs/tr1/ (props changed)
   branches/release/libs/type_traits/ (props changed)
   branches/release/libs/type_traits/doc/ (props changed)
   branches/release/libs/unordered/ (props changed)
   branches/release/libs/utility/ (props changed)
   branches/release/libs/utility/swap.html (props changed)
   branches/release/libs/utility/swap/test/std_bitset.cpp (props changed)
   branches/release/libs/utility/value_init.htm (props changed)
   branches/release/libs/utility/value_init_test.cpp (props changed)
   branches/release/libs/uuid/ (props changed)
   branches/release/libs/wave/ (props changed)
   branches/release/more/ (props changed)
   branches/release/more/getting_started/ (props changed)
   branches/release/rst.css (props changed)
   branches/release/status/ (props changed)
   branches/release/status/Jamfile.v2 (props changed)
   branches/release/tools/ (props changed)
   branches/release/tools/bcp/ (props changed)
   branches/release/tools/boostbook/ (props changed)
   branches/release/tools/build/v2/ (props changed)
   branches/release/tools/inspect/ (props changed)
   branches/release/tools/quickbook/ (props changed)
   branches/release/tools/regression/ (props changed)
   branches/release/tools/release/ (props changed)
   branches/release/tools/wave/ (props changed)
Text files modified:
   branches/release/boost/graph/adjacency_list.hpp | 124 ++++++++---------
   branches/release/boost/graph/adjacency_matrix.hpp | 111 +++++++--------
   branches/release/boost/graph/compressed_sparse_row_graph.hpp | 37 +++-
   branches/release/boost/graph/detail/adjacency_list.hpp | 77 +++-------
   branches/release/boost/graph/directed_graph.hpp | 24 ++-
   branches/release/boost/graph/distributed/adjacency_list.hpp | 7 +
   branches/release/boost/graph/distributed/compressed_sparse_row_graph.hpp | 6
   branches/release/boost/graph/edge_list.hpp | 40 ++--
   branches/release/boost/graph/graph_traits.hpp | 64 ++++++--
   branches/release/boost/graph/labeled_graph.hpp | 7
   branches/release/boost/graph/properties.hpp | 92 +++++++++----
   branches/release/boost/graph/reverse_graph.hpp | 30 +++-
   branches/release/boost/graph/undirected_graph.hpp | 21 ++
   branches/release/boost/graph/vector_as_graph.hpp | 6
   branches/release/boost/pending/container_traits.hpp | 69 +++++++++
   branches/release/boost/pending/property.hpp | 2
   branches/release/libs/graph/test/csr_graph_test.cpp | 6
   branches/release/libs/graph/test/test_graph.hpp | 9 +
   branches/release/libs/graph/test/test_graphs.cpp | 269 +++++++++++++++++++++------------------
   branches/release/libs/graph/test/test_properties.hpp | 78 +++++++---
   branches/release/libs/graph/test/typestr.hpp | 9
   branches/release/libs/graph_parallel/test/process_group_serialization.cpp | 4
   22 files changed, 639 insertions(+), 453 deletions(-)

Modified: branches/release/boost/graph/adjacency_list.hpp
==============================================================================
--- branches/release/boost/graph/adjacency_list.hpp (original)
+++ branches/release/boost/graph/adjacency_list.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -28,6 +28,8 @@
 # endif
 #endif
 
+#include <boost/scoped_ptr.hpp>
+
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/graph_mutability_traits.hpp>
 #include <boost/graph/graph_selectors.hpp>
@@ -368,37 +370,24 @@
                                        EdgeListS>::vertex_descriptor,
         VertexProperty>
   {
- public: // TODO Remove me
+ public:
 #if !defined(BOOST_GRAPH_NO_BUNDLED_PROPERTIES)
- typedef typename detail::retag_property_list<vertex_bundle_t,
- VertexProperty>::retagged
- maybe_vertex_bundled;
-
- typedef typename detail::retag_property_list<edge_bundle_t,
- EdgeProperty>::retagged
- maybe_edge_bundled;
-#endif
+ typedef typename graph_detail::graph_prop<GraphProperty>::property graph_property_type;
+ typedef typename graph_detail::graph_prop<GraphProperty>::bundle graph_bundled;
 
- public:
-#if !defined(BOOST_GRAPH_NO_BUNDLED_PROPERTIES)
- typedef typename detail::retag_property_list<vertex_bundle_t,
- VertexProperty>::type
- vertex_property_type;
- typedef typename detail::retag_property_list<edge_bundle_t,
- EdgeProperty>::type
- edge_property_type;
-
- // The types that are actually bundled
- typedef typename mpl::if_c<(is_same<maybe_vertex_bundled, no_property>::value),
- no_vertex_bundle,
- maybe_vertex_bundled>::type vertex_bundled;
- typedef typename mpl::if_c<(is_same<maybe_edge_bundled, no_property>::value),
- no_edge_bundle,
- maybe_edge_bundled>::type edge_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 VertexProperty vertex_property_type;
- typedef EdgeProperty edge_property_type;
     typedef no_vertex_bundle vertex_bundled;
+
+ typedef EdgeProperty edge_property_type;
     typedef no_edge_bundle edge_bundled;
 #endif
 
@@ -421,44 +410,51 @@
     typedef DirectedS directed_selector;
     typedef EdgeListS edge_list_selector;
 
- typedef GraphProperty graph_property_type;
 
- inline adjacency_list(const GraphProperty& p = GraphProperty())
- : m_property(p) { }
+ adjacency_list(const GraphProperty& p = GraphProperty())
+ : m_property(new graph_property_type(p))
+ { }
+
+ adjacency_list(const adjacency_list& x)
+ : Base(x), m_property(new graph_property_type(*x.m_property))
+ { }
 
- inline adjacency_list(const adjacency_list& x)
- : Base(x), m_property(x.m_property) { }
-
- inline adjacency_list& operator=(const adjacency_list& x) {
+ adjacency_list& operator=(const adjacency_list& x) {
       // TBD: probably should give the strong guarantee
       if (&x != this) {
         Base::operator=(x);
- m_property = x.m_property;
+
+ // Copy/swap the ptr since we can't just assign it...
+ property_ptr p(new graph_property_type(*x.m_property));
+ m_property.swap(p);
       }
       return *this;
     }
 
     // Required by Mutable Graph
- inline adjacency_list(vertices_size_type num_vertices,
+ adjacency_list(vertices_size_type num_vertices,
                           const GraphProperty& p = GraphProperty())
- : Base(num_vertices), m_property(p) { }
+ : Base(num_vertices), m_property(new graph_property_type(p))
+ { }
 
 #if !defined(BOOST_MSVC) || BOOST_MSVC >= 1300
     // Required by Iterator Constructible Graph
     template <class EdgeIterator>
- inline adjacency_list(EdgeIterator first, EdgeIterator last,
+ adjacency_list(EdgeIterator first, EdgeIterator last,
                           vertices_size_type n,
                           edges_size_type = 0,
                           const GraphProperty& p = GraphProperty())
- : Base(n, first, last), m_property(p) { }
+ : Base(n, first, last), m_property(new graph_property_type(p))
+ { }
 
     template <class EdgeIterator, class EdgePropertyIterator>
- inline adjacency_list(EdgeIterator first, EdgeIterator last,
+ adjacency_list(EdgeIterator first, EdgeIterator last,
                           EdgePropertyIterator ep_iter,
                           vertices_size_type n,
                           edges_size_type = 0,
                           const GraphProperty& p = GraphProperty())
- : Base(n, first, last, ep_iter), m_property(p) { }
+ : Base(n, first, last, ep_iter), m_property(new graph_property_type(p))
+ { }
 #endif
 
     void swap(adjacency_list& x) {
@@ -487,35 +483,39 @@
 
     const edge_bundled& operator[](edge_descriptor e) const
     { return get(edge_bundle, *this)[e]; }
+
+ graph_bundled& operator[](graph_bundle_t)
+ { return get_property(*this); }
+
+ graph_bundled const& operator[](graph_bundle_t) const
+ { return get_property(*this); }
 #endif
 
     // protected: (would be protected if friends were more portable)
- GraphProperty m_property;
+ typedef scoped_ptr<graph_property_type> property_ptr;
+ property_ptr m_property;
   };
 
- template <class OEL, class VL, class DirS, class VP,class EP, class GP,
- class EL, class Tag, class Value>
- inline void
- set_property(adjacency_list<OEL,VL,DirS,VP,EP,GP,EL>& g, Tag,
- const Value& value) {
- get_property_value(g.m_property, Tag()) = value;;
+#define ADJLIST_PARAMS \
+ typename OEL, typename VL, typename D, typename VP, typename EP, \
+ typename GP, typename EL
+#define ADJLIST adjacency_list<OEL,VL,D,VP,EP,GP,EL>
+
+ template<ADJLIST_PARAMS, typename Tag, typename Value>
+ inline void set_property(ADJLIST& g, Tag, Value const& value) {
+ get_property_value(*g.m_property, Tag()) = value;
   }
 
- template <class OEL, class VL, class DirS, class VP, class EP, class GP,
- class Tag, class EL>
- inline
- typename graph_property<adjacency_list<OEL,VL,DirS,VP,EP,GP,EL>, Tag>::type&
- get_property(adjacency_list<OEL,VL,DirS,VP,EP,GP,EL>& g, Tag) {
- return get_property_value(g.m_property, Tag());
+ template<ADJLIST_PARAMS, typename Tag>
+ inline typename graph_property<ADJLIST, Tag>::type&
+ get_property(ADJLIST& g, Tag) {
+ return get_property_value(*g.m_property, Tag());
   }
 
- template <class OEL, class VL, class DirS, class VP, class EP, class GP,
- class Tag, class EL>
- inline
- const
- typename graph_property<adjacency_list<OEL,VL,DirS,VP,EP,GP,EL>, Tag>::type&
- get_property(const adjacency_list<OEL,VL,DirS,VP,EP,GP,EL>& g, Tag) {
- return get_property_value(g.m_property, Tag());
+ template<ADJLIST_PARAMS, typename Tag>
+ inline typename graph_property<ADJLIST, Tag>::type const&
+ get_property(ADJLIST const& g, Tag) {
+ return get_property_value(*g.m_property, Tag());
   }
 
   // dwa 09/25/00 - needed to be more explicit so reverse_graph would work.
@@ -598,10 +598,6 @@
 #endif
 
 // Mutability Traits
-#define ADJLIST_PARAMS \
- typename OEL, typename VL, typename D, typename VP, typename EP, \
- typename GP, typename EL
-#define ADJLIST adjacency_list<OEL,VL,D,VP,EP,GP,EL>
 template <ADJLIST_PARAMS>
 struct graph_mutability_traits<ADJLIST> {
     typedef mutable_property_graph_tag category;

Modified: branches/release/boost/graph/adjacency_matrix.hpp
==============================================================================
--- branches/release/boost/graph/adjacency_matrix.hpp (original)
+++ branches/release/boost/graph/adjacency_matrix.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -25,7 +25,7 @@
 #include <boost/graph/detail/edge.hpp>
 #include <boost/iterator/iterator_adaptor.hpp>
 #include <boost/iterator/filter_iterator.hpp>
-#include <boost/pending/integer_range.hpp>
+#include <boost/range/irange.hpp>
 #include <boost/graph/properties.hpp>
 #include <boost/tuple/tuple.hpp>
 #include <boost/static_assert.hpp>
@@ -80,36 +80,36 @@
     }
 
 
-
+ // NOTE: These functions collide with the get_property function for
+ // accessing bundled graph properties. Be excplicit when using them.
     template <typename EdgeProperty>
     const EdgeProperty&
- get_property(const std::pair<bool, EdgeProperty>& stored_edge) {
+ get_edge_property(const std::pair<bool, EdgeProperty>& stored_edge) {
       return stored_edge.second;
     }
     template <typename EdgeProperty>
     EdgeProperty&
- get_property(std::pair<bool, EdgeProperty>& stored_edge) {
+ get_edge_property(std::pair<bool, EdgeProperty>& stored_edge) {
       return stored_edge.second;
     }
 
     template <typename StoredEdgeProperty, typename EdgeProperty>
     inline void
- set_property(std::pair<bool, StoredEdgeProperty>& stored_edge,
- const EdgeProperty& ep, int) {
+ set_edge_property(std::pair<bool, StoredEdgeProperty>& stored_edge,
+ const EdgeProperty& ep, int) {
       stored_edge.second = ep;
     }
 
- inline const no_property& get_property(const char&) {
+ inline const no_property& get_edge_property(const char&) {
       static no_property s_prop;
       return s_prop;
     }
- inline no_property& get_property(char&) {
+ inline no_property& get_edge_property(char&) {
       static no_property s_prop;
       return s_prop;
     }
     template <typename EdgeProxy, typename EdgeProperty>
- inline void
- set_property(EdgeProxy, const EdgeProperty&, ...) {}
+ inline void set_edge_property(EdgeProxy, const EdgeProperty&, ...) {}
 
     //=======================================================================
     // Directed Out Edge Iterator
@@ -155,8 +155,9 @@
         inline EdgeDescriptor
         dereference() const
         {
- return EdgeDescriptor(get_edge_exists(*this->base(), 0), m_src, m_targ,
- &get_property(*this->base()));
+ return EdgeDescriptor(get_edge_exists(*this->base(), 0),
+ m_src, m_targ,
+ &get_edge_property(*this->base()));
         }
         VertexDescriptor m_src, m_targ;
         VerticesSizeType m_n;
@@ -211,8 +212,9 @@
         inline EdgeDescriptor
         dereference() const
         {
- return EdgeDescriptor(get_edge_exists(*this->base(), 0), m_src, m_targ,
- &get_property(*this->base()));
+ return EdgeDescriptor(get_edge_exists(*this->base(), 0),
+ m_src, m_targ,
+ &get_edge_property(*this->base()));
         }
         MatrixIter m_last;
         VertexDescriptor m_src, m_targ;
@@ -276,10 +278,9 @@
         inline EdgeDescriptor
         dereference() const
         {
- return EdgeDescriptor(
- get_edge_exists(*this->base(), 0), m_src, m_targ
- , &get_property(*this->base())
- );
+ return EdgeDescriptor(get_edge_exists(*this->base(), 0),
+ m_src, m_targ,
+ &get_edge_property(*this->base()));
         }
 
         VertexDescriptor m_src, m_inc, m_targ;
@@ -343,10 +344,9 @@
         inline EdgeDescriptor
         dereference() const
         {
- return EdgeDescriptor(
- get_edge_exists(*this->base(), 0), m_targ, m_src
- , &get_property(*this->base())
- );
+ return EdgeDescriptor(get_edge_exists(*this->base(), 0),
+ m_targ, m_src,
+ &get_edge_property(*this->base()));
         }
 
         VertexDescriptor m_src, m_inc, m_targ;
@@ -418,10 +418,9 @@
         inline EdgeDescriptor
         dereference() const
         {
- return EdgeDescriptor(
- get_edge_exists(
- *this->base(), 0), m_src, m_targ, &get_property(*this->base())
- );
+ return EdgeDescriptor(get_edge_exists(*this->base(), 0),
+ m_src, m_targ,
+ &get_edge_property(*this->base()));
         }
 
         MatrixIter m_start;
@@ -485,34 +484,25 @@
     BOOST_STATIC_ASSERT(!(is_same<Directed, bidirectionalS>::value));
 #endif
 
-#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
- typedef typename detail::retag_property_list<vertex_bundle_t, VertexProperty>::type
- vertex_property_type;
- typedef typename detail::retag_property_list<edge_bundle_t, EdgeProperty>::type
- edge_property_type;
-
- private:
- typedef typename detail::retag_property_list<vertex_bundle_t, VertexProperty>::retagged
- maybe_vertex_bundled;
+#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 detail::retag_property_list<edge_bundle_t, EdgeProperty>::retagged
- maybe_edge_bundled;
+ typedef typename graph_detail::vertex_prop<VertexProperty>::property vertex_property_type;
+ typedef typename graph_detail::vertex_prop<VertexProperty>::bundle vertex_bundled;
 
- public:
- // The types that are actually bundled
- typedef typename mpl::if_c<(is_same<maybe_vertex_bundled, no_property>::value),
- no_vertex_bundle,
- maybe_vertex_bundled>::type vertex_bundled;
- typedef typename mpl::if_c<(is_same<maybe_edge_bundled, no_property>::value),
- no_edge_bundle,
- maybe_edge_bundled>::type edge_bundled;
+ typedef typename graph_detail::edge_prop<EdgeProperty>::property edge_property_type;
+ typedef typename graph_detail::edge_prop<EdgeProperty>::bundle edge_bundled;
 #else
- typedef EdgeProperty edge_property_type;
- typedef VertexProperty vertex_property_type;
+ typedef GraphProperty graph_property_type;
+ typedef no_graph_bundle graph_bundled;
+
+ typedef VertexProperty vertex_property_type;
     typedef no_vertex_bundle vertex_bundled;
- typedef no_edge_bundle edge_bundled;
+
+ typedef EdgeProperty edge_property_type;
+ typedef no_edge_bundle edge_bundled;
 #endif
- typedef GraphProperty graph_property_type;
 
   public: // should be private
     typedef typename mpl::if_<typename has_property<edge_property_type>::type,
@@ -660,6 +650,12 @@
 
     const edge_bundled& operator[](edge_descriptor e) const
     { return get(edge_bundle, *this)[e]; }
+
+ graph_bundled& operator[](graph_bundle_t)
+ { return get_property(*this); }
+
+ const graph_bundled& operator[](graph_bundle_t) const
+ { return get_property(*this); }
 #endif
 
     //private: if friends worked, these would be private
@@ -689,7 +685,7 @@
     VertexList m_vertex_set;
     std::vector<vertex_property_type> m_vertex_properties;
     size_type m_num_edges;
- GraphProperty m_property;
+ graph_property_type m_property;
   };
 
   //=========================================================================
@@ -704,7 +700,7 @@
   {
     bool exists = detail::get_edge_exists(g.get_edge(u,v), 0);
     typename adjacency_matrix<D,VP,EP,GP,A>::edge_descriptor
- e(exists, u, v, &detail::get_property(g.get_edge(u,v)));
+ e(exists, u, v, &detail::get_edge_property(g.get_edge(u,v)));
     return std::make_pair(e, exists);
   }
 
@@ -937,14 +933,14 @@
       edge_descriptor;
     if (detail::get_edge_exists(g.get_edge(u,v), 0) == false) {
       ++(g.m_num_edges);
- detail::set_property(g.get_edge(u,v), EP(ep), 0);
+ detail::set_edge_property(g.get_edge(u,v), EP(ep), 0);
       detail::set_edge_exists(g.get_edge(u,v), true, 0);
       return std::make_pair
- (edge_descriptor(true, u, v, &detail::get_property(g.get_edge(u,v))),
+ (edge_descriptor(true, u, v, &detail::get_edge_property(g.get_edge(u,v))),
          true);
     } else
       return std::make_pair
- (edge_descriptor(true, u, v, &detail::get_property(g.get_edge(u,v))),
+ (edge_descriptor(true, u, v, &detail::get_edge_property(g.get_edge(u,v))),
          false);
   }
   // O(1)
@@ -1050,8 +1046,7 @@
 
   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&
+ 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());
@@ -1059,9 +1054,7 @@
 
   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&
+ 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());

Modified: branches/release/boost/graph/compressed_sparse_row_graph.hpp
==============================================================================
--- branches/release/boost/graph/compressed_sparse_row_graph.hpp (original)
+++ branches/release/boost/graph/compressed_sparse_row_graph.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -38,6 +38,7 @@
 #include <boost/iterator/iterator_facade.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/graph/graph_selectors.hpp>
+#include <boost/graph/properties.hpp>
 #include <boost/static_assert.hpp>
 #include <boost/functional/hash.hpp>
 #include <boost/utility.hpp>
@@ -170,7 +171,7 @@
  * Vertex and EdgeIndex should be unsigned integral types and should
  * specialize numeric_limits.
  */
-template<typename Directed = directedS,
+template<typename Directed = directedS,
          typename VertexProperty = no_property,
          typename EdgeProperty = no_property,
          typename GraphProperty = no_property,
@@ -194,13 +195,14 @@
 
  public:
   // For Property Graph
- typedef GraphProperty graph_property_type;
+ typedef typename graph_detail::graph_prop<GraphProperty>::property graph_property_type;
+ typedef typename graph_detail::graph_prop<GraphProperty>::bundle graph_bundled;
 
   typedef detail::compressed_sparse_row_structure<EdgeProperty, Vertex, EdgeIndex> forward_type;
 
  public:
   /* At this time, the compressed sparse row graph can only be used to
- * create directed and bidirectional graphs. In the future,
+ * create directed and bidirectional graphs. In the future,
    * undirected CSR graphs will also be supported.
    */
   // BOOST_STATIC_ASSERT((is_same<Directed, directedS>::value));
@@ -623,7 +625,7 @@
     m_forward.add_edges_sorted_internal(first_sorted, last_sorted, detail::default_construct_iterator<edge_bundled>(), global_to_local);
   }
 
- template <typename BidirectionalIteratorOrig, typename EPIterOrig,
+ template <typename BidirectionalIteratorOrig, typename EPIterOrig,
             typename GlobalToLocal>
   void
   add_edges_sorted_internal_global(
@@ -637,7 +639,7 @@
   // Add edges from a range of (source, target) pairs that are unsorted
   template <typename InputIterator, typename GlobalToLocal>
   inline void
- add_edges_internal(InputIterator first, InputIterator last,
+ add_edges_internal(InputIterator first, InputIterator last,
                      const GlobalToLocal& global_to_local) {
     typedef compressed_sparse_row_graph Graph;
     typedef typename boost::graph_traits<Graph>::vertex_descriptor vertex_t;
@@ -711,6 +713,13 @@
   const edge_push_back_type& operator[](const edge_descriptor& v) const
   { return m_forward.m_edge_properties[get(edge_index, *this, v)]; }
 
+ // Directly access a graph bundle
+ graph_bundled& operator[](graph_bundle_t)
+ { return get_property(*this); }
+
+ const graph_bundled& operator[](graph_bundle_t) const
+ { return get_property(*this); }
+
   // private: non-portable, requires friend templates
   inherited_vertex_properties& vertex_properties() {return *this;}
   const inherited_vertex_properties& vertex_properties() const {return *this;}
@@ -737,7 +746,9 @@
 
  public:
   // For Property Graph
- typedef GraphProperty graph_property_type;
+ 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 detail::compressed_sparse_row_structure<EdgeProperty, Vertex, EdgeIndex> forward_type;
   typedef EdgeIndex /* typename boost::mpl::if_c<boost::is_same<EdgeProperty, boost::no_property>, boost::no_property, EdgeIndex> */ backward_edge_property;
@@ -990,7 +1001,7 @@
     m_forward.add_edges_sorted_internal(first_sorted, last_sorted, detail::default_construct_iterator<edge_bundled>(), global_to_local);
   }
 
- template <typename BidirectionalIteratorOrig, typename EPIterOrig,
+ template <typename BidirectionalIteratorOrig, typename EPIterOrig,
             typename GlobalToLocal>
   void
   add_edges_sorted_internal_global(
@@ -1004,7 +1015,7 @@
   // Add edges from a range of (source, target) pairs that are unsorted
   template <typename InputIterator, typename GlobalToLocal>
   inline void
- add_edges_internal(InputIterator first, InputIterator last,
+ add_edges_internal(InputIterator first, InputIterator last,
                      const GlobalToLocal& global_to_local) {
     typedef compressed_sparse_row_graph Graph;
     typedef typename boost::graph_traits<Graph>::vertex_descriptor vertex_t;
@@ -1098,7 +1109,7 @@
 
 template<BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS>
 inline Vertex
-add_vertex(BOOST_DIR_CSR_GRAPH_TYPE& g,
+add_vertex(BOOST_DIR_CSR_GRAPH_TYPE& g,
            typename BOOST_DIR_CSR_GRAPH_TYPE::vertex_bundled const& p) {
   Vertex old_num_verts_plus_one = g.m_forward.m_rowstart.size();
   g.m_forward.m_rowstart.push_back(g.m_forward.m_rowstart.back());
@@ -1108,7 +1119,7 @@
 
 template<BOOST_BIDIR_CSR_GRAPH_TEMPLATE_PARMS>
 inline Vertex
-add_vertex(BOOST_BIDIR_CSR_GRAPH_TYPE& g,
+add_vertex(BOOST_BIDIR_CSR_GRAPH_TYPE& g,
            typename BOOST_BIDIR_CSR_GRAPH_TYPE::vertex_bundled const& p) {
   Vertex old_num_verts_plus_one = g.m_forward.m_rowstart.size();
   g.m_forward.m_rowstart.push_back(g.m_forward.m_rowstart.back());
@@ -1160,7 +1171,7 @@
       EPIterOrig ep_iter_sorted,
       const GlobalToLocal& global_to_local,
       BOOST_DIR_CSR_GRAPH_TYPE& g) {
- g.add_edges_sorted_internal_global(first_sorted, last_sorted, ep_iter_sorted,
+ g.add_edges_sorted_internal_global(first_sorted, last_sorted, ep_iter_sorted,
                                        global_to_local);
   }
 
@@ -1180,7 +1191,7 @@
   template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename InputIterator,
             typename GlobalToLocal>
   inline void
- add_edges_global(InputIterator first, InputIterator last,
+ add_edges_global(InputIterator first, InputIterator last,
                    const GlobalToLocal& global_to_local, BOOST_DIR_CSR_GRAPH_TYPE& g) {
     g.add_edges_internal(first, last, global_to_local);
   }
@@ -1303,7 +1314,7 @@
 // Extra, common functions
 template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
 inline typename graph_traits<BOOST_CSR_GRAPH_TYPE>::vertex_descriptor
-vertex(typename graph_traits<BOOST_CSR_GRAPH_TYPE>::vertex_descriptor i,
+vertex(typename graph_traits<BOOST_CSR_GRAPH_TYPE>::vertex_descriptor i,
        const BOOST_CSR_GRAPH_TYPE&)
 {
   return i;

Modified: branches/release/boost/graph/detail/adjacency_list.hpp
==============================================================================
--- branches/release/boost/graph/detail/adjacency_list.hpp (original)
+++ branches/release/boost/graph/detail/adjacency_list.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -17,7 +17,7 @@
 #include <boost/detail/workaround.hpp>
 #include <boost/operators.hpp>
 #include <boost/property_map/property_map.hpp>
-#include <boost/pending/integer_range.hpp>
+#include <boost/range/irange.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <memory>
 #include <algorithm>
@@ -993,10 +993,19 @@
       typename Config::OutEdgeList& el = g.out_edge_list(u);
       typename Config::OutEdgeList::iterator
         ei = el.begin(), ei_end = el.end();
- for (; ei != ei_end; ++ei) {
- detail::erase_from_incidence_list
- (g.out_edge_list((*ei).get_target()), u, Cat());
- g.m_edges.erase((*ei).get_iter());
+ for (; ei != ei_end; /* Increment below */ ) {
+ bool is_self_loop = (*ei).get_target() == u;
+ // Don't erase from our own incidence list in the case of a self-loop
+ // since we're clearing it anyway.
+ if (!is_self_loop) {
+ detail::erase_from_incidence_list
+ (g.out_edge_list((*ei).get_target()), u, Cat());
+ typename Config::OutEdgeList::iterator ei_copy = ei;
+ ++ei;
+ if (!is_self_loop) g.m_edges.erase((*ei_copy).get_iter());
+ } else {
+ ++ei;
+ }
       }
       g.out_edge_list(u).clear();
     }
@@ -1505,51 +1514,6 @@
 
       typedef typename Config::global_edgelist_selector
         global_edgelist_selector;
-
- // protected:
-
- // The edge_dispatch() functions should be static, but
- // Borland gets confused about constness.
-
- // O(E/V)
- inline std::pair<edge_descriptor,bool>
- edge_dispatch(const AdjList& g,
- vertex_descriptor u, vertex_descriptor v,
- boost::allow_parallel_edge_tag) const
- {
- bool found;
- const typename Config::OutEdgeList& el = g.out_edge_list(u);
- typename Config::OutEdgeList::const_iterator
- i = std::find_if(el.begin(), el.end(),
- detail::target_is<vertex_descriptor>(v));
- found = (i != g.out_edge_list(u).end());
- if (found)
- return std::make_pair(edge_descriptor(u, v, &(*i).get_property()),
- true);
- else
- return std::make_pair(edge_descriptor(u, v, 0), false);
- }
- // O(log(E/V))
- inline std::pair<edge_descriptor,bool>
- edge_dispatch(const AdjList& g,
- vertex_descriptor u, vertex_descriptor v,
- boost::disallow_parallel_edge_tag) const
- {
- bool found;
- /* According to the standard, this should be iterator, not const_iterator,
- but the VC++ std::set::find() const returns const_iterator.
- And since iterator should be convertible to const_iterator, the
- following should work everywhere. -Jeremy */
- typename Config::OutEdgeList::const_iterator
- i = g.out_edge_list(u).find(StoredEdge(v)),
- end = g.out_edge_list(u).end();
- found = (i != end);
- if (found)
- return std::make_pair(edge_descriptor(u, v, &(*i).get_property()),
- true);
- else
- return std::make_pair(edge_descriptor(u, v, 0), false);
- }
     };
 
     template <class Config, class Base>
@@ -1630,9 +1594,16 @@
          const adj_list_helper<Config, Base>& g_)
     {
       typedef typename Config::graph_type Graph;
- typedef typename Config::edge_parallel_category Cat;
- const Graph& g = static_cast<const Graph&>(g_);
- return g_.edge_dispatch(g, u, v, Cat());
+ typedef typename Config::StoredEdge StoredEdge;
+ const Graph& cg = static_cast<const Graph&>(g_);
+ typedef typename Config::out_edge_iterator out_edge_iterator;
+ const typename Config::OutEdgeList& el = cg.out_edge_list(u);
+ typename Config::OutEdgeList::const_iterator it = graph_detail::
+ find(el, StoredEdge(v));
+ return std::make_pair(
+ typename Config::edge_descriptor
+ (u, v, (it == el.end() ? 0 : &(*it).get_property())),
+ (it != el.end()));
     }
 
     template <class Config, class Base>

Modified: branches/release/boost/graph/directed_graph.hpp
==============================================================================
--- branches/release/boost/graph/directed_graph.hpp (original)
+++ branches/release/boost/graph/directed_graph.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -33,9 +33,13 @@
 class directed_graph
 {
 public:
- typedef typename graph_detail::vertex_prop<VertexProp>::type vertex_property_type;
+ 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>::type edge_property_type;
+
+ typedef typename graph_detail::edge_prop<EdgeProp>::property edge_property_type;
     typedef typename graph_detail::edge_prop<EdgeProp>::bundle edge_bundled;
 
 private:
@@ -58,9 +62,6 @@
     typedef typename graph_type::directed_selector directed_selector;
 
 public:
- typedef directed_graph_tag graph_tag;
- typedef typename graph_type::graph_property_type graph_property_type;
-
     // more commonly used graph types
     typedef typename graph_type::stored_vertex stored_vertex;
     typedef typename graph_type::vertices_size_type vertices_size_type;
@@ -77,6 +78,7 @@
     typedef typename graph_type::adjacency_iterator adjacency_iterator;
 
     // miscellaneous types
+ typedef directed_graph_tag graph_tag;
     typedef typename graph_type::directed_category directed_category;
     typedef typename graph_type::edge_parallel_category edge_parallel_category;
     typedef typename graph_type::traversal_category traversal_category;
@@ -283,6 +285,12 @@
 
     edge_bundled const& operator[](edge_descriptor e) const
     { return m_graph[e]; }
+
+ graph_bundled& operator[](graph_bundle_t)
+ { return get_property(*this); }
+
+ graph_bundled const& operator[](graph_bundle_t) const
+ { return get_property(*this); }
 #endif
 
     // Graph concepts
@@ -345,14 +353,12 @@
 // IncidenceGraph concepts
 template <DIRECTED_GRAPH_PARAMS>
 inline typename DIRECTED_GRAPH::vertex_descriptor
-source(typename DIRECTED_GRAPH::edge_descriptor e,
- DIRECTED_GRAPH const& g)
+source(typename DIRECTED_GRAPH::edge_descriptor e, DIRECTED_GRAPH const& g)
 { return source(e, g.impl()); }
 
 template <DIRECTED_GRAPH_PARAMS>
 inline typename DIRECTED_GRAPH::vertex_descriptor
-target(typename DIRECTED_GRAPH::edge_descriptor e,
- DIRECTED_GRAPH const& g)
+target(typename DIRECTED_GRAPH::edge_descriptor e, DIRECTED_GRAPH const& g)
 { return target(e, g.impl()); }
 
 template <DIRECTED_GRAPH_PARAMS>

Modified: branches/release/boost/graph/distributed/adjacency_list.hpp
==============================================================================
--- branches/release/boost/graph/distributed/adjacency_list.hpp (original)
+++ branches/release/boost/graph/distributed/adjacency_list.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -1371,6 +1371,7 @@
     typedef typename inherited::graph_property_type graph_property_type;
     typedef typename inherited::vertex_bundled vertex_bundled;
     typedef typename inherited::edge_bundled edge_bundled;
+ typedef typename inherited::graph_bundled graph_bundled;
 
     typedef typename container_gen<edge_list_selector, edge_descriptor>::type
       local_edge_list_type;
@@ -1713,6 +1714,12 @@
       return base()[e.local];
     }
 
+ graph_bundled& operator[](graph_bundle_t)
+ { return get_property(*this); }
+
+ graph_bundled const& operator[](graph_bundle_t) const
+ { return get_property(*this); }
+
     template<typename OStreamConstructibleArchive>
     void save(std::string const& filename) const;
 

Modified: branches/release/boost/graph/distributed/compressed_sparse_row_graph.hpp
==============================================================================
--- branches/release/boost/graph/distributed/compressed_sparse_row_graph.hpp (original)
+++ branches/release/boost/graph/distributed/compressed_sparse_row_graph.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -129,14 +129,20 @@
 
   // -----------------------------------------------------------------
   // Workarounds
+ // NOTE: This graph type does not have old-style graph properties. It only
+ // accepts bundles.
   typedef no_property vertex_property_type;
   typedef no_property edge_property_type;
+ typedef no_property graph_property_type;
   typedef typename mpl::if_<is_void<VertexProperty>,
                             void****,
                             VertexProperty>::type vertex_bundled;
   typedef typename mpl::if_<is_void<EdgeProperty>,
                             void****,
                             EdgeProperty>::type edge_bundled;
+ typedef typename mpl::if_<is_void<GraphProperty>,
+ void****,
+ GraphProperty>::type graph_bundled;
 
   // -----------------------------------------------------------------
   // Useful types

Modified: branches/release/boost/graph/edge_list.hpp
==============================================================================
--- branches/release/boost/graph/edge_list.hpp (original)
+++ branches/release/boost/graph/edge_list.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -15,7 +15,7 @@
 #include <boost/config.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/mpl/bool.hpp>
-#include <boost/pending/integer_range.hpp>
+#include <boost/range/irange.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/properties.hpp>
 
@@ -37,7 +37,7 @@
   // If the iterators are random access, then Graph::edge_descriptor
   // is of Integral type, otherwise it is a struct, though it is
   // convertible to an Integral type.
- //
+ //
 
   struct edge_list_tag { };
 
@@ -129,7 +129,7 @@
       typedef type const_type;
     };
   };
- template <>
+ template <>
   struct edge_property_selector<edge_list_tag> {
     typedef edge_list_edge_property_selector type;
   };
@@ -137,7 +137,7 @@
   template <class G, class EI, class T, class D>
   typename property_map< edge_list_impl<G,EI,T,D>, edge_index_t>::type
   get(edge_index_t, const edge_list_impl<G,EI,T,D>&) {
- typedef typename property_map< edge_list_impl<G,EI,T,D>,
+ typedef typename property_map< edge_list_impl<G,EI,T,D>,
       edge_index_t>::type EdgeIndexMap;
     return EdgeIndexMap();
   }
@@ -180,7 +180,7 @@
     const G& g = static_cast<const G&>(g_);
     typedef typename edge_list_impl_ra<G,EI,T,D>::edge_iterator edge_iterator;
     return std::make_pair(edge_iterator(0), edge_iterator(g._last - g._first));
- }
+ }
   template <class G, class EI, class T, class D>
   typename edge_list_impl_ra<G,EI,T,D>::vertex_descriptor
   source(typename edge_list_impl_ra<G,EI,T,D>::edge_descriptor e,
@@ -217,22 +217,22 @@
       typedef type const_type;
     };
   };
- template <>
+ template <>
   struct edge_property_selector<edge_list_ra_tag> {
     typedef edge_list_ra_edge_property_selector type;
   };
   template <class G, class EI, class T, class D>
- inline
+ inline
   typename property_map< edge_list_impl_ra<G,EI,T,D>, edge_index_t>::type
   get(edge_index_t, const edge_list_impl_ra<G,EI,T,D>&) {
- typedef typename property_map< edge_list_impl_ra<G,EI,T,D>,
+ typedef typename property_map< edge_list_impl_ra<G,EI,T,D>,
       edge_index_t>::type EdgeIndexMap;
     return EdgeIndexMap();
   }
 
   template <class G, class EI, class T, class D>
   inline D
- get(edge_index_t, const edge_list_impl_ra<G,EI,T,D>&,
+ get(edge_index_t, const edge_list_impl_ra<G,EI,T,D>&,
       typename edge_list_impl_ra<G,EI,T,D>::edge_descriptor e) {
     return e;
   }
@@ -241,31 +241,31 @@
   // Some helper classes for determining if the iterators are random access
   template <class Cat>
   struct is_random {
- enum { RET = false };
- typedef mpl::false_ type;
+ enum { RET = false };
+ typedef mpl::false_ type;
   };
   template <>
- struct is_random<std::random_access_iterator_tag> {
- enum { RET = true }; typedef mpl::true_ type;
+ struct is_random<std::random_access_iterator_tag> {
+ enum { RET = true }; typedef mpl::true_ type;
   };
 
   // The edge_list class conditionally inherits from one of the
   // above two classes.
 
- template <class EdgeIter,
+ template <class EdgeIter,
 #if !defined BOOST_NO_STD_ITERATOR_TRAITS
             class T = typename std::iterator_traits<EdgeIter>::value_type,
             class D = typename std::iterator_traits<EdgeIter>::difference_type,
             class Cat = typename std::iterator_traits<EdgeIter>::iterator_category>
 #else
             class T,
- class D,
+ class D,
             class Cat>
 #endif
   class edge_list
     : public mpl::if_< typename is_random<Cat>::type,
                     edge_list_impl_ra< edge_list<EdgeIter,T,D,Cat>, EdgeIter,T,D>,
- edge_list_impl< edge_list<EdgeIter,T,D,Cat>, EdgeIter,T,D>
+ edge_list_impl< edge_list<EdgeIter,T,D,Cat>, EdgeIter,T,D>
>::type
   {
   public:
@@ -275,12 +275,12 @@
     typedef std::size_t edges_size_type;
     typedef std::size_t vertices_size_type;
     typedef std::size_t degree_size_type;
- edge_list(EdgeIter first, EdgeIter last) : _first(first), _last(last) {
+ edge_list(EdgeIter first, EdgeIter last) : _first(first), _last(last) {
       m_num_edges = std::distance(first, last);
     }
     edge_list(EdgeIter first, EdgeIter last, edges_size_type E)
- : _first(first), _last(last), m_num_edges(E) { }
-
+ : _first(first), _last(last), m_num_edges(E) { }
+
     EdgeIter _first, _last;
     edges_size_type m_num_edges;
   };
@@ -298,7 +298,7 @@
     return edge_list<EdgeIter>(first, last);
   }
 #endif
-
+
 } /* namespace boost */
 
 #endif /* BOOST_GRAPH_EDGE_LIST_HPP */

Modified: branches/release/boost/graph/graph_traits.hpp
==============================================================================
--- branches/release/boost/graph/graph_traits.hpp (original)
+++ branches/release/boost/graph/graph_traits.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -218,30 +218,36 @@
     typedef boost::forward_traversal_tag multi_pass_input_iterator_tag;
 
     template <typename G>
- struct edge_property_type {
- typedef typename G::edge_property_type type;
+ struct graph_property_type {
+ typedef typename G::graph_property_type type;
     };
     template <typename G>
- struct vertex_property_type {
- typedef typename G::vertex_property_type type;
+ struct edge_property_type {
+ typedef typename G::edge_property_type type;
     };
     template <typename G>
- struct graph_property_type {
- typedef typename G::graph_property_type type;
+ 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 { };
 
     template<typename G>
+ struct graph_bundle_type {
+ typedef typename G::graph_bundled type;
+ };
+
+ template<typename G>
     struct vertex_bundle_type {
- typedef typename G::vertex_bundled type;
+ typedef typename G::vertex_bundled type;
     };
 
     template<typename G>
     struct edge_bundle_type {
- typedef typename G::edge_bundled type;
+ typedef typename G::edge_bundled type;
     };
 
     namespace graph { namespace detail {
@@ -258,12 +264,11 @@
     } } // namespace graph::detail
 
     namespace graph_detail {
- // 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>
- { };
+ // 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>
+ { };
     } // namespace graph_detail
 
     /** @name Graph Property Traits
@@ -272,24 +277,43 @@
      * edges.
      */
     //@{
- template <typename Graph>
- struct has_vertex_property
- : mpl::not_<
- typename detail::is_no_property<typename vertex_property_type<Graph>::type>
+ template<typename Graph>
+ struct has_graph_property
+ : mpl::not_<
+ typename detail::is_no_property<
+ typename graph_property_type<Graph>::type
>::type
+ >::type
+ { };
+
+ template<typename Graph>
+ struct has_bundled_graph_property
+ : mpl::not_<
+ graph_detail::is_no_bundle<typename graph_bundle_type<Graph>::type>
+ >
     { };
+
     template <typename Graph>
- struct has_edge_property
+ struct has_vertex_property
         : mpl::not_<
- typename detail::is_no_property<typename edge_property_type<Graph>::type>
+ typename detail::is_no_property<typename vertex_property_type<Graph>::type>
>::type
     { };
+
     template <typename Graph>
     struct has_bundled_vertex_property
         : mpl::not_<
             graph_detail::is_no_bundle<typename vertex_bundle_type<Graph>::type>
>
     { };
+
+ template <typename Graph>
+ struct has_edge_property
+ : mpl::not_<
+ typename detail::is_no_property<typename edge_property_type<Graph>::type>
+ >::type
+ { };
+
     template <typename Graph>
     struct has_bundled_edge_property
         : mpl::not_<

Modified: branches/release/boost/graph/labeled_graph.hpp
==============================================================================
--- branches/release/boost/graph/labeled_graph.hpp (original)
+++ branches/release/boost/graph/labeled_graph.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -278,10 +278,13 @@
     typedef typename graph_traits<graph_type>::edge_iterator edge_iterator;
     typedef typename graph_traits<graph_type>::edges_size_type edges_size_type;
 
- typedef typename graph_type::vertex_property_type vertex_property_type;
- typedef typename graph_type::edge_property_type edge_property_type;
     typedef typename graph_type::graph_property_type graph_property_type;
+ typedef typename graph_type::graph_bundled graph_bundled;
+
+ typedef typename graph_type::vertex_property_type vertex_property_type;
     typedef typename graph_type::vertex_bundled vertex_bundled;
+
+ typedef typename graph_type::edge_property_type edge_property_type;
     typedef typename graph_type::edge_bundled edge_bundled;
 
     typedef typename Base::label_type label_type;

Modified: branches/release/boost/graph/properties.hpp
==============================================================================
--- branches/release/boost/graph/properties.hpp (original)
+++ branches/release/boost/graph/properties.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -126,6 +126,7 @@
   BOOST_DEF_PROPERTY(graph, visitor);
 
   // These tags are used for property bundles
+ BOOST_DEF_PROPERTY(graph, bundle);
   BOOST_DEF_PROPERTY(vertex, bundle);
   BOOST_DEF_PROPERTY(edge, bundle);
 
@@ -199,6 +200,7 @@
     };
     template <class Graph, class PropertyTag>
     class vertex_property_map {
+ public:
       typedef typename vertex_property_type<Graph>::type Property;
       typedef typename graph_tag_or_void<Graph>::type graph_tag;
       typedef typename vertex_property_selector<graph_tag>::type Selector;
@@ -242,7 +244,7 @@
 
   template <class Graph, class Property>
   struct property_map {
- private:
+ // 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;
@@ -263,8 +265,9 @@
   template <class Graph, class Property>
   class graph_property {
   public:
- typedef typename property_value<typename Graph::graph_property_type,
- Property>::type type;
+ typedef typename property_value<
+ typename Graph::graph_property_type, Property
+ >::type type;
   };
 
   template <class Graph>
@@ -432,44 +435,71 @@
 // These metafunctions help implement the process of determining the vertex
 // and edge properties of a graph.
 namespace graph_detail {
- template <typename Retag>
+ template<typename Retag>
     struct retagged_property {
         typedef typename Retag::type type;
     };
 
- template <typename Retag, typename With, typename Without>
+ // 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 mpl::if_<
- is_same<typename Retag::retagged, no_property>,
- Without,
- With
- >::type type;
- };
-
- template <typename Prop>
- struct vertex_prop {
- private:
- typedef detail::retag_property_list<vertex_bundle_t, Prop> Retag;
- public:
- typedef typename retagged_property<Retag>::type type;
- typedef typename retagged_bundle<
- Retag, Prop, no_vertex_bundle
- >::type 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>
- struct edge_prop {
-// private:
- typedef detail::retag_property_list<edge_bundle_t, Prop> Retag;
+ template<typename Prop, typename Bundle>
+ class normal_property {
+ // Normalize the property into a property list.
+ typedef detail::retag_property_list<Bundle, Prop> List;
     public:
- typedef typename Retag::retagged retagged;
- typedef typename retagged_property<Retag>::type type;
- typedef typename retagged_bundle<
- Retag, Prop, no_edge_bundle
- >::type bundle;
- };
+ // 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.
+template<typename Graph, typename Tag>
+typename graph_property<Graph, graph_bundle_t>::type&
+get_property(Graph& g, Tag);
+
+template<typename Graph, typename Tag>
+typename graph_property<Graph, graph_bundle_t>::type const&
+get_property(Graph const& g, Tag);
+
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+// NOTE: This operation is a simple adaptor over the overloaded get_property
+// operations.
+template<typename Graph>
+inline typename graph_property<Graph, graph_bundle_t>::type&
+get_property(Graph& g) {
+ return get_property(g, graph_bundle);
+}
+
+template<typename Graph>
+inline typename graph_property<Graph, graph_bundle_t>::type const&
+get_property(Graph const& g) {
+ return get_property(g, graph_bundle);
+}
+#endif
+
 } // namespace boost
 
 #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)

Modified: branches/release/boost/graph/reverse_graph.hpp
==============================================================================
--- branches/release/boost/graph/reverse_graph.hpp (original)
+++ branches/release/boost/graph/reverse_graph.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -79,19 +79,33 @@
 
     typedef reverse_graph_tag graph_tag;
 
+ // Graph, vertex, and edge properties
+ typedef typename graph_property_type<base_type>::type graph_property_type;
+ typedef typename graph_bundle_type<base_type>::type graph_bundled;
+
+ typedef typename vertex_property_type<base_type>::type vertex_property_type;
+ typedef typename vertex_bundle_type<base_type>::type vertex_bundled;
+
+ typedef typename edge_property_type<base_type>::type edge_property_type;
+ typedef typename edge_bundle_type<base_type>::type edge_bundled;
+
 #ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
     // Bundled properties support
     template<typename Descriptor>
- typename graph::detail::bundled_result<BidirectionalGraph,
- Descriptor>::type&
+ typename graph::detail::bundled_result<BidirectionalGraph, Descriptor>::type&
     operator[](Descriptor x)
     { return m_g[x]; }
 
     template<typename Descriptor>
- typename graph::detail::bundled_result<BidirectionalGraph,
- Descriptor>::type const&
+ typename graph::detail::bundled_result<BidirectionalGraph, Descriptor>::type const&
     operator[](Descriptor x) const
     { return m_g[x]; }
+
+ graph_bundled& operator[](graph_bundle_t)
+ { return get_property(*this); }
+
+ graph_bundled const& operator[](graph_bundle_t) const
+ { return get_property(*this); }
 #endif // BOOST_GRAPH_NO_BUNDLED_PROPERTIES
 
     static vertex_descriptor null_vertex()
@@ -116,11 +130,11 @@
 
 #ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
   template<typename Graph, typename GraphRef>
- struct vertex_bundle_type<reverse_graph<Graph, GraphRef> >
+ struct vertex_bundle_type<reverse_graph<Graph, GraphRef> >
     : vertex_bundle_type<Graph> { };
 
   template<typename Graph, typename GraphRef>
- struct edge_bundle_type<reverse_graph<Graph, GraphRef> >
+ struct edge_bundle_type<reverse_graph<Graph, GraphRef> >
     : edge_bundle_type<Graph> { };
 #endif // BOOST_GRAPH_NO_BUNDLED_PROPERTIES
 
@@ -194,7 +208,7 @@
 }
 
 template <class BidirectionalGraph, class GRef>
-inline std::pair<typename graph_traits<BidirectionalGraph>::edge_descriptor,
+inline std::pair<typename graph_traits<BidirectionalGraph>::edge_descriptor,
                  bool>
 edge(const typename graph_traits<BidirectionalGraph>::vertex_descriptor u,
      const typename graph_traits<BidirectionalGraph>::vertex_descriptor v,
@@ -318,7 +332,7 @@
 template<typename BidirectionalGraph, typename GRef, typename Tag,
          typename Value>
 inline void
-set_property(const reverse_graph<BidirectionalGraph,GRef>& g, Tag tag,
+set_property(const reverse_graph<BidirectionalGraph,GRef>& g, Tag tag,
              const Value& value)
 {
   set_property(g.m_g, tag, value);

Modified: branches/release/boost/graph/undirected_graph.hpp
==============================================================================
--- branches/release/boost/graph/undirected_graph.hpp (original)
+++ branches/release/boost/graph/undirected_graph.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -33,17 +33,22 @@
  */
 template <
     typename VertexProp = no_property,
- typename EdgeProp= no_property,
+ typename EdgeProp = no_property,
     typename GraphProp = no_property>
 class undirected_graph
 {
 public:
- typedef typename graph_detail::vertex_prop<VertexProp>::type vertex_property_type;
+ 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>::type edge_property_type;
+
+ typedef typename graph_detail::edge_prop<EdgeProp>::property edge_property_type;
     typedef typename graph_detail::edge_prop<EdgeProp>::bundle edge_bundled;
 
 private:
+ // Embed indices into the vertex type.
     typedef property<vertex_index_t, unsigned, vertex_property_type> vertex_property;
     typedef property<edge_index_t, unsigned, edge_property_type> edge_property;
 public:
@@ -62,9 +67,6 @@
     typedef typename graph_type::directed_selector directed_selector;
 
 public:
- typedef undirected_graph_tag graph_tag;
- typedef typename graph_type::graph_property_type graph_property_type;
-
     // more commonly used graph types
     typedef typename graph_type::stored_vertex stored_vertex;
     typedef typename graph_type::vertices_size_type vertices_size_type;
@@ -81,6 +83,7 @@
     typedef typename graph_type::adjacency_iterator adjacency_iterator;
 
     // miscellaneous types
+ typedef undirected_graph_tag graph_tag;
     typedef typename graph_type::directed_category directed_category;
     typedef typename graph_type::edge_parallel_category edge_parallel_category;
     typedef typename graph_type::traversal_category traversal_category;
@@ -276,6 +279,12 @@
 
     edge_bundled const& operator[](edge_descriptor e) const
     { return m_graph[e]; }
+
+ graph_bundled& operator[](graph_bundle_t)
+ { return get_property(*this); }
+
+ graph_bundled const& operator[](graph_bundle_t) const
+ { return get_property(*this); }
 #endif
 
     // Graph concepts

Modified: branches/release/boost/graph/vector_as_graph.hpp
==============================================================================
--- branches/release/boost/graph/vector_as_graph.hpp (original)
+++ branches/release/boost/graph/vector_as_graph.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -19,8 +19,8 @@
 #include <vector>
 #include <cstddef>
 #include <boost/iterator.hpp>
+#include <boost/range/irange.hpp>
 #include <boost/graph/graph_traits.hpp>
-#include <boost/pending/integer_range.hpp>
 #include <boost/property_map/property_map.hpp>
 #include <boost/graph/properties.hpp>
 #include <algorithm>
@@ -315,14 +315,14 @@
   };
 
   template<typename EdgeList, typename Allocator>
- identity_property_map
+ identity_property_map
   get(vertex_index_t, const std::vector<EdgeList, Allocator>&)
   {
     return identity_property_map();
   }
 
   template<typename EdgeList, typename Allocator>
- identity_property_map
+ identity_property_map
   get(vertex_index_t, std::vector<EdgeList, Allocator>&)
   {
     return identity_property_map();

Modified: branches/release/boost/pending/container_traits.hpp
==============================================================================
--- branches/release/boost/pending/container_traits.hpp (original)
+++ branches/release/boost/pending/container_traits.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -458,7 +458,67 @@
     return push_dispatch(c, v, container_category(c));
   }
 
+ // Find
+ template <class Container, class Value>
+ typename Container::iterator
+ find_dispatch(Container& c,
+ const Value& value,
+ container_tag)
+ {
+ return std::find(c.begin(), c.end(), value);
+ }
+
+ template <class AssociativeContainer, class Value>
+ typename AssociativeContainer::iterator
+ find_dispatch(AssociativeContainer& c,
+ const Value& value,
+ associative_container_tag)
+ {
+ return c.find(value);
+ }
+
+ template <class Container, class Value>
+ typename Container::iterator
+ find(Container& c,
+ const Value& value)
+ {
+ return find_dispatch(c, value,
+ graph_detail::container_category(c));
+ }
+
+ // Find (const versions)
+ template <class Container, class Value>
+ typename Container::const_iterator
+ find_dispatch(const Container& c,
+ const Value& value,
+ container_tag)
+ {
+ return std::find(c.begin(), c.end(), value);
+ }
+
+ template <class AssociativeContainer, class Value>
+ typename AssociativeContainer::const_iterator
+ find_dispatch(const AssociativeContainer& c,
+ const Value& value,
+ associative_container_tag)
+ {
+ return c.find(value);
+ }
+
+ template <class Container, class Value>
+ typename Container::const_iterator
+ find(const Container& c,
+ const Value& value)
+ {
+ return find_dispatch(c, value,
+ graph_detail::container_category(c));
+ }
+
   // Equal range
+#if 0
+ // Make the dispatch fail if c is not an Associative Container (and thus
+ // doesn't have equal_range unless it is sorted, which we cannot check
+ // statically and is not typically true for BGL's uses of this function).
   template <class Container,
             class LessThanComparable>
   std::pair<typename Container::iterator, typename Container::iterator>
@@ -469,21 +529,22 @@
     // c must be sorted for std::equal_range to behave properly.
     return std::equal_range(c.begin(), c.end(), value);
   }
+#endif
 
- template <class AssociativeContainer, class LessThanComparable>
+ template <class AssociativeContainer, class Value>
   std::pair<typename AssociativeContainer::iterator,
             typename AssociativeContainer::iterator>
   equal_range_dispatch(AssociativeContainer& c,
- const LessThanComparable& value,
+ const Value& value,
                        associative_container_tag)
   {
     return c.equal_range(value);
   }
 
- template <class Container, class LessThanComparable>
+ template <class Container, class Value>
   std::pair<typename Container::iterator, typename Container::iterator>
   equal_range(Container& c,
- const LessThanComparable& value)
+ const Value& value)
   {
     return equal_range_dispatch(c, value,
                                 graph_detail::container_category(c));

Modified: branches/release/boost/pending/property.hpp
==============================================================================
--- branches/release/boost/pending/property.hpp (original)
+++ branches/release/boost/pending/property.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -150,7 +150,7 @@
         typedef FinalType retagged;
     };
 
- // A final base case of the retag_propert_list, this will terminate a
+ // A final base case of the retag_property_list, this will terminate a
     // properly structured list.
     template<typename FinalTag>
     struct retag_property_list<FinalTag, no_property>

Modified: branches/release/libs/graph/test/csr_graph_test.cpp
==============================================================================
--- branches/release/libs/graph/test/csr_graph_test.cpp (original)
+++ branches/release/libs/graph/test/csr_graph_test.cpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -39,12 +39,12 @@
 typedef boost::adjacency_list<> GraphT;
 typedef boost::erdos_renyi_iterator<boost::minstd_rand, GraphT> ERGen;
 
-struct VertexData
+struct VertexData
 {
   int index;
 };
 
-struct EdgeData
+struct EdgeData
 {
   int index_e;
 };
@@ -194,7 +194,7 @@
 
   // Check constructing a graph from iterators
   CSRGraphT g3(boost::edges_are_sorted,
- boost::make_transform_iterator(edges(g2).first,
+ boost::make_transform_iterator(edges(g2).first,
                                               boost::detail::make_edge_to_index_pair(g2)),
                boost::make_transform_iterator(edges(g2).second,
                                               boost::detail::make_edge_to_index_pair(g2)),

Modified: branches/release/libs/graph/test/test_graph.hpp
==============================================================================
--- branches/release/libs/graph/test/test_graph.hpp (original)
+++ branches/release/libs/graph/test/test_graph.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -60,6 +60,12 @@
  * generator to define property maps.
  */
 //@{
+// This is really just a place holder to make sure that bundled graph
+// properties actually work. There are no semantics to this type.
+struct GraphBundle {
+ int value;
+};
+
 struct VertexBundle {
     VertexBundle() : value() { }
     VertexBundle(int n) : value(n) { }
@@ -105,6 +111,7 @@
     // Test constrution and vertex list.
     build_graph(g, can_add_vertex, is_labeled);
     build_property_graph(g, can_add_vertex, is_labeled);
+
     test_vertex_list_graph(g);
 
     // Collect the vertices for an easy method of "naming" them.
@@ -118,7 +125,7 @@
 
     // Test connection and edge list
     connect_graph(g, verts, is_labeled);
-// connect_property_graph(g, verts, is_labeld);
+ // connect_property_graph(g, verts, is_labeld);
     test_edge_list_graph(g);
 
     // Test properties

Modified: branches/release/libs/graph/test/test_graphs.cpp
==============================================================================
--- branches/release/libs/graph/test/test_graphs.cpp (original)
+++ branches/release/libs/graph/test/test_graphs.cpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -1,4 +1,4 @@
-// (C) Copyright 2009 Andrew Sutton
+// (C) Copyright 2009-2010 Andrew Sutton
 //
 // Use, modification and distribution are subject to the
 // Boost Software License, Version 1.0 (See accompanying file
@@ -24,130 +24,147 @@
 
 int main()
 {
- // Bootstrap all of the tests by declaring a kind graph and asserting some
- // basic properties about it.
- {
- typedef undirected_graph<VertexBundle, EdgeBundle> Graph;
- BOOST_META_ASSERT(is_undirected_graph<Graph>);
- BOOST_META_ASSERT(is_multigraph<Graph>);
- BOOST_META_ASSERT(is_incidence_graph<Graph>);
- BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
- BOOST_META_ASSERT(has_vertex_property<Graph>);
- BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
- BOOST_META_ASSERT(has_edge_property<Graph>);
- BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
- BOOST_META_ASSERT(is_mutable_graph<Graph>);
- BOOST_META_ASSERT(is_mutable_property_graph<Graph>);
- Graph g;
- test_graph(g);
- }
- {
- typedef directed_graph<VertexBundle, EdgeBundle> Graph;
- BOOST_META_ASSERT(is_directed_graph<Graph>);
- BOOST_META_ASSERT(is_multigraph<Graph>);
- BOOST_META_ASSERT(is_incidence_graph<Graph>);
- BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
- BOOST_META_ASSERT(is_directed_bidirectional_graph<Graph>);
- BOOST_META_ASSERT(has_vertex_property<Graph>);
- BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
- BOOST_META_ASSERT(has_edge_property<Graph>);
- BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
- BOOST_META_ASSERT(is_mutable_graph<Graph>);
- BOOST_META_ASSERT(is_mutable_property_graph<Graph>);
- Graph g;
- test_graph(g);
- }
- {
- typedef adjacency_list<vecS, vecS, undirectedS, VertexBundle, EdgeBundle> Graph;
- BOOST_META_ASSERT(is_undirected_graph<Graph>);
- BOOST_META_ASSERT(is_multigraph<Graph>);
- BOOST_META_ASSERT(is_incidence_graph<Graph>);
- BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
- BOOST_META_ASSERT(has_vertex_property<Graph>);
- BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
- BOOST_META_ASSERT(has_edge_property<Graph>);
- BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
- BOOST_META_ASSERT(is_add_only_property_graph<Graph>);
- Graph g;
- test_graph(g);
- }
- {
- typedef adjacency_list<vecS, vecS, directedS, VertexBundle, EdgeBundle> Graph;
- Graph g;
- BOOST_META_ASSERT(is_directed_graph<Graph>);
- BOOST_META_ASSERT(is_multigraph<Graph>);
- BOOST_META_ASSERT(is_incidence_graph<Graph>);
- BOOST_META_ASSERT(!is_bidirectional_graph<Graph>);
- BOOST_META_ASSERT(is_directed_unidirectional_graph<Graph>);
- BOOST_META_ASSERT(has_vertex_property<Graph>);
- BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
- BOOST_META_ASSERT(has_edge_property<Graph>);
- BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
- BOOST_META_ASSERT(is_add_only_property_graph<Graph>);
- test_graph(g);
- }
- {
- // Common bidi adjlist
- typedef adjacency_list<vecS, vecS, bidirectionalS, VertexBundle, EdgeBundle> Graph;
- BOOST_META_ASSERT(is_directed_graph<Graph>);
- BOOST_META_ASSERT(is_multigraph<Graph>);
- BOOST_META_ASSERT(is_incidence_graph<Graph>);
- BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
- BOOST_META_ASSERT(is_directed_bidirectional_graph<Graph>);
- BOOST_META_ASSERT(has_vertex_property<Graph>);
- BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
- BOOST_META_ASSERT(has_edge_property<Graph>);
- BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
- BOOST_META_ASSERT(is_add_only_property_graph<Graph>);
- Graph g;
- test_graph(g);
- }
- {
- // Same as above, but testing VL==listS
- typedef adjacency_list<vecS, listS, bidirectionalS, VertexBundle, EdgeBundle> Graph;
- BOOST_META_ASSERT(is_directed_graph<Graph>);
- BOOST_META_ASSERT(is_multigraph<Graph>);
- BOOST_META_ASSERT(is_incidence_graph<Graph>);
- BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
- BOOST_META_ASSERT(is_directed_bidirectional_graph<Graph>);
- BOOST_META_ASSERT(has_vertex_property<Graph>);
- BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
- BOOST_META_ASSERT(has_edge_property<Graph>);
- BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
- BOOST_META_ASSERT(is_mutable_property_graph<Graph>);
- Graph g;
- test_graph(g);
- }
- {
- // TODO: What other kinds of graphs do we have here...
- typedef adjacency_matrix<directedS, VertexBundle, EdgeBundle> Graph;
- BOOST_META_ASSERT(is_directed_graph<Graph>);
- BOOST_META_ASSERT(!is_multigraph<Graph>);
- BOOST_META_ASSERT(has_vertex_property<Graph>);
- BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
- BOOST_META_ASSERT(has_edge_property<Graph>);
- BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
- BOOST_META_ASSERT(is_mutable_edge_graph<Graph>);
- BOOST_META_ASSERT(is_mutable_edge_property_graph<Graph>);
- Graph g(N);
- test_graph(g);
- }
- {
- typedef labeled_graph<directed_graph<>, unsigned> Graph;
- BOOST_META_ASSERT(is_directed_graph<Graph>);
- BOOST_META_ASSERT(is_multigraph<Graph>);
- BOOST_META_ASSERT(is_incidence_graph<Graph>);
- BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
- BOOST_META_ASSERT(is_directed_bidirectional_graph<Graph>);
- BOOST_META_ASSERT(is_labeled_mutable_property_graph<Graph>);
- BOOST_META_ASSERT(is_labeled_graph<Graph>);
- BOOST_META_ASSERT(!has_vertex_property<Graph>);
- BOOST_META_ASSERT(!has_bundled_vertex_property<Graph>);
- BOOST_META_ASSERT(!has_edge_property<Graph>);
- BOOST_META_ASSERT(!has_bundled_edge_property<Graph>);
- BOOST_META_ASSERT(is_labeled_mutable_graph<Graph>);
- Graph g;
- test_graph(g);
- }
+ // Bootstrap all of the tests by declaring a kind graph and asserting some
+ // basic properties about it.
+ {
+ typedef undirected_graph<VertexBundle, EdgeBundle, GraphBundle> Graph;
+ BOOST_META_ASSERT(is_undirected_graph<Graph>);
+ BOOST_META_ASSERT(is_multigraph<Graph>);
+ BOOST_META_ASSERT(is_incidence_graph<Graph>);
+ BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
+ BOOST_META_ASSERT(has_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_edge_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
+ BOOST_META_ASSERT(is_mutable_graph<Graph>);
+ BOOST_META_ASSERT(is_mutable_property_graph<Graph>);
+ Graph g;
+ test_graph(g);
+ }
+ {
+ typedef directed_graph<VertexBundle, EdgeBundle, GraphBundle> Graph;
+ BOOST_META_ASSERT(is_directed_graph<Graph>);
+ BOOST_META_ASSERT(is_multigraph<Graph>);
+ BOOST_META_ASSERT(is_incidence_graph<Graph>);
+ BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
+ BOOST_META_ASSERT(is_directed_bidirectional_graph<Graph>);
+ BOOST_META_ASSERT(has_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_edge_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
+ BOOST_META_ASSERT(is_mutable_graph<Graph>);
+ BOOST_META_ASSERT(is_mutable_property_graph<Graph>);
+ Graph g;
+ test_graph(g);
+ }
+ {
+ typedef adjacency_list<vecS, vecS, undirectedS, VertexBundle, EdgeBundle, GraphBundle> Graph;
+ BOOST_META_ASSERT(is_undirected_graph<Graph>);
+ BOOST_META_ASSERT(is_multigraph<Graph>);
+ BOOST_META_ASSERT(is_incidence_graph<Graph>);
+ BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
+ BOOST_META_ASSERT(has_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_edge_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
+ BOOST_META_ASSERT(is_add_only_property_graph<Graph>);
+ Graph g;
+ test_graph(g);
+ }
+ {
+ typedef adjacency_list<vecS, vecS, directedS, VertexBundle, EdgeBundle, GraphBundle> Graph;
+ Graph g;
+ BOOST_META_ASSERT(is_directed_graph<Graph>);
+ BOOST_META_ASSERT(is_multigraph<Graph>);
+ BOOST_META_ASSERT(is_incidence_graph<Graph>);
+ BOOST_META_ASSERT(!is_bidirectional_graph<Graph>);
+ BOOST_META_ASSERT(is_directed_unidirectional_graph<Graph>);
+ BOOST_META_ASSERT(has_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_edge_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
+ BOOST_META_ASSERT(is_add_only_property_graph<Graph>);
+ test_graph(g);
+ }
+ {
+ // Common bidi adjlist
+ typedef adjacency_list<vecS, vecS, bidirectionalS, VertexBundle, EdgeBundle, GraphBundle> Graph;
+ BOOST_META_ASSERT(is_directed_graph<Graph>);
+ BOOST_META_ASSERT(is_multigraph<Graph>);
+ BOOST_META_ASSERT(is_incidence_graph<Graph>);
+ BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
+ BOOST_META_ASSERT(is_directed_bidirectional_graph<Graph>);
+ BOOST_META_ASSERT(has_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_edge_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
+ BOOST_META_ASSERT(is_add_only_property_graph<Graph>);
+ Graph g;
+ test_graph(g);
+ }
+ {
+ // Same as above, but testing VL==listS
+ typedef adjacency_list<vecS, listS, bidirectionalS, VertexBundle, EdgeBundle, GraphBundle> Graph;
+ BOOST_META_ASSERT(is_directed_graph<Graph>);
+ BOOST_META_ASSERT(is_multigraph<Graph>);
+ BOOST_META_ASSERT(is_incidence_graph<Graph>);
+ BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
+ BOOST_META_ASSERT(is_directed_bidirectional_graph<Graph>);
+ BOOST_META_ASSERT(has_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_edge_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
+ BOOST_META_ASSERT(is_mutable_property_graph<Graph>);
+ Graph g;
+ test_graph(g);
+ }
+ {
+ typedef adjacency_matrix<directedS, VertexBundle, EdgeBundle, GraphBundle> Graph;
+ BOOST_META_ASSERT(is_directed_graph<Graph>);
+ BOOST_META_ASSERT(!is_multigraph<Graph>);
+ BOOST_META_ASSERT(has_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_edge_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
+ BOOST_META_ASSERT(is_mutable_edge_graph<Graph>);
+ BOOST_META_ASSERT(is_mutable_edge_property_graph<Graph>);
+ Graph g(N);
+ test_graph(g);
+ }
+ {
+ typedef adjacency_matrix<directedS, VertexBundle, EdgeBundle> Graph;
+ BOOST_META_ASSERT(is_directed_graph<Graph>);
+ BOOST_META_ASSERT(!is_multigraph<Graph>);
+ BOOST_META_ASSERT(has_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_vertex_property<Graph>);
+ BOOST_META_ASSERT(has_edge_property<Graph>);
+ BOOST_META_ASSERT(has_bundled_edge_property<Graph>);
+ BOOST_META_ASSERT(is_mutable_edge_graph<Graph>);
+ BOOST_META_ASSERT(is_mutable_edge_property_graph<Graph>);
+ Graph g(N);
+ test_graph(g);
+ }
+ /*
+ {
+ typedef labeled_graph<directed_graph<>, unsigned> Graph;
+ BOOST_META_ASSERT(is_directed_graph<Graph>);
+ BOOST_META_ASSERT(is_multigraph<Graph>);
+ BOOST_META_ASSERT(is_incidence_graph<Graph>);
+ BOOST_META_ASSERT(is_bidirectional_graph<Graph>);
+ BOOST_META_ASSERT(is_directed_bidirectional_graph<Graph>);
+ BOOST_META_ASSERT(is_labeled_mutable_property_graph<Graph>);
+ BOOST_META_ASSERT(is_labeled_graph<Graph>);
+ BOOST_META_ASSERT(!has_vertex_property<Graph>);
+ BOOST_META_ASSERT(!has_bundled_vertex_property<Graph>);
+ BOOST_META_ASSERT(!has_edge_property<Graph>);
+ BOOST_META_ASSERT(!has_bundled_edge_property<Graph>);
+ BOOST_META_ASSERT(is_labeled_mutable_graph<Graph>);
+ Graph g;
+ test_graph(g);
+ }
+ */
+
+ // TODO: What other kinds of graphs do we have here...
+
 }
 

Modified: branches/release/libs/graph/test/test_properties.hpp
==============================================================================
--- branches/release/libs/graph/test/test_properties.hpp (original)
+++ branches/release/libs/graph/test/test_properties.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -7,6 +7,30 @@
 #ifndef TEST_PROPERTIES_HPP
 #define TEST_PROPERTIES_HPP
 
+template<typename T> T const& as_const(T& x) { return x; }
+template<typename T> void ignore(T const&) { }
+
+template<typename Graph>
+void test_graph_bundle(Graph& g, boost::mpl::true_) {
+ using namespace boost;
+ std::cout << "...test_graph_bundle\n";
+
+ typedef typename graph_property_type<Graph>::type Property;
+ typedef typename graph_bundle_type<Graph>::type Bundle;
+
+ GraphBundle& b1 = g[graph_bundle];
+ GraphBundle& b2 = get_property(g);
+ ignore(b1); ignore(b2);
+
+ GraphBundle const& cb1 = as_const(g)[graph_bundle];
+ GraphBundle const& cb2 = get_property(g);
+ ignore(cb1); ignore(cb2);
+}
+
+template<typename Graph>
+void test_graph_bundle(Graph& g, boost::mpl::false_)
+{ }
+
 /** @name Test Vertex Bundle
  * Exercise the vertex bundle. Note that this is expected to be of type
  * VertexBundle.
@@ -14,30 +38,28 @@
 //@{
 template <typename Graph, typename VertexSet>
 void test_vertex_bundle(Graph& g, VertexSet const& verts, boost::mpl::true_) {
- using namespace boost;
- BOOST_CONCEPT_ASSERT((GraphConcept<Graph>));
- typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
- BOOST_CONCEPT_ASSERT((PropertyGraphConcept<Graph, Vertex, vertex_bundle_t>));
-
- std::cout << "...test_vertex_bundle\n";
+ using namespace boost;
+ BOOST_CONCEPT_ASSERT((GraphConcept<Graph>));
+ typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+ BOOST_CONCEPT_ASSERT((PropertyGraphConcept<Graph, Vertex, vertex_bundle_t>));
 
     // Test bundling via the graph object on the lollipop vertex.
- Vertex v = verts[5];
- VertexBundle& b = g[v];
- b.value = 10;
- BOOST_ASSERT(g[v].value == 10);
-
- // Test bundling via the property map.
- typedef typename property_map<Graph, int VertexBundle::*>::type BundleMap;
- BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept<BundleMap, Vertex>));
- BundleMap map = get(&VertexBundle::value, g);
- put(map, v, 5);
- BOOST_ASSERT(get(map, v) == 5);
-
- typedef typename property_map<Graph, int VertexBundle::*>::const_type ConstBundleMap;
- BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<ConstBundleMap, Vertex>));
- ConstBundleMap cmap = get(&VertexBundle::value, (Graph const&)g);
- BOOST_ASSERT(get(cmap, v) == 5);
+ Vertex v = verts[5];
+ VertexBundle& b = g[v];
+ b.value = 10;
+ BOOST_ASSERT(g[v].value == 10);
+
+ // Test bundling via the property map.
+ typedef typename property_map<Graph, int VertexBundle::*>::type BundleMap;
+ BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept<BundleMap, Vertex>));
+ BundleMap map = get(&VertexBundle::value, g);
+ put(map, v, 5);
+ BOOST_ASSERT(get(map, v) == 5);
+
+ typedef typename property_map<Graph, int VertexBundle::*>::const_type ConstBundleMap;
+ BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<ConstBundleMap, Vertex>));
+ ConstBundleMap cmap = get(&VertexBundle::value, (Graph const&)g);
+ BOOST_ASSERT(get(cmap, v) == 5);
 }
 
 template <typename Graph, typename VertexSet>
@@ -90,11 +112,15 @@
  */
 template <typename Graph, typename VertexSet>
 void test_properties(Graph& g, VertexSet const& verts) {
- typename boost::has_bundled_vertex_property<Graph>::type vertex_bundled;
- typename boost::has_bundled_edge_property<Graph>::type edge_bundled;
+ using namespace boost;
 
- test_vertex_bundle(g, verts, vertex_bundled);
- test_edge_bundle(g, verts, edge_bundled);
+ typename has_bundled_graph_property<Graph>::type graph_bundled;
+ typename has_bundled_vertex_property<Graph>::type vertex_bundled;
+ typename has_bundled_edge_property<Graph>::type edge_bundled;
+
+ test_graph_bundle(g, graph_bundled);
+ test_vertex_bundle(g, verts, vertex_bundled);
+ test_edge_bundle(g, verts, edge_bundled);
 }
 //@}
 

Modified: branches/release/libs/graph/test/typestr.hpp
==============================================================================
--- branches/release/libs/graph/test/typestr.hpp (original)
+++ branches/release/libs/graph/test/typestr.hpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -15,6 +15,8 @@
 #include <cxxabi.h>
 #endif
 
+template<typename T> struct type_name { };
+
 /**
  * Return a string that describes the type of the given template parameter.
  * The type name depends on the results of the typeid operator.
@@ -22,16 +24,15 @@
  * @todo Rewrite this so that demangle will dynamically allocate the memory.
  */
 template <typename T>
-std::string typestr()
-{
+std::string typestr() {
 #if defined(__GNUC__)
     std::size_t const BUFSIZE = 8192;
     std::size_t n = BUFSIZE;
     char buf[BUFSIZE];
- abi::__cxa_demangle(typeid(T).name(), buf, &n, 0);
+ abi::__cxa_demangle(typeid(type_name<T>).name(), buf, &n, 0);
     return std::string(buf, ::strlen(buf));
 #else
- return typeid(T).name();
+ return typeid(type_name<T>).name();
 #endif
 }
 

Modified: branches/release/libs/graph_parallel/test/process_group_serialization.cpp
==============================================================================
--- branches/release/libs/graph_parallel/test/process_group_serialization.cpp (original)
+++ branches/release/libs/graph_parallel/test/process_group_serialization.cpp 2010-10-05 13:42:47 EDT (Tue, 05 Oct 2010)
@@ -7,6 +7,10 @@
 // Authors: Douglas Gregor
 // Andrew Lumsdaine
 
+// FIXME: Including because of a missing header in the serialization library.
+// Patch sent to list...
+#include <cassert>
+
 #include <boost/graph/use_mpi.hpp>
 #include <boost/config.hpp>
 #include <boost/throw_exception.hpp>


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