1 /*=============================================================================
2 Copyright (c) 2005-2011 Joel de Guzman
3 Copyright (c) 2005-2006 Dan Marsden
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 ==============================================================================*/
8 #if !defined(BOOST_FUSION_DEQUE_ITERATOR_26112006_2154)
9 #define BOOST_FUSION_DEQUE_ITERATOR_26112006_2154
11 #include <boost/fusion/iterator/iterator_facade.hpp>
12 #include <boost/fusion/container/deque/detail/keyed_element.hpp>
13 #include <boost/mpl/minus.hpp>
14 #include <boost/mpl/equal_to.hpp>
15 #include <boost/type_traits/is_const.hpp>
17 namespace boost { namespace fusion {
19 struct bidirectional_traversal_tag;
21 template<typename Seq, int Pos>
23 : iterator_facade<deque_iterator<Seq, Pos>, bidirectional_traversal_tag>
26 typedef mpl::int_<Pos> index;
28 deque_iterator(Seq& seq)
32 template<typename Iterator>
34 : detail::keyed_element_value_at<
35 typename Iterator::sequence, typename Iterator::index>
38 template<typename Iterator>
41 typedef typename detail::keyed_element_value_at<
42 typename Iterator::sequence, typename Iterator::index>::type element_type;
44 typedef typename add_reference<
45 typename mpl::eval_if<
46 is_const<typename Iterator::sequence>,
47 add_const<element_type>,
48 mpl::identity<element_type> >::type>::type type;
51 call(Iterator const& it)
53 return it.seq_.get(typename Iterator::index());
57 template <typename Iterator, typename N>
60 typedef typename Iterator::index index;
61 typedef typename Iterator::sequence sequence;
62 typedef deque_iterator<sequence, index::value + N::value> type;
65 call(Iterator const& i)
71 template<typename Iterator>
73 : advance<Iterator, mpl::int_<1> >
76 template<typename Iterator>
78 : advance<Iterator, mpl::int_<-1> >
81 template <typename I1, typename I2>
82 struct distance : mpl::minus<typename I2::index, typename I1::index>
86 typename I2::index, typename I1::index
91 call(I1 const&, I2 const&)
97 template<typename I1, typename I2>
99 : mpl::equal_to<typename I1::index, typename I2::index>
105 // silence MSVC warning C4512: assignment operator could not be generated
106 deque_iterator& operator= (deque_iterator const&);