ossrv_pub/boost_apis/boost/vector_property_map.hpp
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ossrv_pub/boost_apis/boost/vector_property_map.hpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,92 @@
+// 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.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();
+        }
+                           
+    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);
+    }
+}
+
+#endif