]> git.lyx.org Git - lyx.git/blob - boost/boost/preprocessor/list/fold_right.hpp
update
[lyx.git] / boost / boost / preprocessor / list / fold_right.hpp
1 #ifndef BOOST_PREPROCESSOR_LIST_FOLD_RIGHT_HPP
2 #define BOOST_PREPROCESSOR_LIST_FOLD_RIGHT_HPP
3
4 /* Copyright (C) 2001
5  * Housemarque Oy
6  * http://www.housemarque.com
7  *
8  * Permission to copy, use, modify, sell and distribute this software is
9  * granted provided this copyright notice appears in all copies. This
10  * software is provided "as is" without express or implied warranty, and
11  * with no claim as to its suitability for any purpose.
12  *
13  * See http://www.boost.org for most recent version.
14  */
15
16 #include <boost/preprocessor/list/reverse.hpp>
17
18 /** <p>Iterates <code>OP(D,X,STATE)</code> for each element <code>X</code> of the
19 list <code>LIST</code> (from the right or the end of the list).</p>
20
21 <p>In other words, expands to:</p>
22
23 <pre>
24 OP
25 ( D
26 , BOOST_PP_LIST_AT(LIST,0)
27 , ... OP
28       ( D
29       , BOOST_PP_LIST_AT(LIST,BOOST_PP_SUB(BOOST_PP_LIST_SIZE(LIST),2))
30       , OP
31         ( D
32         , BOOST_PP_LIST_AT(LIST,BOOST_PP_SUB(BOOST_PP_LIST_SIZE(LIST),1))
33         , STATE
34         )
35       ) ...
36 )
37 </pre>
38
39 <p>For example,</p>
40
41 <pre>
42 #define TEST(D,X,STATE) BOOST_PP_CAT(STATE,X)
43 BOOST_PP_LIST_FOLD_RIGHT(TEST,_,BOOST_PP_TUPLE_TO_LIST(3,(A,B,C)))
44 </pre>
45
46 <p>expands to:</p>
47
48 <pre>
49 _CBA
50 </pre>
51
52 <h3>Note</h3>
53 <ul>
54   <li>Folding, or accumulation, is a very general pattern of computation.
55       Most list operations can be implemented in terms of folding.</li>
56 </ul>
57
58 <h3>Test</h3>
59 <ul>
60   <li><a href="../../test/list_test.cpp">list_test.cpp</a></li>
61 </ul>
62 */
63 #define BOOST_PP_LIST_FOLD_RIGHT(OP,LIST,STATE) BOOST_PP_LIST_FOLD_RIGHT_D(0,OP,LIST,STATE)
64
65 /** <p>Can be used inside BOOST_PP_WHILE() (see for an explanation of the D parameter).</p>
66
67 <h3>Note</h3>
68 <ul>
69   <li>BOOST_PP_LIST_FOLD_RIGHT_D() implements automatic recursion. You
70       can use a fold in the OP macro.</li>
71 </ul>
72 */
73 #if 0
74 #  define BOOST_PP_LIST_FOLD_RIGHT_D(D,OP,LIST,STATE)
75 #endif
76
77 #define BOOST_PP_LIST_FOLD_RIGHT_D\
78   BOOST_PP_AUTO_REC_CAT1(BOOST_PP_LIST_FOLD_RIGHT_D,BOOST_PP_LIST_FOLD_LEFT_D_AUTO_REC1(BOOST_PP_AUTO_REC_ID,(1)))
79 #define BOOST_PP_LIST_FOLD_RIGHT_DBOOST_PP_LIST_FOLD_LEFT_D_AUTO_REC1(M,P)\
80   BOOST_PP_AUTO_REC_CAT2(BOOST_PP_LIST_FOLD_RIGHT_D,BOOST_PP_LIST_FOLD_LEFT_D_AUTO_REC2(BOOST_PP_AUTO_REC_ID,(2)))
81 #define BOOST_PP_LIST_FOLD_RIGHT_DBOOST_PP_LIST_FOLD_LEFT_D_AUTO_REC2(M,P)\
82   BOOST_PP_AUTO_REC_CAT3(BOOST_PP_LIST_FOLD_RIGHT_D,BOOST_PP_LIST_FOLD_LEFT_D_AUTO_REC3(BOOST_PP_AUTO_REC_ID,(3)))
83 #define BOOST_PP_LIST_FOLD_RIGHT_DBOOST_PP_LIST_FOLD_LEFT_D_AUTO_REC3(M,P)\
84   (TOO MANY NESTED FOLDS!)
85
86 #define BOOST_PP_LIST_FOLD_RIGHT_D1(D,O,L,S) BOOST_PP_TUPLE_ELEM(2,1,BOOST_PP_LIST_FOLD_LEFT_D(D,BOOST_PP_LIST_FOLD_RIGHT_O1,(O,S),BOOST_PP_LIST_REVERSE_D(D,L)))
87 #define BOOST_PP_LIST_FOLD_RIGHT_D2(D,O,L,S) BOOST_PP_TUPLE_ELEM(2,1,BOOST_PP_LIST_FOLD_LEFT_D(D,BOOST_PP_LIST_FOLD_RIGHT_O2,(O,S),BOOST_PP_LIST_REVERSE_D(D,L)))
88 #define BOOST_PP_LIST_FOLD_RIGHT_D3(D,O,L,S) BOOST_PP_TUPLE_ELEM(2,1,BOOST_PP_LIST_FOLD_LEFT_D(D,BOOST_PP_LIST_FOLD_RIGHT_O3,(O,S),BOOST_PP_LIST_REVERSE_D(D,L)))
89
90 #define BOOST_PP_LIST_FOLD_RIGHT_O1(D,OS,X) (BOOST_PP_TUPLE_ELEM(2,0,OS),BOOST_PP_TUPLE_ELEM(2,0,OS)(D,X,BOOST_PP_TUPLE_ELEM(2,1,OS)))
91 #define BOOST_PP_LIST_FOLD_RIGHT_O2(D,OS,X) (BOOST_PP_TUPLE_ELEM(2,0,OS),BOOST_PP_TUPLE_ELEM(2,0,OS)(D,X,BOOST_PP_TUPLE_ELEM(2,1,OS)))
92 #define BOOST_PP_LIST_FOLD_RIGHT_O3(D,OS,X) (BOOST_PP_TUPLE_ELEM(2,0,OS),BOOST_PP_TUPLE_ELEM(2,0,OS)(D,X,BOOST_PP_TUPLE_ELEM(2,1,OS)))
93
94 /** <p>Obsolete, just use BOOST_PP_LIST_FOLD_RIGHT().</p> */
95 #define BOOST_PP_LIST_FOLD_RIGHT_2ND BOOST_PP_LIST_FOLD_RIGHT
96 /** <p>Obsolete, just use BOOST_PP_LIST_FOLD_RIGHT_D().</p> */
97 #define BOOST_PP_LIST_FOLD_RIGHT_2ND_D BOOST_PP_LIST_FOLD_RIGHT_D 
98 #endif