| // (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_MATRIX_PROPERTY_MAP_HPP |
| #define BOOST_GRAPH_MATRIX_PROPERTY_MAP_HPP |
| |
| #include <boost/graph/property_maps/container_property_map.hpp> |
| |
| namespace boost |
| { |
| // This property map is built specifically for property maps over |
| // matrices. Like the basic property map over a container, this builds |
| // the property abstraction over a matrix (usually a vector of vectors) |
| // and returns property maps over the nested containers. |
| template <typename Graph, typename Key, typename Matrix> |
| struct matrix_property_map |
| : boost::put_get_helper< |
| container_property_map<Graph, Key, typename Matrix::value_type>, |
| matrix_property_map<Graph, Key, Matrix> > |
| { |
| // abstract the indexing keys |
| typedef typename detail::choose_indexer<Graph, Key>::indexer_type indexer_type; |
| |
| // aliases for the nested container and its corresponding map |
| typedef typename Matrix::value_type container_type; |
| typedef container_property_map<Graph, Key, container_type> map_type; |
| |
| typedef Key key_type; |
| |
| // This property map doesn't really provide access to nested containers, |
| // but returns property maps over them. Since property maps are all |
| // copy-constructible (or should be anyways), we never return references. |
| // As such, this property is only readable, but not writable. Curiously, |
| // the inner property map is actually an lvalue pmap. |
| typedef map_type value_type; |
| typedef map_type reference; |
| typedef readable_property_map_tag category; |
| |
| matrix_property_map() |
| : m_matrix(0), m_graph(0) |
| { } |
| |
| matrix_property_map(Matrix& m, const Graph& g) |
| : m_matrix(&m), m_graph(const_cast<Graph*>(&g)) |
| { } |
| |
| matrix_property_map(const matrix_property_map& x) |
| : m_matrix(x.m_matrix), m_graph(x.m_graph) |
| { } |
| |
| inline reference operator [](key_type k) const |
| { |
| typedef typename indexer_type::value_type Index; |
| Index x = indexer_type::index(k, *m_graph); |
| return map_type((*m_matrix)[x], *m_graph); |
| } |
| |
| private: |
| mutable Matrix* m_matrix; |
| mutable Graph* m_graph; |
| }; |
| } |
| |
| #endif |