123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822 |
- // (C) Copyright 2007-2009 Andrew Sutton
- //
- // Use, modification and distribution are subject to the
- // Boost Software License, Version 1.0 (See accompanying file
- // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_GRAPH_UNDIRECTED_GRAPH_HPP
- #define BOOST_GRAPH_UNDIRECTED_GRAPH_HPP
- #include <boost/graph/adjacency_list.hpp>
- #include <boost/graph/properties.hpp>
- #include <boost/pending/property.hpp>
- #include <boost/property_map/transform_value_property_map.hpp>
- #include <boost/type_traits.hpp>
- #include <boost/mpl/if.hpp>
- namespace boost
- {
- struct undirected_graph_tag
- {
- };
- /**
- * The undirected_graph class template is a simplified version of the BGL
- * adjacency list. This class is provided for ease of use, but may not
- * perform as well as custom-defined adjacency list classes. Instances of
- * this template model the VertexIndexGraph, and EdgeIndexGraph concepts. The
- * graph is also fully mutable, supporting both insertions and removals of
- * vertices and edges.
- *
- * @note Special care must be taken when removing vertices or edges since
- * those operations can invalidate the numbering of vertices.
- */
- template < typename VertexProp = no_property, typename EdgeProp = no_property,
- typename GraphProp = no_property >
- class undirected_graph
- {
- public:
- typedef GraphProp graph_property_type;
- typedef VertexProp vertex_property_type;
- typedef EdgeProp edge_property_type;
- typedef typename lookup_one_property< GraphProp, graph_bundle_t >::type
- graph_bundled;
- typedef typename lookup_one_property< VertexProp, vertex_bundle_t >::type
- vertex_bundled;
- typedef typename lookup_one_property< EdgeProp, edge_bundle_t >::type
- edge_bundled;
- public:
- // Embed indices into the vertex type.
- typedef property< vertex_index_t, unsigned, vertex_property_type >
- internal_vertex_property;
- typedef property< edge_index_t, unsigned, edge_property_type >
- internal_edge_property;
- public:
- typedef adjacency_list< listS, listS, undirectedS, internal_vertex_property,
- internal_edge_property, GraphProp, listS >
- graph_type;
- private:
- // storage selectors
- typedef typename graph_type::vertex_list_selector vertex_list_selector;
- typedef typename graph_type::edge_list_selector edge_list_selector;
- typedef typename graph_type::out_edge_list_selector out_edge_list_selector;
- typedef typename graph_type::directed_selector directed_selector;
- public:
- // more commonly used graph types
- typedef typename graph_type::stored_vertex stored_vertex;
- typedef typename graph_type::vertices_size_type vertices_size_type;
- typedef typename graph_type::edges_size_type edges_size_type;
- typedef typename graph_type::degree_size_type degree_size_type;
- typedef typename graph_type::vertex_descriptor vertex_descriptor;
- typedef typename graph_type::edge_descriptor edge_descriptor;
- // iterator types
- typedef typename graph_type::vertex_iterator vertex_iterator;
- typedef typename graph_type::edge_iterator edge_iterator;
- typedef typename graph_type::out_edge_iterator out_edge_iterator;
- typedef typename graph_type::in_edge_iterator in_edge_iterator;
- 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;
- typedef std::size_t vertex_index_type;
- typedef std::size_t edge_index_type;
- inline undirected_graph(GraphProp const& p = GraphProp())
- : m_graph(p)
- , m_num_vertices(0)
- , m_num_edges(0)
- , m_max_vertex_index(0)
- , m_max_edge_index(0)
- {
- }
- inline undirected_graph(undirected_graph const& x)
- : m_graph(x.m_graph)
- , m_num_vertices(x.m_num_vertices)
- , m_num_edges(x.m_num_edges)
- , m_max_vertex_index(x.m_max_vertex_index)
- , m_max_edge_index(x.m_max_edge_index)
- {
- }
- inline undirected_graph(
- vertices_size_type n, GraphProp const& p = GraphProp())
- : m_graph(n, p)
- , m_num_vertices(n)
- , m_num_edges(0)
- , m_max_vertex_index(n)
- , m_max_edge_index(0)
- {
- renumber_vertex_indices();
- }
- template < typename EdgeIterator >
- inline undirected_graph(EdgeIterator f, EdgeIterator l,
- vertices_size_type n, edges_size_type m = 0,
- GraphProp const& p = GraphProp())
- : m_graph(f, l, n, m, p)
- , m_num_vertices(n)
- , m_num_edges(0)
- , m_max_vertex_index(n)
- , m_max_edge_index(0)
- {
- // Unfortunately, we have to renumber to ensure correct indexing.
- renumber_indices();
- // Can't always guarantee that the number of edges is actually
- // m if distance(f, l) != m (or is undefined).
- m_num_edges = m_max_edge_index = boost::num_edges(m_graph);
- }
- undirected_graph& operator=(undirected_graph const& g)
- {
- if (&g != this)
- {
- m_graph = g.m_graph;
- m_num_vertices = g.m_num_vertices;
- m_num_edges = g.m_num_edges;
- m_max_vertex_index = g.m_max_vertex_index;
- }
- return *this;
- }
- // The impl_() methods are not part of the public interface.
- graph_type& impl() { return m_graph; }
- graph_type const& impl() const { return m_graph; }
- // The following methods are not part of the public interface
- vertices_size_type num_vertices() const { return m_num_vertices; }
- private:
- // This helper function manages the attribution of vertex indices.
- vertex_descriptor make_index(vertex_descriptor v)
- {
- boost::put(vertex_index, m_graph, v, m_max_vertex_index);
- m_num_vertices++;
- m_max_vertex_index++;
- return v;
- }
- public:
- vertex_descriptor add_vertex()
- {
- return make_index(boost::add_vertex(m_graph));
- }
- vertex_descriptor add_vertex(vertex_property_type const& p)
- {
- return make_index(
- boost::add_vertex(internal_vertex_property(0u, p), m_graph));
- }
- void clear_vertex(vertex_descriptor v)
- {
- std::pair< out_edge_iterator, out_edge_iterator > p
- = boost::out_edges(v, m_graph);
- m_num_edges -= std::distance(p.first, p.second);
- boost::clear_vertex(v, m_graph);
- }
- void remove_vertex(vertex_descriptor v)
- {
- boost::remove_vertex(v, m_graph);
- --m_num_vertices;
- }
- edges_size_type num_edges() const { return m_num_edges; }
- private:
- // A helper fucntion for managing edge index attributes.
- std::pair< edge_descriptor, bool > const& make_index(
- std::pair< edge_descriptor, bool > const& x)
- {
- if (x.second)
- {
- boost::put(edge_index, m_graph, x.first, m_max_edge_index);
- ++m_num_edges;
- ++m_max_edge_index;
- }
- return x;
- }
- public:
- std::pair< edge_descriptor, bool > add_edge(
- vertex_descriptor u, vertex_descriptor v)
- {
- return make_index(boost::add_edge(u, v, m_graph));
- }
- std::pair< edge_descriptor, bool > add_edge(
- vertex_descriptor u, vertex_descriptor v, edge_property_type const& p)
- {
- return make_index(
- boost::add_edge(u, v, internal_edge_property(0u, p), m_graph));
- }
- void remove_edge(vertex_descriptor u, vertex_descriptor v)
- {
- // find all edges, (u, v)
- std::vector< edge_descriptor > edges;
- out_edge_iterator i, i_end;
- for (boost::tie(i, i_end) = boost::out_edges(u, m_graph); i != i_end;
- ++i)
- {
- if (boost::target(*i, m_graph) == v)
- {
- edges.push_back(*i);
- }
- }
- // remove all edges, (u, v)
- typename std::vector< edge_descriptor >::iterator j = edges.begin(),
- j_end = edges.end();
- for (; j != j_end; ++j)
- {
- remove_edge(*j);
- }
- }
- void remove_edge(edge_iterator i) { remove_edge(*i); }
- void remove_edge(edge_descriptor e)
- {
- boost::remove_edge(e, m_graph);
- --m_num_edges;
- }
- vertex_index_type max_vertex_index() const { return m_max_vertex_index; }
- void renumber_vertex_indices()
- {
- vertex_iterator i, i_end;
- boost::tie(i, i_end) = vertices(m_graph);
- m_max_vertex_index = renumber_vertex_indices(i, i_end, 0);
- }
- void remove_vertex_and_renumber_indices(vertex_iterator i)
- {
- vertex_iterator j = next(i), end = vertices(m_graph).second;
- vertex_index_type n = get(vertex_index, m_graph, *i);
- // remove the offending vertex and renumber everything after
- remove_vertex(*i);
- m_max_vertex_index = renumber_vertex_indices(j, end, n);
- }
- edge_index_type max_edge_index() const { return m_max_edge_index; }
- void renumber_edge_indices()
- {
- edge_iterator i, end;
- boost::tie(i, end) = edges(m_graph);
- m_max_edge_index = renumber_edge_indices(i, end, 0);
- }
- void remove_edge_and_renumber_indices(edge_iterator i)
- {
- edge_iterator j = next(i), end = edges(m_graph.second);
- edge_index_type n = get(edge_index, m_graph, *i);
- // remove the edge and renumber everything after it
- remove_edge(*i);
- m_max_edge_index = renumber_edge_indices(j, end, n);
- }
- void renumber_indices()
- {
- renumber_vertex_indices();
- renumber_edge_indices();
- }
- // bundled property support
- #ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
- vertex_bundled& operator[](vertex_descriptor v) { return m_graph[v]; }
- vertex_bundled const& operator[](vertex_descriptor v) const
- {
- return m_graph[v];
- }
- edge_bundled& operator[](edge_descriptor e) { return m_graph[e]; }
- 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
- static vertex_descriptor null_vertex() { return graph_type::null_vertex(); }
- void clear()
- {
- m_graph.clear();
- m_num_vertices = m_max_vertex_index = 0;
- m_num_edges = m_max_edge_index = 0;
- }
- void swap(undirected_graph& g)
- {
- m_graph.swap(g.m_graph);
- std::swap(m_num_vertices, g.m_num_vertices);
- std::swap(m_max_vertex_index, g.m_max_vertex_index);
- std::swap(m_num_edges, g.m_num_edges);
- std::swap(m_max_edge_index, g.m_max_edge_index);
- }
- private:
- vertices_size_type renumber_vertex_indices(
- vertex_iterator i, vertex_iterator end, vertices_size_type n)
- {
- typedef
- typename property_map< graph_type, vertex_index_t >::type IndexMap;
- IndexMap indices = get(vertex_index, m_graph);
- for (; i != end; ++i)
- {
- indices[*i] = n++;
- }
- return n;
- }
- edges_size_type renumber_edge_indices(
- edge_iterator i, edge_iterator end, edges_size_type n)
- {
- typedef
- typename property_map< graph_type, edge_index_t >::type IndexMap;
- IndexMap indices = get(edge_index, m_graph);
- for (; i != end; ++i)
- {
- indices[*i] = n++;
- }
- return n;
- }
- graph_type m_graph;
- vertices_size_type m_num_vertices;
- edges_size_type m_num_edges;
- vertex_index_type m_max_vertex_index;
- edge_index_type m_max_edge_index;
- };
- #define UNDIRECTED_GRAPH_PARAMS typename VP, typename EP, typename GP
- #define UNDIRECTED_GRAPH undirected_graph< VP, EP, GP >
- // IncidenceGraph concepts
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename UNDIRECTED_GRAPH::vertex_descriptor source(
- typename UNDIRECTED_GRAPH::edge_descriptor e, UNDIRECTED_GRAPH const& g)
- {
- return source(e, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename UNDIRECTED_GRAPH::vertex_descriptor target(
- typename UNDIRECTED_GRAPH::edge_descriptor e, UNDIRECTED_GRAPH const& g)
- {
- return target(e, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename UNDIRECTED_GRAPH::degree_size_type out_degree(
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH const& g)
- {
- return out_degree(v, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline std::pair< typename UNDIRECTED_GRAPH::out_edge_iterator,
- typename UNDIRECTED_GRAPH::out_edge_iterator >
- out_edges(
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH const& g)
- {
- return out_edges(v, g.impl());
- }
- // BidirectionalGraph concepts
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename UNDIRECTED_GRAPH::degree_size_type in_degree(
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH const& g)
- {
- return in_degree(v, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline std::pair< typename UNDIRECTED_GRAPH::in_edge_iterator,
- typename UNDIRECTED_GRAPH::in_edge_iterator >
- in_edges(
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH const& g)
- {
- return in_edges(v, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline std::pair< typename UNDIRECTED_GRAPH::out_edge_iterator,
- typename UNDIRECTED_GRAPH::out_edge_iterator >
- incident_edges(
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH const& g)
- {
- return out_edges(v, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename UNDIRECTED_GRAPH::degree_size_type degree(
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH const& g)
- {
- return degree(v, g.impl());
- }
- // AdjacencyGraph concepts
- template < UNDIRECTED_GRAPH_PARAMS >
- inline std::pair< typename UNDIRECTED_GRAPH::adjacency_iterator,
- typename UNDIRECTED_GRAPH::adjacency_iterator >
- adjacent_vertices(
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH const& g)
- {
- return adjacent_vertices(v, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- typename UNDIRECTED_GRAPH::vertex_descriptor vertex(
- typename UNDIRECTED_GRAPH::vertices_size_type n, UNDIRECTED_GRAPH const& g)
- {
- return vertex(n, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- std::pair< typename UNDIRECTED_GRAPH::edge_descriptor, bool > edge(
- typename UNDIRECTED_GRAPH::vertex_descriptor u,
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH const& g)
- {
- return edge(u, v, g.impl());
- }
- // VertexListGraph concepts
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename UNDIRECTED_GRAPH::vertices_size_type num_vertices(
- UNDIRECTED_GRAPH const& g)
- {
- return g.num_vertices();
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline std::pair< typename UNDIRECTED_GRAPH::vertex_iterator,
- typename UNDIRECTED_GRAPH::vertex_iterator >
- vertices(UNDIRECTED_GRAPH const& g)
- {
- return vertices(g.impl());
- }
- // EdgeListGraph concepts
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename UNDIRECTED_GRAPH::edges_size_type num_edges(
- UNDIRECTED_GRAPH const& g)
- {
- return g.num_edges();
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline std::pair< typename UNDIRECTED_GRAPH::edge_iterator,
- typename UNDIRECTED_GRAPH::edge_iterator >
- edges(UNDIRECTED_GRAPH const& g)
- {
- return edges(g.impl());
- }
- // MutableGraph concepts
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename UNDIRECTED_GRAPH::vertex_descriptor add_vertex(
- UNDIRECTED_GRAPH& g)
- {
- return g.add_vertex();
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename UNDIRECTED_GRAPH::vertex_descriptor add_vertex(
- typename UNDIRECTED_GRAPH::vertex_property_type const& p,
- UNDIRECTED_GRAPH& g)
- {
- return g.add_vertex(p);
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline void clear_vertex(
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH& g)
- {
- return g.clear_vertex(v);
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline void remove_vertex(
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH& g)
- {
- return g.remove_vertex(v);
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline std::pair< typename UNDIRECTED_GRAPH::edge_descriptor, bool > add_edge(
- typename UNDIRECTED_GRAPH::vertex_descriptor u,
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH& g)
- {
- return g.add_edge(u, v);
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline std::pair< typename UNDIRECTED_GRAPH::edge_descriptor, bool > add_edge(
- typename UNDIRECTED_GRAPH::vertex_descriptor u,
- typename UNDIRECTED_GRAPH::vertex_descriptor v,
- typename UNDIRECTED_GRAPH::edge_property_type const& p, UNDIRECTED_GRAPH& g)
- {
- return g.add_edge(u, v, p);
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline void remove_edge(typename UNDIRECTED_GRAPH::vertex_descriptor u,
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH& g)
- {
- return g.remove_edge(u, v);
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline void remove_edge(
- typename UNDIRECTED_GRAPH::edge_descriptor e, UNDIRECTED_GRAPH& g)
- {
- return g.remove_edge(e);
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline void remove_edge(
- typename UNDIRECTED_GRAPH::edge_iterator i, UNDIRECTED_GRAPH& g)
- {
- return g.remove_edge(i);
- }
- template < UNDIRECTED_GRAPH_PARAMS, class Predicate >
- inline void remove_edge_if(Predicate pred, UNDIRECTED_GRAPH& g)
- {
- return remove_edge_if(pred, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS, class Predicate >
- inline void remove_incident_edge_if(
- typename UNDIRECTED_GRAPH::vertex_descriptor v, Predicate pred,
- UNDIRECTED_GRAPH& g)
- {
- return remove_out_edge_if(v, pred, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS, class Predicate >
- inline void remove_out_edge_if(typename UNDIRECTED_GRAPH::vertex_descriptor v,
- Predicate pred, UNDIRECTED_GRAPH& g)
- {
- return remove_out_edge_if(v, pred, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS, class Predicate >
- inline void remove_in_edge_if(typename UNDIRECTED_GRAPH::vertex_descriptor v,
- Predicate pred, UNDIRECTED_GRAPH& g)
- {
- return remove_in_edge_if(v, pred, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS, typename Property >
- struct property_map< UNDIRECTED_GRAPH, Property >
- : property_map< typename UNDIRECTED_GRAPH::graph_type, Property >
- {
- };
- template < UNDIRECTED_GRAPH_PARAMS >
- struct property_map< UNDIRECTED_GRAPH, vertex_all_t >
- {
- typedef transform_value_property_map< detail::remove_first_property,
- typename property_map< typename UNDIRECTED_GRAPH::graph_type,
- vertex_all_t >::const_type >
- const_type;
- typedef transform_value_property_map< detail::remove_first_property,
- typename property_map< typename UNDIRECTED_GRAPH::graph_type,
- vertex_all_t >::type >
- type;
- };
- template < UNDIRECTED_GRAPH_PARAMS >
- struct property_map< UNDIRECTED_GRAPH, edge_all_t >
- {
- typedef transform_value_property_map< detail::remove_first_property,
- typename property_map< typename UNDIRECTED_GRAPH::graph_type,
- edge_all_t >::const_type >
- const_type;
- typedef transform_value_property_map< detail::remove_first_property,
- typename property_map< typename UNDIRECTED_GRAPH::graph_type,
- edge_all_t >::type >
- type;
- };
- // PropertyGraph concepts
- template < UNDIRECTED_GRAPH_PARAMS, typename Property >
- inline typename property_map< UNDIRECTED_GRAPH, Property >::type get(
- Property p, UNDIRECTED_GRAPH& g)
- {
- return get(p, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS, typename Property >
- inline typename property_map< UNDIRECTED_GRAPH, Property >::const_type get(
- Property p, UNDIRECTED_GRAPH const& g)
- {
- return get(p, g.impl());
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename property_map< UNDIRECTED_GRAPH, vertex_all_t >::type get(
- vertex_all_t, UNDIRECTED_GRAPH& g)
- {
- return typename property_map< UNDIRECTED_GRAPH, vertex_all_t >::type(
- detail::remove_first_property(), get(vertex_all, g.impl()));
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename property_map< UNDIRECTED_GRAPH, vertex_all_t >::const_type get(
- vertex_all_t, UNDIRECTED_GRAPH const& g)
- {
- return typename property_map< UNDIRECTED_GRAPH, vertex_all_t >::const_type(
- detail::remove_first_property(), get(vertex_all, g.impl()));
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename property_map< UNDIRECTED_GRAPH, edge_all_t >::type get(
- edge_all_t, UNDIRECTED_GRAPH& g)
- {
- return typename property_map< UNDIRECTED_GRAPH, edge_all_t >::type(
- detail::remove_first_property(), get(edge_all, g.impl()));
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename property_map< UNDIRECTED_GRAPH, edge_all_t >::const_type get(
- edge_all_t, UNDIRECTED_GRAPH const& g)
- {
- return typename property_map< UNDIRECTED_GRAPH, edge_all_t >::const_type(
- detail::remove_first_property(), get(edge_all, g.impl()));
- }
- template < UNDIRECTED_GRAPH_PARAMS, typename Property, typename Key >
- inline typename property_traits< typename property_map<
- typename UNDIRECTED_GRAPH::graph_type, Property >::const_type >::value_type
- get(Property p, UNDIRECTED_GRAPH const& g, Key const& k)
- {
- return get(p, g.impl(), k);
- }
- template < UNDIRECTED_GRAPH_PARAMS, typename Key >
- inline typename property_traits<
- typename property_map< typename UNDIRECTED_GRAPH::graph_type,
- vertex_all_t >::const_type >::value_type
- get(vertex_all_t, UNDIRECTED_GRAPH const& g, Key const& k)
- {
- return get(vertex_all, g.impl(), k).m_base;
- }
- template < UNDIRECTED_GRAPH_PARAMS, typename Key >
- inline typename property_traits<
- typename property_map< typename UNDIRECTED_GRAPH::graph_type,
- edge_all_t >::const_type >::value_type
- get(edge_all_t, UNDIRECTED_GRAPH const& g, Key const& k)
- {
- return get(edge_all, g.impl(), k).m_base;
- }
- template < UNDIRECTED_GRAPH_PARAMS, typename Property, typename Key,
- typename Value >
- inline void put(Property p, UNDIRECTED_GRAPH& g, Key const& k, Value const& v)
- {
- put(p, g.impl(), k, v);
- }
- template < UNDIRECTED_GRAPH_PARAMS, typename Key, typename Value >
- inline void put(vertex_all_t, UNDIRECTED_GRAPH& g, Key const& k, Value const& v)
- {
- put(vertex_all, g.impl(), k,
- typename UNDIRECTED_GRAPH::internal_vertex_property(
- get(vertex_index, g.impl(), k), v));
- }
- template < UNDIRECTED_GRAPH_PARAMS, typename Key, typename Value >
- inline void put(edge_all_t, UNDIRECTED_GRAPH& g, Key const& k, Value const& v)
- {
- put(edge_all, g.impl(), k,
- typename UNDIRECTED_GRAPH::internal_vertex_property(
- get(edge_index, g.impl(), k), v));
- }
- template < UNDIRECTED_GRAPH_PARAMS, class Property >
- inline typename graph_property< UNDIRECTED_GRAPH, Property >::type&
- get_property(UNDIRECTED_GRAPH& g, Property p)
- {
- return get_property(g.impl(), p);
- }
- template < UNDIRECTED_GRAPH_PARAMS, class Property >
- inline typename graph_property< UNDIRECTED_GRAPH, Property >::type const&
- get_property(UNDIRECTED_GRAPH const& g, Property p)
- {
- return get_property(g.impl(), p);
- }
- template < UNDIRECTED_GRAPH_PARAMS, class Property, class Value >
- inline void set_property(UNDIRECTED_GRAPH& g, Property p, Value v)
- {
- return set_property(g.impl(), p, v);
- }
- // Indexed Vertex graph
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename UNDIRECTED_GRAPH::vertex_index_type get_vertex_index(
- typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH const& g)
- {
- return get(vertex_index, g, v);
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- typename UNDIRECTED_GRAPH::vertex_index_type max_vertex_index(
- UNDIRECTED_GRAPH const& g)
- {
- return g.max_vertex_index();
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline void renumber_vertex_indices(UNDIRECTED_GRAPH& g)
- {
- g.renumber_vertex_indices();
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline void remove_vertex_and_renumber_indices(
- typename UNDIRECTED_GRAPH::vertex_iterator i, UNDIRECTED_GRAPH& g)
- {
- g.remove_vertex_and_renumber_indices(i);
- }
- // Edge index management
- template < UNDIRECTED_GRAPH_PARAMS >
- inline typename UNDIRECTED_GRAPH::edge_index_type get_edge_index(
- typename UNDIRECTED_GRAPH::edge_descriptor v, UNDIRECTED_GRAPH const& g)
- {
- return get(edge_index, g, v);
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- typename UNDIRECTED_GRAPH::edge_index_type max_edge_index(
- UNDIRECTED_GRAPH const& g)
- {
- return g.max_edge_index();
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline void renumber_edge_indices(UNDIRECTED_GRAPH& g)
- {
- g.renumber_edge_indices();
- }
- template < UNDIRECTED_GRAPH_PARAMS >
- inline void remove_edge_and_renumber_indices(
- typename UNDIRECTED_GRAPH::edge_iterator i, UNDIRECTED_GRAPH& g)
- {
- g.remove_edge_and_renumber_indices(i);
- }
- // Index management
- template < UNDIRECTED_GRAPH_PARAMS >
- inline void renumber_indices(UNDIRECTED_GRAPH& g)
- {
- g.renumber_indices();
- }
- // Mutability Traits
- template < UNDIRECTED_GRAPH_PARAMS >
- struct graph_mutability_traits< UNDIRECTED_GRAPH >
- {
- typedef mutable_property_graph_tag category;
- };
- #undef UNDIRECTED_GRAPH_PARAMS
- #undef UNDIRECTED_GRAPH
- } /* namespace boost */
- #endif
|