|
1 |
|
2 #if !defined(BOOST_PP_IS_ITERATING) |
|
3 |
|
4 ///// header body |
|
5 |
|
6 #ifndef BOOST_MPL_AUX778076_ADVANCE_BACKWARD_HPP_INCLUDED |
|
7 #define BOOST_MPL_AUX778076_ADVANCE_BACKWARD_HPP_INCLUDED |
|
8 |
|
9 // Copyright Aleksey Gurtovoy 2000-2004 |
|
10 // |
|
11 // Distributed under the Boost Software License, Version 1.0. |
|
12 // (See accompanying file LICENSE_1_0.txt or copy at |
|
13 // http://www.boost.org/LICENSE_1_0.txt) |
|
14 // |
|
15 // See http://www.boost.org/libs/mpl for documentation. |
|
16 |
|
17 // $Source: /cvsroot/boost/boost/boost/mpl/aux_/advance_backward.hpp,v $ |
|
18 // $Date: 2004/09/02 15:40:43 $ |
|
19 // $Revision: 1.9 $ |
|
20 |
|
21 #if !defined(BOOST_MPL_PREPROCESSING_MODE) |
|
22 # include <boost/mpl/prior.hpp> |
|
23 # include <boost/mpl/apply_wrap.hpp> |
|
24 #endif |
|
25 |
|
26 #include <boost/mpl/aux_/config/use_preprocessed.hpp> |
|
27 |
|
28 #if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \ |
|
29 && !defined(BOOST_MPL_PREPROCESSING_MODE) |
|
30 |
|
31 # define BOOST_MPL_PREPROCESSED_HEADER advance_backward.hpp |
|
32 # include <boost/mpl/aux_/include_preprocessed.hpp> |
|
33 |
|
34 #else |
|
35 |
|
36 # include <boost/mpl/limits/unrolling.hpp> |
|
37 # include <boost/mpl/aux_/nttp_decl.hpp> |
|
38 # include <boost/mpl/aux_/config/eti.hpp> |
|
39 |
|
40 # include <boost/preprocessor/iterate.hpp> |
|
41 # include <boost/preprocessor/cat.hpp> |
|
42 # include <boost/preprocessor/inc.hpp> |
|
43 |
|
44 namespace boost { namespace mpl { namespace aux { |
|
45 |
|
46 // forward declaration |
|
47 template< BOOST_MPL_AUX_NTTP_DECL(long, N) > struct advance_backward; |
|
48 |
|
49 # define BOOST_PP_ITERATION_PARAMS_1 \ |
|
50 (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/advance_backward.hpp>)) |
|
51 # include BOOST_PP_ITERATE() |
|
52 |
|
53 // implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING |
|
54 template< BOOST_MPL_AUX_NTTP_DECL(long, N) > |
|
55 struct advance_backward |
|
56 { |
|
57 template< typename Iterator > struct apply |
|
58 { |
|
59 typedef typename apply_wrap1< |
|
60 advance_backward<BOOST_MPL_LIMIT_UNROLLING> |
|
61 , Iterator |
|
62 >::type chunk_result_; |
|
63 |
|
64 typedef typename apply_wrap1< |
|
65 advance_backward<( |
|
66 (N - BOOST_MPL_LIMIT_UNROLLING) < 0 |
|
67 ? 0 |
|
68 : N - BOOST_MPL_LIMIT_UNROLLING |
|
69 )> |
|
70 , chunk_result_ |
|
71 >::type type; |
|
72 }; |
|
73 }; |
|
74 |
|
75 }}} |
|
76 |
|
77 #endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS |
|
78 #endif // BOOST_MPL_AUX778076_ADVANCE_BACKWARD_HPP_INCLUDED |
|
79 |
|
80 ///// iteration, depth == 1 |
|
81 |
|
82 #elif BOOST_PP_ITERATION_DEPTH() == 1 |
|
83 #define i_ BOOST_PP_FRAME_ITERATION(1) |
|
84 |
|
85 template<> |
|
86 struct advance_backward< BOOST_PP_FRAME_ITERATION(1) > |
|
87 { |
|
88 template< typename Iterator > struct apply |
|
89 { |
|
90 typedef Iterator iter0; |
|
91 |
|
92 #if i_ > 0 |
|
93 # define BOOST_PP_ITERATION_PARAMS_2 \ |
|
94 (3,(1, BOOST_PP_FRAME_ITERATION(1), <boost/mpl/aux_/advance_backward.hpp>)) |
|
95 # include BOOST_PP_ITERATE() |
|
96 #endif |
|
97 |
|
98 typedef BOOST_PP_CAT(iter,BOOST_PP_FRAME_ITERATION(1)) type; |
|
99 }; |
|
100 |
|
101 #if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG) |
|
102 /// ETI workaround |
|
103 template<> struct apply<int> |
|
104 { |
|
105 typedef int type; |
|
106 }; |
|
107 #endif |
|
108 }; |
|
109 |
|
110 #undef i_ |
|
111 |
|
112 ///// iteration, depth == 2 |
|
113 |
|
114 #elif BOOST_PP_ITERATION_DEPTH() == 2 |
|
115 |
|
116 # define AUX778076_ITER_0 BOOST_PP_CAT(iter,BOOST_PP_DEC(BOOST_PP_FRAME_ITERATION(2))) |
|
117 # define AUX778076_ITER_1 BOOST_PP_CAT(iter,BOOST_PP_FRAME_ITERATION(2)) |
|
118 |
|
119 typedef typename prior<AUX778076_ITER_0>::type AUX778076_ITER_1; |
|
120 |
|
121 # undef AUX778076_ITER_1 |
|
122 # undef AUX778076_ITER_0 |
|
123 |
|
124 #endif // BOOST_PP_IS_ITERATING |