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