| // (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_EXTERIOR_PROPERTY_HPP |
| #define BOOST_GRAPH_EXTERIOR_PROPERTY_HPP |
| |
| #include <vector> |
| #include <boost/graph/property_maps/container_property_map.hpp> |
| #include <boost/graph/property_maps/matrix_property_map.hpp> |
| |
| namespace boost { |
| namespace detail { |
| // The vector matrix provides a little abstraction over vector |
| // types that makes matrices easier to work with. Note that it's |
| // non-copyable, meaning you should be passing it by value. |
| template <typename Value> |
| struct vector_matrix |
| { |
| typedef std::vector<Value> container_type; |
| typedef std::vector<container_type> matrix_type; |
| |
| typedef container_type value_type; |
| typedef container_type& reference; |
| typedef const container_type const_reference; |
| typedef container_type* pointer; |
| typedef typename matrix_type::size_type size_type; |
| |
| // Instantiate the matrix over n elements (creates an nxn matrix). |
| // The graph has to be passed in order to ensure the index maps |
| // are constructed correctly when returning indexible elements. |
| inline vector_matrix(size_type n) |
| : m_matrix(n, container_type(n)) |
| { } |
| |
| inline reference operator [](size_type n) |
| { return m_matrix[n]; } |
| |
| inline const_reference operator [](size_type n) const |
| { return m_matrix[n]; } |
| |
| matrix_type m_matrix; |
| }; |
| } /* namespace detail */ |
| |
| /** |
| * The exterior_property metafunction defines an appropriate set of types for |
| * creating an exterior property. An exterior property is comprised of a both |
| * a container and a property map that acts as its abstraction. An extension |
| * of this metafunction will select an appropriate "matrix" property that |
| * records values for pairs of vertices. |
| * |
| * @todo This does not currently support the ability to define exterior |
| * properties for graph types that do not model the IndexGraph concepts. A |
| * solution should not be especially difficult, but will require an extension |
| * of type traits to affect the type selection. |
| */ |
| template <typename Graph, typename Key, typename Value> |
| struct exterior_property |
| { |
| typedef Key key_type; |
| typedef Value value_type; |
| |
| typedef std::vector<Value> container_type; |
| typedef container_property_map<Graph, Key, container_type> map_type; |
| |
| typedef detail::vector_matrix<Value> matrix_type; |
| typedef matrix_property_map<Graph, Key, matrix_type> matrix_map_type; |
| |
| private: |
| exterior_property() { } |
| exterior_property(const exterior_property&) { } |
| }; |
| |
| /** |
| * Define a the container and property map types requried to create an exterior |
| * vertex property for the given value type. The Graph parameter is required to |
| * model the VertexIndexGraph concept. |
| */ |
| template <typename Graph, typename Value> |
| struct exterior_vertex_property |
| { |
| typedef exterior_property< |
| Graph, typename graph_traits<Graph>::vertex_descriptor, Value |
| > property_type; |
| typedef typename property_type::key_type key_type; |
| typedef typename property_type::value_type value_type; |
| typedef typename property_type::container_type container_type; |
| typedef typename property_type::map_type map_type; |
| typedef typename property_type::matrix_type matrix_type; |
| typedef typename property_type::matrix_map_type matrix_map_type; |
| }; |
| |
| /** |
| * Define a the container and property map types requried to create an exterior |
| * edge property for the given value type. The Graph parameter is required to |
| * model the EdgeIndexGraph concept. |
| */ |
| template <typename Graph, typename Value> |
| struct exterior_edge_property |
| { |
| typedef exterior_property< |
| Graph, typename graph_traits<Graph>::edge_descriptor, Value |
| > property_type; |
| typedef typename property_type::key_type key_type; |
| typedef typename property_type::value_type value_type; |
| typedef typename property_type::container_type container_type; |
| typedef typename property_type::map_type map_type; |
| typedef typename property_type::matrix_type matrix_type; |
| typedef typename property_type::matrix_map_type matrix_map_type; |
| }; |
| |
| } /* namespace boost */ |
| |
| #endif |