Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2005-2012 Joel de Guzman
|
Chris@16
|
3 Copyright (c) 2005-2006 Dan Marsden
|
Chris@16
|
4
|
Chris@16
|
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 ==============================================================================*/
|
Chris@16
|
8 #if !defined(BOOST_FUSION_DEQUE_ITERATOR_26112006_2154)
|
Chris@16
|
9 #define BOOST_FUSION_DEQUE_ITERATOR_26112006_2154
|
Chris@16
|
10
|
Chris@101
|
11 #include <boost/fusion/support/config.hpp>
|
Chris@16
|
12 #include <boost/fusion/iterator/iterator_facade.hpp>
|
Chris@16
|
13 #include <boost/fusion/container/deque/detail/keyed_element.hpp>
|
Chris@101
|
14 #include <boost/mpl/int.hpp>
|
Chris@16
|
15 #include <boost/mpl/minus.hpp>
|
Chris@16
|
16 #include <boost/mpl/equal_to.hpp>
|
Chris@101
|
17 #include <boost/mpl/identity.hpp>
|
Chris@101
|
18 #include <boost/mpl/if.hpp>
|
Chris@16
|
19 #include <boost/type_traits/is_const.hpp>
|
Chris@101
|
20 #include <boost/type_traits/add_const.hpp>
|
Chris@101
|
21 #include <boost/type_traits/add_reference.hpp>
|
Chris@16
|
22
|
Chris@16
|
23 namespace boost { namespace fusion {
|
Chris@16
|
24
|
Chris@16
|
25 struct bidirectional_traversal_tag;
|
Chris@16
|
26
|
Chris@16
|
27 template <typename Seq, int Pos>
|
Chris@16
|
28 struct deque_iterator
|
Chris@16
|
29 : iterator_facade<deque_iterator<Seq, Pos>, bidirectional_traversal_tag>
|
Chris@16
|
30 {
|
Chris@16
|
31 typedef Seq sequence;
|
Chris@16
|
32 typedef mpl::int_<Pos> index;
|
Chris@16
|
33
|
Chris@101
|
34 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
35 deque_iterator(Seq& seq)
|
Chris@16
|
36 : seq_(seq)
|
Chris@16
|
37 {}
|
Chris@16
|
38
|
Chris@16
|
39 template<typename Iterator>
|
Chris@16
|
40 struct value_of
|
Chris@16
|
41 : detail::keyed_element_value_at<
|
Chris@16
|
42 typename Iterator::sequence, typename Iterator::index>
|
Chris@16
|
43 {};
|
Chris@16
|
44
|
Chris@16
|
45 template<typename Iterator>
|
Chris@16
|
46 struct deref
|
Chris@16
|
47 {
|
Chris@16
|
48 typedef typename detail::keyed_element_value_at<
|
Chris@16
|
49 typename Iterator::sequence, typename Iterator::index>::type element_type;
|
Chris@16
|
50
|
Chris@16
|
51 typedef typename add_reference<
|
Chris@16
|
52 typename mpl::eval_if<
|
Chris@16
|
53 is_const<typename Iterator::sequence>,
|
Chris@16
|
54 add_const<element_type>,
|
Chris@16
|
55 mpl::identity<element_type> >::type>::type type;
|
Chris@16
|
56
|
Chris@101
|
57 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
58 static type
|
Chris@16
|
59 call(Iterator const& it)
|
Chris@16
|
60 {
|
Chris@16
|
61 return it.seq_.get(typename Iterator::index());
|
Chris@16
|
62 }
|
Chris@16
|
63 };
|
Chris@16
|
64
|
Chris@16
|
65 template <typename Iterator, typename N>
|
Chris@16
|
66 struct advance
|
Chris@16
|
67 {
|
Chris@16
|
68 typedef typename Iterator::index index;
|
Chris@16
|
69 typedef typename Iterator::sequence sequence;
|
Chris@16
|
70 typedef deque_iterator<sequence, index::value + N::value> type;
|
Chris@16
|
71
|
Chris@101
|
72 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
73 static type
|
Chris@16
|
74 call(Iterator const& i)
|
Chris@16
|
75 {
|
Chris@16
|
76 return type(i.seq_);
|
Chris@16
|
77 }
|
Chris@16
|
78 };
|
Chris@16
|
79
|
Chris@16
|
80 template<typename Iterator>
|
Chris@16
|
81 struct next
|
Chris@16
|
82 : advance<Iterator, mpl::int_<1> >
|
Chris@16
|
83 {};
|
Chris@16
|
84
|
Chris@16
|
85 template<typename Iterator>
|
Chris@16
|
86 struct prior
|
Chris@16
|
87 : advance<Iterator, mpl::int_<-1> >
|
Chris@16
|
88 {};
|
Chris@16
|
89
|
Chris@16
|
90 template <typename I1, typename I2>
|
Chris@16
|
91 struct distance : mpl::minus<typename I2::index, typename I1::index>
|
Chris@16
|
92 {
|
Chris@16
|
93 typedef typename
|
Chris@16
|
94 mpl::minus<
|
Chris@16
|
95 typename I2::index, typename I1::index
|
Chris@16
|
96 >::type
|
Chris@16
|
97 type;
|
Chris@16
|
98
|
Chris@101
|
99 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
100 static type
|
Chris@16
|
101 call(I1 const&, I2 const&)
|
Chris@16
|
102 {
|
Chris@16
|
103 return type();
|
Chris@16
|
104 }
|
Chris@16
|
105 };
|
Chris@16
|
106
|
Chris@16
|
107 template<typename I1, typename I2>
|
Chris@16
|
108 struct equal_to
|
Chris@16
|
109 : mpl::equal_to<typename I1::index, typename I2::index>
|
Chris@16
|
110 {};
|
Chris@16
|
111
|
Chris@16
|
112 Seq& seq_;
|
Chris@16
|
113
|
Chris@16
|
114 private:
|
Chris@16
|
115 // silence MSVC warning C4512: assignment operator could not be generated
|
Chris@16
|
116 deque_iterator& operator= (deque_iterator const&);
|
Chris@16
|
117 };
|
Chris@16
|
118
|
Chris@16
|
119 }}
|
Chris@16
|
120
|
Chris@101
|
121 #ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408
|
Chris@101
|
122 namespace std
|
Chris@101
|
123 {
|
Chris@101
|
124 template <typename Seq, int Pos>
|
Chris@101
|
125 struct iterator_traits< ::boost::fusion::deque_iterator<Seq, Pos> >
|
Chris@101
|
126 { };
|
Chris@101
|
127 }
|
Chris@16
|
128 #endif
|
Chris@101
|
129
|
Chris@101
|
130 #endif
|