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 30namespace boost { namespace mpl { 31 32template< 33 typename Vector 34 , BOOST_MPL_AUX_NTTP_DECL(long, n_) 35 > 36struct 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 61template< 62 typename Vector 63 , BOOST_MPL_AUX_NTTP_DECL(long, n_) 64 > 65struct next< v_iter<Vector,n_> > 66{ 67 typedef v_iter<Vector,(n_ + 1)> type; 68}; 69 70template< 71 typename Vector 72 , BOOST_MPL_AUX_NTTP_DECL(long, n_) 73 > 74struct prior< v_iter<Vector,n_> > 75{ 76 typedef v_iter<Vector,(n_ - 1)> type; 77}; 78 79template< 80 typename Vector 81 , BOOST_MPL_AUX_NTTP_DECL(long, n_) 82 , typename Distance 83 > 84struct 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 92template< 93 typename Vector 94 , BOOST_MPL_AUX_NTTP_DECL(long, n_) 95 , BOOST_MPL_AUX_NTTP_DECL(long, m_) 96 > 97struct 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 104template<> 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 116template<> 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