1 2 #ifndef BOOST_MPL_AUX_VECTOR_ITERATOR_HPP_INCLUDED 3 #define BOOST_MPL_AUX_VECTOR_ITERATOR_HPP_INCLUDED 4 5 // Copyright Aleksey Gurtovoy 2000-2004 6 // 7 // Distributed under the Boost Software License, Version 1.0. 8 // (See accompanying file LICENSE_1_0.txt or copy at 9 // http://www.boost.org/LICENSE_1_0.txt) 10 // 11 // See http://www.boost.org/libs/mpl for documentation. 12 13 // $Id: iterator.hpp 49267 2008-10-11 06:19:02Z agurtovoy $ 14 // $Date: 2008-10-10 23:19:02 -0700 (Fri, 10 Oct 2008) $ 15 // $Revision: 49267 $ 16 17 #include <boost/mpl/vector/aux_/at.hpp> 18 #include <boost/mpl/iterator_tags.hpp> 19 #include <boost/mpl/plus.hpp> 20 #include <boost/mpl/minus.hpp> 21 #include <boost/mpl/advance_fwd.hpp> 22 #include <boost/mpl/distance_fwd.hpp> 23 #include <boost/mpl/next.hpp> 24 #include <boost/mpl/prior.hpp> 25 #include <boost/mpl/aux_/nttp_decl.hpp> 26 #include <boost/mpl/aux_/value_wknd.hpp> 27 #include <boost/mpl/aux_/config/ctps.hpp> 28 #include <boost/mpl/aux_/config/workaround.hpp> 29 30 namespace boost { namespace mpl { 31 32 template< 33 typename Vector 34 , BOOST_MPL_AUX_NTTP_DECL(long, n_) 35 > 36 struct v_iter 37 { 38 typedef aux::v_iter_tag tag; 39 typedef random_access_iterator_tag category; 40 typedef typename v_at<Vector,n_>::type type; 41 42 typedef Vector vector_; 43 typedef mpl::long_<n_> pos; 44 45 #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) 46 enum { 47 next_ = n_ + 1 48 , prior_ = n_ - 1 49 , pos_ = n_ 50 }; 51 52 typedef v_iter<Vector,next_> next; 53 typedef v_iter<Vector,prior_> prior; 54 #endif 55 56 }; 57 58 59 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) 60 61 template< 62 typename Vector 63 , BOOST_MPL_AUX_NTTP_DECL(long, n_) 64 > 65 struct next< v_iter<Vector,n_> > 66 { 67 typedef v_iter<Vector,(n_ + 1)> type; 68 }; 69 70 template< 71 typename Vector 72 , BOOST_MPL_AUX_NTTP_DECL(long, n_) 73 > 74 struct prior< v_iter<Vector,n_> > 75 { 76 typedef v_iter<Vector,(n_ - 1)> type; 77 }; 78 79 template< 80 typename Vector 81 , BOOST_MPL_AUX_NTTP_DECL(long, n_) 82 , typename Distance 83 > 84 struct advance< v_iter<Vector,n_>,Distance> 85 { 86 typedef v_iter< 87 Vector 88 , (n_ + BOOST_MPL_AUX_NESTED_VALUE_WKND(long, Distance)) 89 > type; 90 }; 91 92 template< 93 typename Vector 94 , BOOST_MPL_AUX_NTTP_DECL(long, n_) 95 , BOOST_MPL_AUX_NTTP_DECL(long, m_) 96 > 97 struct distance< v_iter<Vector,n_>, v_iter<Vector,m_> > 98 : mpl::long_<(m_ - n_)> 99 { 100 }; 101 102 #else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION 103 104 template<> struct advance_impl<aux::v_iter_tag> 105 { 106 template< typename Iterator, typename N > struct apply 107 { 108 enum { pos_ = Iterator::pos_, n_ = N::value }; 109 typedef v_iter< 110 typename Iterator::vector_ 111 , (pos_ + n_) 112 > type; 113 }; 114 }; 115 116 template<> struct distance_impl<aux::v_iter_tag> 117 { 118 template< typename Iter1, typename Iter2 > struct apply 119 { 120 enum { pos1_ = Iter1::pos_, pos2_ = Iter2::pos_ }; 121 typedef long_<( pos2_ - pos1_ )> type; 122 BOOST_STATIC_CONSTANT(long, value = ( pos2_ - pos1_ )); 123 }; 124 }; 125 126 #endif 127 128 }} 129 130 #endif // BOOST_MPL_AUX_VECTOR_ITERATOR_HPP_INCLUDED 131