OLD | NEW |
(Empty) | |
| 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$ |
| 14 // $Date: 2004-09-02 11:41:37 -0400 (Thu, 02 Sep 2004) $ |
| 15 // $Revision: 24874 $ |
| 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 |
OLD | NEW |