Home | History | Annotate | Download | only in mpl
      1 
      2 #ifndef BOOST_MPL_ADVANCE_HPP_INCLUDED
      3 #define BOOST_MPL_ADVANCE_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: advance.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/advance_fwd.hpp>
     18 #include <boost/mpl/less.hpp>
     19 #include <boost/mpl/negate.hpp>
     20 #include <boost/mpl/long.hpp>
     21 #include <boost/mpl/if.hpp>
     22 #include <boost/mpl/tag.hpp>
     23 #include <boost/mpl/apply_wrap.hpp>
     24 #include <boost/mpl/aux_/advance_forward.hpp>
     25 #include <boost/mpl/aux_/advance_backward.hpp>
     26 #include <boost/mpl/aux_/value_wknd.hpp>
     27 #include <boost/mpl/aux_/na_spec.hpp>
     28 #include <boost/mpl/aux_/nttp_decl.hpp>
     29 
     30 namespace boost { namespace mpl {
     31 
     32 // default implementation for forward/bidirectional iterators
     33 template< typename Tag >
     34 struct advance_impl
     35 {
     36     template< typename Iterator, typename N > struct apply
     37     {
     38         typedef typename less< N,long_<0> >::type backward_;
     39         typedef typename if_< backward_, negate<N>, N >::type offset_;
     40 
     41         typedef typename if_<
     42               backward_
     43             , aux::advance_backward< BOOST_MPL_AUX_VALUE_WKND(offset_)::value >
     44             , aux::advance_forward< BOOST_MPL_AUX_VALUE_WKND(offset_)::value >
     45             >::type f_;
     46 
     47         typedef typename apply_wrap1<f_,Iterator>::type type;
     48     };
     49 };
     50 
     51 
     52 template<
     53       typename BOOST_MPL_AUX_NA_PARAM(Iterator)
     54     , typename BOOST_MPL_AUX_NA_PARAM(N)
     55     >
     56 struct advance
     57     : advance_impl< typename tag<Iterator>::type >
     58         ::template apply<Iterator,N>
     59 {
     60 };
     61 
     62 template<
     63       typename Iterator
     64     , BOOST_MPL_AUX_NTTP_DECL(long, N)
     65     >
     66 struct advance_c
     67     : advance_impl< typename tag<Iterator>::type >
     68         ::template apply<Iterator,long_<N> >
     69 {
     70 };
     71 
     72 BOOST_MPL_AUX_NA_SPEC(2, advance)
     73 
     74 }}
     75 
     76 #endif // BOOST_MPL_ADVANCE_HPP_INCLUDED
     77