]> git.lyx.org Git - lyx.git/blob - boost/boost/property_map_iterator.hpp
fix reading the author field.
[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/iterator_adaptor.hpp>
14 #include <boost/mpl/if.hpp>
15 #include <boost/type_traits/is_same.hpp>
16
17 namespace boost {
18
19   //======================================================================
20   // property iterator, generalized from ideas by François Faure
21
22   namespace detail {
23
24     template <class Iterator, class LvaluePropertyMap>
25     class lvalue_pmap_iter
26       : public iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >,
27                                  Iterator,
28                                  typename property_traits<LvaluePropertyMap>::value_type,
29                                  use_default,
30                                  typename property_traits<LvaluePropertyMap>::reference>
31     {
32       friend class boost::iterator_core_access;
33
34       typedef iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >,
35                                 Iterator,
36                                 typename property_traits<LvaluePropertyMap>::value_type,
37                                 use_default,
38                                 typename property_traits<LvaluePropertyMap>::reference> super_t;
39
40     public:
41       lvalue_pmap_iter() { }
42       lvalue_pmap_iter(Iterator const&     it,
43                        LvaluePropertyMap m)
44         : super_t(it),
45           m_map(m) {}
46
47     private:
48       typename lvalue_pmap_iter::reference
49       dereference() const
50       {
51         return m_map[*(this->base_reference())];
52       }
53
54       LvaluePropertyMap m_map;
55     };
56
57     template <class Iterator, class ReadablePropertyMap>
58     class readable_pmap_iter :
59       public iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >,
60                                Iterator,
61                                typename property_traits<ReadablePropertyMap>::value_type,
62                                use_default,
63                                typename property_traits<ReadablePropertyMap>::value_type>
64
65
66     {
67       friend class iterator_core_access;
68
69       typedef iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >,
70                                 Iterator,
71                                 typename property_traits<ReadablePropertyMap>::value_type,
72                                 use_default,
73                                 typename property_traits<ReadablePropertyMap>::value_type> super_t;
74
75     public:
76       readable_pmap_iter() { }
77       readable_pmap_iter(Iterator const&     it,
78                          ReadablePropertyMap m)
79         : super_t(it),
80           m_map(m) {}
81
82     private:
83       typename readable_pmap_iter::reference
84       dereference() const
85       {
86         return get(m_map, *(this->base_reference()));
87       }
88
89       ReadablePropertyMap m_map;
90     };
91
92
93   } // namespace detail
94
95   template <class PropertyMap, class Iterator>
96   struct property_map_iterator_generator :
97     mpl::if_< is_same< typename property_traits<PropertyMap>::category, lvalue_property_map_tag>,
98               detail::lvalue_pmap_iter<Iterator, PropertyMap>,
99               detail::readable_pmap_iter<Iterator, PropertyMap> >
100   {};
101
102   template <class PropertyMap, class Iterator>
103   typename property_map_iterator_generator<PropertyMap, Iterator>::type
104   make_property_map_iterator(PropertyMap pmap, Iterator iter)
105   {
106     typedef typename property_map_iterator_generator<PropertyMap, 
107       Iterator>::type Iter;
108     return Iter(iter, pmap);
109   }
110
111 } // namespace boost
112
113 #endif // BOOST_PROPERTY_MAP_ITERATOR_HPP
114