Chris@16: // Copyright (C) Vladimir Prus 2003. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // See http://www.boost.org/libs/graph/vector_property_map.html for Chris@16: // documentation. Chris@16: // Chris@16: Chris@16: #ifndef VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04 Chris@16: #define VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04 Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: template Chris@16: class vector_property_map Chris@16: : public boost::put_get_helper< Chris@16: typename std::iterator_traits< Chris@16: typename std::vector::iterator >::reference, Chris@16: vector_property_map > Chris@16: { Chris@16: public: Chris@16: typedef typename property_traits::key_type key_type; Chris@16: typedef T value_type; Chris@16: typedef typename std::iterator_traits< Chris@16: typename std::vector::iterator >::reference reference; Chris@16: typedef boost::lvalue_property_map_tag category; Chris@16: Chris@16: vector_property_map(const IndexMap& index = IndexMap()) Chris@16: : store(new std::vector()), index(index) Chris@16: {} Chris@16: Chris@16: vector_property_map(unsigned initial_size, Chris@16: const IndexMap& index = IndexMap()) Chris@16: : store(new std::vector(initial_size)), index(index) Chris@16: {} Chris@16: Chris@16: typename std::vector::iterator storage_begin() Chris@16: { Chris@16: return store->begin(); Chris@16: } Chris@16: Chris@16: typename std::vector::iterator storage_end() Chris@16: { Chris@16: return store->end(); Chris@16: } Chris@16: Chris@16: typename std::vector::const_iterator storage_begin() const Chris@16: { Chris@16: return store->begin(); Chris@16: } Chris@16: Chris@16: typename std::vector::const_iterator storage_end() const Chris@16: { Chris@16: return store->end(); Chris@16: } Chris@16: Chris@16: IndexMap& get_index_map() { return index; } Chris@16: const IndexMap& get_index_map() const { return index; } Chris@16: Chris@16: public: Chris@16: // Copy ctor absent, default semantics is OK. Chris@16: // Assignment operator absent, default semantics is OK. Chris@16: // CONSIDER: not sure that assignment to 'index' is correct. Chris@16: Chris@16: reference operator[](const key_type& v) const { Chris@16: typename property_traits::value_type i = get(index, v); Chris@16: if (static_cast(i) >= store->size()) { Chris@16: store->resize(i + 1, T()); Chris@16: } Chris@16: return (*store)[i]; Chris@16: } Chris@16: private: Chris@16: // Conceptually, we have a vector of infinite size. For practical Chris@16: // purposes, we start with an empty vector and grow it as needed. Chris@16: // Note that we cannot store pointer to vector here -- we cannot Chris@16: // store pointer to data, because if copy of property map resizes Chris@16: // the vector, the pointer to data will be invalidated. Chris@16: // I wonder if class 'pmap_ref' is simply needed. Chris@16: shared_ptr< std::vector > store; Chris@16: IndexMap index; Chris@16: }; Chris@16: Chris@16: template Chris@16: vector_property_map Chris@16: make_vector_property_map(IndexMap index) Chris@16: { Chris@16: return vector_property_map(index); Chris@16: } Chris@16: } Chris@16: Chris@16: #ifdef BOOST_GRAPH_USE_MPI Chris@101: #include Chris@101: #endif Chris@16: Chris@16: #endif