// (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 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 struct matrix_property_map : boost::put_get_helper< container_property_map, matrix_property_map > { // abstract the indexing keys typedef typename detail::choose_indexer::indexer_type indexer_type; // aliases for the nested container and its corresponding map typedef typename Matrix::value_type container_type; typedef container_property_map 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(&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