1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
<html>
<head>
<title>BOOST_PP_FOR_r</title>
<link rel="stylesheet" type="text/css" href="../styles.css">
</head>
<body>
<div style="margin-left: 0px;">
The <b>BOOST_PP_FOR_<i>r</i></b> macro represents a reentry into the <b>BOOST_PP_FOR</b> repetition construct.
</div>
<h4>Usage</h4>
<div class="code">
<b>BOOST_PP_FOR_</b> ## <i>r</i>(<i>state</i>, <i>pred</i>, <i>op</i>, <i>macro</i>)
</div>
<h4>Arguments</h4>
<dl>
<dt>r</dt>
<dd>
The next available <b>BOOST_PP_FOR</b> repetition.
</dd>
<dt>state</dt>
<dd>
The initial state.
</dd>
<dt>pred</dt>
<dd>
A binary predicate of the form <i>pred</i>(<i>r</i>, <i>state</i>).
This macro must expand to an integer in the range of <i>0</i> to <b>BOOST_PP_LIMIT_MAG</b>.
<b>BOOST_PP_FOR</b> repeatedly expands <i>macro</i> while this predicate returns non-zero.
This macro is called with the next available <b>BOOST_PP_FOR</b> repetition and the current <i>state</i>.
</dd>
<dt>op</dt>
<dd>
A binary operation of the form <i>op</i>(<i>r</i>, <i>state</i>).
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>.
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>.
</dd>
<dt>macro</dt>
<dd>
A binary macro of the form <i>macro</i>(<i>r</i>, <i>state</i>).
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>.
This macro is is repeated by <b>BOOST_PP_FOR</b> until <i>pred</i> returns <i>0</i>.
</dd>
</dl>
<h4>Remarks</h4>
<div>
This macro expands to the sequence:
<div>
<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>) ... ))
</div>
</div>
<div>
At certain times, it may be necessary to perform the concatenation with <b>BOOST_PP_CAT</b> rather than the preprocessor token-pasting operator.
This happens when the <i>r</i> value is a macro invocation itself.
It needs a delay to allow it to expand.
The syntax in such a scenario becomes:
<div>
<b>BOOST_PP_CAT</b>(<b>BOOST_PP_FOR_</b>, <i>r</i>)(<i>state</i>, <i>pred</i>, <i>op</i>, <i>macro</i>)
</div>
</div>
<h4>See Also</h4>
<ul>
<li><a href="cat.html">BOOST_PP_CAT</a></li>
<li><a href="for.html">BOOST_PP_FOR</a></li>
<li><a href="limit_mag.html">BOOST_PP_LIMIT_MAG</a></li>
</ul>
<h4>Requirements</h4>
<div>
<b>Header:</b> <a href="../headers/repetition/for.html"><boost/preprocessor/repetition/for.hpp></a>
</div>
<h4>Sample Code</h4>
<div><pre>
#include <<a href="../headers/arithmetic/dec.html">boost/preprocessor/arithmetic/dec.hpp</a>>
#include <<a href="../headers/arithmetic/inc.html">boost/preprocessor/arithmetic/inc.hpp</a>>
#include <<a href="../headers/comparison/not_equal.html">boost/preprocessor/comparison/not_equal.hpp</a>>
#include <<a href="../headers/punctuation/comma_if.html">boost/preprocessor/punctuation/comma_if.hpp</a>>
#include <<a href="../headers/repetition/for.html">boost/preprocessor/repetition/for.hpp</a>>
#include <<a href="../headers/tuple/elem.html">boost/preprocessor/tuple/elem.hpp</a>>
#define PRED(r, state) \
<a href="not_equal.html">BOOST_PP_NOT_EQUAL</a>( \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 0, state), \
<a href="inc.html">BOOST_PP_INC</a>( \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 1, state) \
) \
) \
/**/
#define OP(r, state) \
( \
<a href="inc.html">BOOST_PP_INC</a>( \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 0, state) \
), \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 1, state), \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 2, state), \
<a href="inc.html">BOOST_PP_INC</a>( \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 3, state) \
) \
) \
/**/
#define MACRO(r, state) \
<a href="comma_if.html">BOOST_PP_COMMA_IF</a>( \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 3, state) \
) template< \
<a href="for_r.html">BOOST_PP_FOR_</a> ## r( \
(0, <a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 0, state), _, 0), \
PRED_2, OP, MACRO_2 \
) \
> class <a href="cat.html">BOOST_PP_CAT</a>( \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 2, state), \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 0, state) \
) \
/**/
#define PRED_2(r, state) \
<a href="not_equal.html">BOOST_PP_NOT_EQUAL</a>( \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 0, state), \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 1, state) \
) \
/**/
#define MACRO_2(r, state) \
<a href="comma_if.html">BOOST_PP_COMMA_IF</a>( \
<a href="tuple_elem.html">BOOST_PP_TUPLE_ELEM</a>(4, 0, state) \
) class \
/**/
#define TEMPLATE_TEMPLATE(low, high, name) \
<a href="for.html">BOOST_PP_FOR</a>( \
(low, high, name, 0), \
PRED, OP, MACRO \
) \
/**/
TEMPLATE_TEMPLATE(2, 4, T)
/*
expands to...
template<class, class> class T2,
template<class, class, class> class T3,
template<class, class, class, class> class T4
*/
</pre></div>
<hr size="1">
<div style="margin-left: 0px;">
<i> Copyright <a href="http://www.housemarque.com" target="_top">Housemarque Oy</a> 2002</i>
</br><i> Copyright Paul Mensonides 2002</i>
</div>
<div style="margin-left: 0px;">
<p><small>Distributed under the Boost Software License, Version 1.0. (See
accompanying file <a href="../../../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or
copy at <a href=
"http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a>)</small></p>
</div>
</body>
</html>
|