]> git.lyx.org Git - lyx.git/blob - boost/boost/property_map_iterator.hpp
complie fix
[lyx.git] / boost / boost / property_map_iterator.hpp
1 // (C) Copyright Jeremy Siek, 2001. Permission to copy, use, modify,
2 // sell and distribute this software is granted provided this
3 // copyright notice appears in all copies. This software is provided
4 // "as is" without express or implied warranty, and with no claim as
5 // to its suitability for any purpose.
6
7 #ifndef BOOST_PROPERTY_MAP_ITERATOR_HPP
8 #define BOOST_PROPERTY_MAP_ITERATOR_HPP
9
10 #include <boost/property_map.hpp>
11 #include <boost/iterator_adaptors.hpp>
12
13 namespace boost {
14
15   //======================================================================
16   // property iterator, generalized from ideas by François Faure
17
18   namespace detail {
19
20     template <class LvaluePropertyMap>
21     struct lvalue_pmap_iter_policies : public default_iterator_policies
22     {
23       lvalue_pmap_iter_policies() { }
24       lvalue_pmap_iter_policies(LvaluePropertyMap m) : m_map(m) {}
25
26       template <class Iter>
27       typename Iter::reference
28       dereference(const Iter& i) const 
29       {
30         return m_map[*i.base()];
31       }
32     private:
33       LvaluePropertyMap m_map;
34     };
35
36     template <class ReadablePropertyMap>
37     struct readable_pmap_iter_policies : public default_iterator_policies
38     {
39       readable_pmap_iter_policies() { }
40       readable_pmap_iter_policies(ReadablePropertyMap m) : m_map(m) {}
41
42       template <class Iter>
43       typename Iter::reference
44       dereference(const Iter& i) const 
45       {
46         return get(m_map, *i.base());
47       }
48     private:
49       ReadablePropertyMap m_map;
50     };
51
52     template <class PMapCategory>
53     struct choose_pmap_iter {
54       template <class PMap, class Iter>
55       struct bind_ {     
56         typedef typename property_traits<PMap>::value_type value;
57         typedef iterator_adaptor<Iter,
58           readable_pmap_iter_policies<PMap>, value, value,
59           value*, std::input_iterator_tag> type;
60       };
61     };
62
63     template <>
64     struct choose_pmap_iter<lvalue_property_map_tag> {
65       template <class PMap, class Iter>
66       struct bind_ {
67         typedef typename property_traits<PMap>::value_type value;
68         typedef typename property_traits<PMap>::reference ref;
69         typedef iterator_adaptor<Iter,
70           lvalue_pmap_iter_policies<PMap>,
71           value, ref> type;
72       };
73     };
74     
75   } // namespace detail
76
77   template <class PropertyMap, class Iterator>
78   class property_map_iterator_generator {
79   public:
80     typedef typename property_traits<PropertyMap>::category Cat; 
81     typedef typename detail::choose_pmap_iter<Cat>::
82       template bind_<PropertyMap, Iterator>::type type;
83   };
84
85   template <class PropertyMap, class Iterator>
86   typename property_map_iterator_generator<PropertyMap, Iterator>::type
87   make_property_map_iterator(PropertyMap pmap, Iterator iter)
88   {
89     typedef typename property_map_iterator_generator<PropertyMap, 
90       Iterator>::type Iter;
91     return Iter(iter, pmap);
92   }
93
94 } // namespace boost
95
96 #endif // BOOST_PROPERTY_MAP_ITERATOR_HPP
97