| |
| #ifndef BOOST_MPL_AUX_VECTOR_ITERATOR_HPP_INCLUDED |
| #define BOOST_MPL_AUX_VECTOR_ITERATOR_HPP_INCLUDED |
| |
| // Copyright Aleksey Gurtovoy 2000-2004 |
| // |
| // Distributed under the Boost Software License, Version 1.0. |
| // (See accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| // |
| // See http://www.boost.org/libs/mpl for documentation. |
| |
| // $Id: iterator.hpp 49267 2008-10-11 06:19:02Z agurtovoy $ |
| // $Date: 2008-10-10 23:19:02 -0700 (Fri, 10 Oct 2008) $ |
| // $Revision: 49267 $ |
| |
| #include <ndnboost/mpl/vector/aux_/at.hpp> |
| #include <ndnboost/mpl/iterator_tags.hpp> |
| #include <ndnboost/mpl/plus.hpp> |
| #include <ndnboost/mpl/minus.hpp> |
| #include <ndnboost/mpl/advance_fwd.hpp> |
| #include <ndnboost/mpl/distance_fwd.hpp> |
| #include <ndnboost/mpl/next.hpp> |
| #include <ndnboost/mpl/prior.hpp> |
| #include <ndnboost/mpl/aux_/nttp_decl.hpp> |
| #include <ndnboost/mpl/aux_/value_wknd.hpp> |
| #include <ndnboost/mpl/aux_/config/ctps.hpp> |
| #include <ndnboost/mpl/aux_/config/workaround.hpp> |
| |
| namespace ndnboost { namespace mpl { |
| |
| template< |
| typename Vector |
| , BOOST_MPL_AUX_NTTP_DECL(long, n_) |
| > |
| struct v_iter |
| { |
| typedef aux::v_iter_tag tag; |
| typedef random_access_iterator_tag category; |
| typedef typename v_at<Vector,n_>::type type; |
| |
| typedef Vector vector_; |
| typedef mpl::long_<n_> pos; |
| |
| #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) |
| enum { |
| next_ = n_ + 1 |
| , prior_ = n_ - 1 |
| , pos_ = n_ |
| }; |
| |
| typedef v_iter<Vector,next_> next; |
| typedef v_iter<Vector,prior_> prior; |
| #endif |
| |
| }; |
| |
| |
| #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) |
| |
| template< |
| typename Vector |
| , BOOST_MPL_AUX_NTTP_DECL(long, n_) |
| > |
| struct next< v_iter<Vector,n_> > |
| { |
| typedef v_iter<Vector,(n_ + 1)> type; |
| }; |
| |
| template< |
| typename Vector |
| , BOOST_MPL_AUX_NTTP_DECL(long, n_) |
| > |
| struct prior< v_iter<Vector,n_> > |
| { |
| typedef v_iter<Vector,(n_ - 1)> type; |
| }; |
| |
| template< |
| typename Vector |
| , BOOST_MPL_AUX_NTTP_DECL(long, n_) |
| , typename Distance |
| > |
| struct advance< v_iter<Vector,n_>,Distance> |
| { |
| typedef v_iter< |
| Vector |
| , (n_ + BOOST_MPL_AUX_NESTED_VALUE_WKND(long, Distance)) |
| > type; |
| }; |
| |
| template< |
| typename Vector |
| , BOOST_MPL_AUX_NTTP_DECL(long, n_) |
| , BOOST_MPL_AUX_NTTP_DECL(long, m_) |
| > |
| struct distance< v_iter<Vector,n_>, v_iter<Vector,m_> > |
| : mpl::long_<(m_ - n_)> |
| { |
| }; |
| |
| #else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION |
| |
| template<> struct advance_impl<aux::v_iter_tag> |
| { |
| template< typename Iterator, typename N > struct apply |
| { |
| enum { pos_ = Iterator::pos_, n_ = N::value }; |
| typedef v_iter< |
| typename Iterator::vector_ |
| , (pos_ + n_) |
| > type; |
| }; |
| }; |
| |
| template<> struct distance_impl<aux::v_iter_tag> |
| { |
| template< typename Iter1, typename Iter2 > struct apply |
| { |
| enum { pos1_ = Iter1::pos_, pos2_ = Iter2::pos_ }; |
| typedef long_<( pos2_ - pos1_ )> type; |
| BOOST_STATIC_CONSTANT(long, value = ( pos2_ - pos1_ )); |
| }; |
| }; |
| |
| #endif |
| |
| }} |
| |
| #endif // BOOST_MPL_AUX_VECTOR_ITERATOR_HPP_INCLUDED |