epoc32/include/stdapis/boost/vector_property_map.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
// Copyright (C) Vladimir Prus 2003.
williamr@2
     2
// Distributed under the Boost Software License, Version 1.0. (See
williamr@2
     3
// accompanying file LICENSE_1_0.txt or copy at
williamr@2
     4
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
     5
//
williamr@2
     6
// See http://www.boost.org/libs/graph/vector_property_map.html for
williamr@2
     7
// documentation.
williamr@2
     8
//
williamr@2
     9
williamr@2
    10
#ifndef VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04
williamr@2
    11
#define VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04
williamr@2
    12
williamr@2
    13
#include <boost/property_map.hpp>
williamr@2
    14
#include <boost/shared_ptr.hpp>
williamr@2
    15
#include <vector>
williamr@2
    16
williamr@2
    17
namespace boost {
williamr@2
    18
    template<typename T, typename IndexMap = identity_property_map>
williamr@2
    19
    class vector_property_map
williamr@2
    20
        : public boost::put_get_helper< 
williamr@2
    21
              typename std::iterator_traits< 
williamr@2
    22
                  typename std::vector<T>::iterator >::reference,
williamr@2
    23
              vector_property_map<T, IndexMap> >
williamr@2
    24
    {
williamr@2
    25
    public:
williamr@2
    26
        typedef typename property_traits<IndexMap>::key_type  key_type;
williamr@2
    27
        typedef T value_type;
williamr@2
    28
        typedef typename std::iterator_traits< 
williamr@2
    29
            typename std::vector<T>::iterator >::reference reference;
williamr@2
    30
        typedef boost::lvalue_property_map_tag category;
williamr@2
    31
        
williamr@2
    32
        vector_property_map(const IndexMap& index = IndexMap())
williamr@2
    33
        : store(new std::vector<T>()), index(index)
williamr@2
    34
        {}
williamr@2
    35
williamr@2
    36
        vector_property_map(unsigned initial_size, 
williamr@2
    37
                            const IndexMap& index = IndexMap())
williamr@2
    38
        : store(new std::vector<T>(initial_size)), index(index)
williamr@2
    39
        {}
williamr@2
    40
williamr@2
    41
        typename std::vector<T>::iterator storage_begin()
williamr@2
    42
        {
williamr@2
    43
            return store->begin();
williamr@2
    44
        }
williamr@2
    45
williamr@2
    46
        typename std::vector<T>::iterator storage_end()
williamr@2
    47
        {
williamr@2
    48
            return store->end();
williamr@2
    49
        }
williamr@2
    50
williamr@2
    51
        typename std::vector<T>::const_iterator storage_begin() const
williamr@2
    52
        {
williamr@2
    53
            return store->begin();
williamr@2
    54
        }
williamr@2
    55
williamr@2
    56
        typename std::vector<T>::const_iterator storage_end() const
williamr@2
    57
        {
williamr@2
    58
            return store->end();
williamr@2
    59
        }
williamr@2
    60
                           
williamr@2
    61
    public:
williamr@2
    62
        // Copy ctor absent, default semantics is OK.
williamr@2
    63
        // Assignment operator absent, default semantics is OK.
williamr@2
    64
        // CONSIDER: not sure that assignment to 'index' is correct.
williamr@2
    65
        
williamr@2
    66
        reference operator[](const key_type& v) const {
williamr@2
    67
            typename property_traits<IndexMap>::value_type i = get(index, v);
williamr@2
    68
            if (static_cast<unsigned>(i) >= store->size()) {
williamr@2
    69
                store->resize(i + 1, T());
williamr@2
    70
            }
williamr@2
    71
            return (*store)[i];
williamr@2
    72
        }
williamr@2
    73
    private:
williamr@2
    74
        // Conceptually, we have a vector of infinite size. For practical 
williamr@2
    75
        // purposes, we start with an empty vector and grow it as needed.
williamr@2
    76
        // Note that we cannot store pointer to vector here -- we cannot
williamr@2
    77
        // store pointer to data, because if copy of property map resizes
williamr@2
    78
        // the vector, the pointer to data will be invalidated. 
williamr@2
    79
        // I wonder if class 'pmap_ref' is simply needed.
williamr@2
    80
        shared_ptr< std::vector<T> > store;        
williamr@2
    81
        IndexMap index;
williamr@2
    82
    };
williamr@2
    83
    
williamr@2
    84
    template<typename T, typename IndexMap>
williamr@2
    85
    vector_property_map<T, IndexMap>
williamr@2
    86
    make_vector_property_map(IndexMap index)
williamr@2
    87
    {
williamr@2
    88
        return vector_property_map<T, IndexMap>(index);
williamr@2
    89
    }
williamr@2
    90
}
williamr@2
    91
williamr@2
    92
#endif