]> git.lyx.org Git - lyx.git/blob - boost/boost/property_map_iterator.hpp
LFUN_ESCAPE gets ReadOnly (fix bug 1142)
[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 //  See http://www.boost.org/libs/property_map for documentation.
8
9 #ifndef BOOST_PROPERTY_MAP_ITERATOR_HPP
10 #define BOOST_PROPERTY_MAP_ITERATOR_HPP
11
12 #include <boost/property_map.hpp>
13 #include <boost/iterator_adaptors.hpp>
14
15 namespace boost {
16
17   //======================================================================
18   // property iterator, generalized from ideas by François Faure
19
20   namespace detail {
21
22     template <class LvaluePropertyMap>
23     struct lvalue_pmap_iter_policies : public default_iterator_policies
24     {
25       lvalue_pmap_iter_policies() { }
26       lvalue_pmap_iter_policies(LvaluePropertyMap m) : m_map(m) {}
27
28       template <class Iter>
29       typename Iter::reference
30       dereference(const Iter& i) const 
31       {
32         return m_map[*i.base()];
33       }
34     private:
35       LvaluePropertyMap m_map;
36     };
37
38     template <class ReadablePropertyMap>
39     struct readable_pmap_iter_policies : public default_iterator_policies
40     {
41       readable_pmap_iter_policies() { }
42       readable_pmap_iter_policies(ReadablePropertyMap m) : m_map(m) {}
43
44       template <class Iter>
45       typename Iter::reference
46       dereference(const Iter& i) const 
47       {
48         return get(m_map, *i.base());
49       }
50     private:
51       ReadablePropertyMap m_map;
52     };
53
54     template <class PMapCategory>
55     struct choose_pmap_iter {
56       template <class PMap, class Iter>
57       struct bind_ {     
58         typedef typename property_traits<PMap>::value_type value;
59         typedef iterator_adaptor<Iter,
60           readable_pmap_iter_policies<PMap>, value, value,
61           value*, std::input_iterator_tag> type;
62       };
63     };
64
65     template <>
66     struct choose_pmap_iter<lvalue_property_map_tag> {
67       template <class PMap, class Iter>
68       struct bind_ {
69         typedef typename property_traits<PMap>::value_type value;
70         typedef typename property_traits<PMap>::reference ref;
71         typedef iterator_adaptor<Iter,
72           lvalue_pmap_iter_policies<PMap>,
73           value, ref> type;
74       };
75     };
76     
77   } // namespace detail
78
79   template <class PropertyMap, class Iterator>
80   class property_map_iterator_generator {
81   public:
82     typedef typename property_traits<PropertyMap>::category Cat; 
83     typedef typename detail::choose_pmap_iter<Cat>::
84       template bind_<PropertyMap, Iterator>::type type;
85   };
86
87   template <class PropertyMap, class Iterator>
88   typename property_map_iterator_generator<PropertyMap, Iterator>::type
89   make_property_map_iterator(PropertyMap pmap, Iterator iter)
90   {
91     typedef typename property_map_iterator_generator<PropertyMap, 
92       Iterator>::type Iter;
93     return Iter(iter, pmap);
94   }
95
96 } // namespace boost
97
98 #endif // BOOST_PROPERTY_MAP_ITERATOR_HPP
99