epoc32/include/stdapis/boost/property_map_iterator.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@2
     1
// (C) Copyright Jeremy Siek, 2001.
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/property_map for documentation.
williamr@2
     7
williamr@2
     8
#ifndef BOOST_PROPERTY_MAP_ITERATOR_HPP
williamr@2
     9
#define BOOST_PROPERTY_MAP_ITERATOR_HPP
williamr@2
    10
williamr@2
    11
#include <boost/property_map.hpp>
williamr@2
    12
#include <boost/iterator/iterator_adaptor.hpp>
williamr@2
    13
#include <boost/mpl/if.hpp>
williamr@2
    14
#include <boost/type_traits/is_same.hpp>
williamr@2
    15
williamr@2
    16
namespace boost {
williamr@2
    17
williamr@2
    18
  //======================================================================
williamr@2
    19
  // property iterator, generalized from ideas by François Faure
williamr@2
    20
williamr@2
    21
  namespace detail {
williamr@2
    22
williamr@2
    23
    template <class Iterator, class LvaluePropertyMap>
williamr@2
    24
    class lvalue_pmap_iter
williamr@2
    25
      : public iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >,
williamr@2
    26
                                 Iterator,
williamr@2
    27
                                 typename property_traits<LvaluePropertyMap>::value_type,
williamr@2
    28
                                 use_default,
williamr@2
    29
                                 typename property_traits<LvaluePropertyMap>::reference>
williamr@2
    30
    {
williamr@2
    31
      friend class boost::iterator_core_access;
williamr@2
    32
williamr@2
    33
      typedef iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >,
williamr@2
    34
                                Iterator,
williamr@2
    35
                                typename property_traits<LvaluePropertyMap>::value_type,
williamr@2
    36
                                use_default,
williamr@2
    37
                                typename property_traits<LvaluePropertyMap>::reference> super_t;
williamr@2
    38
williamr@2
    39
    public:
williamr@2
    40
      lvalue_pmap_iter() { }
williamr@2
    41
      lvalue_pmap_iter(Iterator const&     it,
williamr@2
    42
                       LvaluePropertyMap m)
williamr@2
    43
        : super_t(it),
williamr@2
    44
          m_map(m) {}
williamr@2
    45
williamr@2
    46
    private:
williamr@2
    47
      typename super_t::reference
williamr@2
    48
      dereference() const
williamr@2
    49
      {
williamr@2
    50
        return m_map[*(this->base_reference())];
williamr@2
    51
      }
williamr@2
    52
williamr@2
    53
      LvaluePropertyMap m_map;
williamr@2
    54
    };
williamr@2
    55
williamr@2
    56
    template <class Iterator, class ReadablePropertyMap>
williamr@2
    57
    class readable_pmap_iter :
williamr@2
    58
      public iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >,
williamr@2
    59
                               Iterator,
williamr@2
    60
                               typename property_traits<ReadablePropertyMap>::value_type,
williamr@2
    61
                               use_default,
williamr@2
    62
                               typename property_traits<ReadablePropertyMap>::value_type>
williamr@2
    63
williamr@2
    64
williamr@2
    65
    {
williamr@2
    66
      friend class boost::iterator_core_access;
williamr@2
    67
williamr@2
    68
      typedef iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >,
williamr@2
    69
                                Iterator,
williamr@2
    70
                                typename property_traits<ReadablePropertyMap>::value_type,
williamr@2
    71
                                use_default,
williamr@2
    72
                                typename property_traits<ReadablePropertyMap>::value_type> super_t;
williamr@2
    73
williamr@2
    74
    public:
williamr@2
    75
      readable_pmap_iter() { }
williamr@2
    76
      readable_pmap_iter(Iterator const&     it,
williamr@2
    77
                         ReadablePropertyMap m)
williamr@2
    78
        : super_t(it),
williamr@2
    79
          m_map(m) {}
williamr@2
    80
williamr@2
    81
    private:
williamr@2
    82
      typename super_t::reference
williamr@2
    83
      dereference() const
williamr@2
    84
      {
williamr@2
    85
        return get(m_map, *(this->base_reference()));
williamr@2
    86
      }
williamr@2
    87
williamr@2
    88
      ReadablePropertyMap m_map;
williamr@2
    89
    };
williamr@2
    90
williamr@2
    91
williamr@2
    92
  } // namespace detail
williamr@2
    93
williamr@2
    94
  template <class PropertyMap, class Iterator>
williamr@2
    95
  struct property_map_iterator_generator :
williamr@2
    96
    mpl::if_< is_same< typename property_traits<PropertyMap>::category, lvalue_property_map_tag>,
williamr@2
    97
              detail::lvalue_pmap_iter<Iterator, PropertyMap>,
williamr@2
    98
              detail::readable_pmap_iter<Iterator, PropertyMap> >
williamr@2
    99
  {};
williamr@2
   100
williamr@2
   101
  template <class PropertyMap, class Iterator>
williamr@2
   102
  typename property_map_iterator_generator<PropertyMap, Iterator>::type
williamr@2
   103
  make_property_map_iterator(PropertyMap pmap, Iterator iter)
williamr@2
   104
  {
williamr@2
   105
    typedef typename property_map_iterator_generator<PropertyMap, 
williamr@2
   106
      Iterator>::type Iter;
williamr@2
   107
    return Iter(iter, pmap);
williamr@2
   108
  }
williamr@2
   109
williamr@2
   110
} // namespace boost
williamr@2
   111
williamr@2
   112
#endif // BOOST_PROPERTY_MAP_ITERATOR_HPP
williamr@2
   113