1<html> 2<head> 3 <title>BOOST_PP_FOR</title> 4 <link rel="stylesheet" type="text/css" href="../styles.css"> 5</head> 6<body> 7 <div style="margin-left: 0px;"> 8 The <b>BOOST_PP_FOR</b> macro represents a generalized horizontal repetition construct. 9 </div> 10 <h4>Usage</h4> 11 <div class="code"> 12 <b>BOOST_PP_FOR</b>(<i>state</i>, <i>pred</i>, <i>op</i>, <i>macro</i>) 13 </div> 14 <h4>Arguments</h4> 15 <dl> 16 <dt>state</dt> 17 <dd> 18 The initial state. 19 </dd> 20 <dt>pred</dt> 21 <dd> 22 A binary predicate of the form <i>pred</i>(<i>r</i>, <i>state</i>). 23 This macro must expand to an integer in the range of <i>0</i> to <b>BOOST_PP_LIMIT_MAG</b>. 24 <b>BOOST_PP_FOR</b> repeatedly expands <i>macro</i> while this predicate returns non-zero. 25 This macro is called with the next available <b>BOOST_PP_FOR</b> repetition and the current <i>state</i>. 26 </dd> 27 <dt>op</dt> 28 <dd> 29 A binary operation of the form <i>op</i>(<i>r</i>, <i>state</i>). 30 This operation is expanded by <b>BOOST_PP_FOR</b> with the next available <b>BOOST_PP_FOR</b> repetition and the current <i>state</i>. 31 This macro is repeatedly applied to the <i>state</i>, each time producing a new <i>state</i>, until <i>pred</i> returns <i>0</i>. 32 </dd> 33 <dt>macro</dt> 34 <dd> 35 A binary macro of the form <i>macro</i>(<i>r</i>, <i>state</i>). 36 This macro is expanded by <b>BOOST_PP_FOR</b> with the next available <b>BOOST_PP_FOR</b> repetition and the current <i>state</i>. 37 This macro is is repeated by <b>BOOST_PP_FOR</b> until <i>pred</i> returns <i>0</i>. 38 </dd> 39 </dl> 40 <h4>Remarks</h4> 41 <div> 42 This macro expands to the sequence: 43 <div> 44 <i>macro</i>(<i>r</i>, <i>state</i>) <i>macro</i>(<i>r</i>, <i>op</i>(<i>r</i>, <i>state</i>)) ... <i>macro</i>(<i>r</i>, <i>op</i>(<i>r</i>, ... <i>op</i>(<i>r</i>, <i>state</i>) ... )) 45 </div> 46 </div> 47 <div> 48 The <i>r</i> value that is passed to <i>pred</i>, <i>op</i>, and <i>macro</i> represents the next available <b>BOOST_PP_FOR</b> repetition. 49 Other macros that have <b>_R</b> suffix variants internally use <b>BOOST_PP_FOR</b>--for example, <b>BOOST_PP_LIST_FOR_EACH</b> and <b>BOOST_PP_LIST_FOR_EACH_R</b>. 50 Using these <b>_R</b> versions is not strictly necessary, but passing the <i>r</i> value (that is passed to <i>pred</i>, <i>op</i>, and <i>macro</i>) to these macros allows them to reenter <b>BOOST_PP_FOR</b> with maximum efficiency. 51 </div> 52 <div> 53 To directly use this <i>r</i> value, rather than simply passing it to another macro, see <b>BOOST_PP_FOR_<i>r</i></b>. 54 </div> 55 <div> 56 Previously, this macro could not be used recursively inside <b>BOOST_PP_FOR</b>. 57 This limitation no longer exists, as the library can automatically detect the next available <b>BOOST_PP_FOR</b> repetition. 58 </div> 59 <h4>See Also</h4> 60 <ul> 61 <li><a href="for_r.html">BOOST_PP_FOR_<i>r</i></a></li> 62 <li><a href="limit_mag.html">BOOST_PP_LIMIT_MAG</a></li> 63 </ul> 64 <h4>Requirements</h4> 65 <div> 66 <b>Header:</b> <a href="../headers/repetition/for.html"><boost/preprocessor/repetition/for.hpp></a> 67 </div> 68 <h4>Sample Code</h4> 69<div><pre> 70#include <<a href="../headers/arithmetic/inc.html">boost/preprocessor/arithmetic/inc.hpp</a>> 71#include <<a href="../headers/comparison/not_equal.html">boost/preprocessor/comparison/not_equal.hpp</a>> 72#include <<a href="../headers/repetition/for.html">boost/preprocessor/repetition/for.hpp</a>> 73#include <<a href="../headers/tuple/elem.html">boost/preprocessor/tuple/elem.hpp</a>> 74 75#define PRED(r, state) \ 76 <a href="not_equal.html">BOOST_PP_NOT_EQUAL</a>( \ 77 <a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(2, 0, state), \ 78 <a href="inc.html">BOOST_PP_INC</a>(<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(2, 1, state)) \ 79 ) \ 80 /**/ 81 82#define OP(r, state) \ 83 ( \ 84 <a href="inc.html">BOOST_PP_INC</a>(<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(2, 0, state)), \ 85 <a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(2, 1, state) \ 86 ) \ 87 /**/ 88 89#define MACRO(r, state) <a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(2, 0, state) 90 91<a href="for.html">BOOST_PP_FOR</a>((5, 10), PRED, OP, MACRO) // expands to 5 6 7 8 9 10 92</pre></div> 93 <hr size="1"> 94 <div style="margin-left: 0px;"> 95 <i>� Copyright <a href="http://www.housemarque.com" target="_top">Housemarque Oy</a> 2002</i> 96 </br><i>� Copyright Paul Mensonides 2002</i> 97 </div> 98 <div style="margin-left: 0px;"> 99 <p><small>Distributed under the Boost Software License, Version 1.0. (See 100 accompanying file <a href="../../../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or 101 copy at <a href= 102 "http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a>)</small></p> 103 </div> 104</body> 105</html> 106