]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/spirit/home/karma/detail/indirect_iterator.hpp
bump version to 18.2.2-pve1
[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 #ifndef BOOST_SPIRIT_KARMA_DETAIL_INDIRECT_ITERATOR_HPP
7 #define BOOST_SPIRIT_KARMA_DETAIL_INDIRECT_ITERATOR_HPP
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 #include <iterator> // for std::iterator_traits
16
17 ///////////////////////////////////////////////////////////////////////////////
18 namespace boost { namespace spirit { namespace karma { namespace detail
19 {
20 ///////////////////////////////////////////////////////////////////////
21 // This is a wrapper for any iterator allowing to pass a reference of it
22 // to the components of the sequence
23 template <typename Iterator>
24 class indirect_iterator
25 : public boost::iterator_facade<
26 indirect_iterator<Iterator>
27 , typename std::iterator_traits<Iterator>::value_type
28 , boost::forward_traversal_tag
29 , typename std::iterator_traits<Iterator>::reference>
30 {
31 typedef typename std::iterator_traits<Iterator>::value_type
32 base_value_type;
33 typedef typename std::iterator_traits<Iterator>::reference
34 base_reference_type;
35
36 typedef boost::iterator_facade<
37 indirect_iterator<Iterator>, base_value_type
38 , boost::forward_traversal_tag, base_reference_type
39 > base_type;
40
41 public:
42 indirect_iterator(Iterator& iter)
43 : iter_(&iter)
44 {}
45 indirect_iterator(indirect_iterator const& iter)
46 : iter_(iter.iter_)
47 {}
48
49 private:
50 friend class boost::iterator_core_access;
51
52 void increment()
53 {
54 ++*iter_;
55 }
56
57 bool equal(indirect_iterator const& other) const
58 {
59 return *iter_ == *other.iter_;
60 }
61
62 base_reference_type dereference() const
63 {
64 return **iter_;
65 }
66
67 private:
68 Iterator* iter_;
69 };
70 }}}}
71
72 ///////////////////////////////////////////////////////////////////////////////
73 namespace boost { namespace spirit { namespace traits
74 {
75 template <typename Iterator>
76 struct make_indirect_iterator
77 {
78 typedef karma::detail::indirect_iterator<Iterator> type;
79 };
80
81 template <typename Iterator>
82 struct make_indirect_iterator<karma::detail::indirect_iterator<Iterator> >
83 {
84 typedef karma::detail::indirect_iterator<Iterator> type;
85 };
86
87 template <>
88 struct make_indirect_iterator<unused_type const*>
89 {
90 typedef unused_type const* type;
91 };
92
93 template <typename Iterator>
94 struct make_indirect_iterator<Iterator const&>
95 : make_indirect_iterator<Iterator const>
96 {};
97 }}}
98
99 #endif