]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/spirit/home/karma/detail/indirect_iterator.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / spirit / home / karma / detail / indirect_iterator.hpp
1 // Copyright (c) 2001-2011 Hartmut Kaiser
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 #if !defined(SPIRIT_KARMA_INDIRECT_ITERATOR_JAN_19_2011_0814PM)
7 #define SPIRIT_KARMA_INDIRECT_ITERATOR_JAN_19_2011_0814PM
8
9 #if defined(_MSC_VER)
10 #pragma once
11 #endif
12
13 #include <boost/spirit/home/support/unused.hpp>
14 #include <boost/iterator/iterator_facade.hpp>
15
16 ///////////////////////////////////////////////////////////////////////////////
17 namespace boost { namespace spirit { namespace karma { namespace detail
18 {
19 ///////////////////////////////////////////////////////////////////////
20 // This is a wrapper for any iterator allowing to pass a reference of it
21 // to the components of the sequence
22 template <typename Iterator>
23 class indirect_iterator
24 : public boost::iterator_facade<
25 indirect_iterator<Iterator>
26 , typename boost::detail::iterator_traits<Iterator>::value_type
27 , boost::forward_traversal_tag
28 , typename boost::detail::iterator_traits<Iterator>::reference>
29 {
30 typedef typename boost::detail::iterator_traits<Iterator>::value_type
31 base_value_type;
32 typedef typename boost::detail::iterator_traits<Iterator>::reference
33 base_reference_type;
34
35 typedef boost::iterator_facade<
36 indirect_iterator<Iterator>, base_value_type
37 , boost::forward_traversal_tag, base_reference_type
38 > base_type;
39
40 public:
41 indirect_iterator(Iterator& iter)
42 : iter_(&iter)
43 {}
44 indirect_iterator(indirect_iterator const& iter)
45 : iter_(iter.iter_)
46 {}
47
48 private:
49 friend class boost::iterator_core_access;
50
51 void increment()
52 {
53 ++*iter_;
54 }
55
56 bool equal(indirect_iterator const& other) const
57 {
58 return *iter_ == *other.iter_;
59 }
60
61 base_reference_type dereference() const
62 {
63 return **iter_;
64 }
65
66 private:
67 Iterator* iter_;
68 };
69 }}}}
70
71 ///////////////////////////////////////////////////////////////////////////////
72 namespace boost { namespace spirit { namespace traits
73 {
74 template <typename Iterator>
75 struct make_indirect_iterator
76 {
77 typedef karma::detail::indirect_iterator<Iterator> type;
78 };
79
80 template <typename Iterator>
81 struct make_indirect_iterator<karma::detail::indirect_iterator<Iterator> >
82 {
83 typedef karma::detail::indirect_iterator<Iterator> type;
84 };
85
86 template <>
87 struct make_indirect_iterator<unused_type const*>
88 {
89 typedef unused_type const* type;
90 };
91
92 template <typename Iterator>
93 struct make_indirect_iterator<Iterator const&>
94 : make_indirect_iterator<Iterator const>
95 {};
96 }}}
97
98 #endif