| [29] | 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 | // $Source: /cvsroot/boost/boost/boost/mpl/advance.hpp,v $ | 
|---|
 | 14 | // $Date: 2004/09/02 15:40:41 $ | 
|---|
 | 15 | // $Revision: 1.9 $ | 
|---|
 | 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 | 
|---|