|
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 |