2002-10-03 22:13:37 +00:00
< html >
< head >
< title > BOOST_PP_FOR< / title >
< link rel = "stylesheet" type = "text/css" href = "../styles.css" >
< / head >
< body >
< div style = "margin-left: 0px;" >
The < b > BOOST_PP_FOR< / b > macro represents a generalized horizontal repetition construct.
< / div >
< h4 > Usage< / h4 >
< div class = "code" >
< b > BOOST_PP_FOR< / b > (< i > state< / i > , < i > pred< / i > , < i > op< / i > , < i > macro< / i > )
< / div >
< h4 > Arguments< / h4 >
< dl >
< 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 >
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.
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 > .
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.
< / div >
< div >
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 > .
< / div >
< div >
Previously, this macro could not be used recursively inside < b > BOOST_PP_FOR< / b > .
This limitation no longer exists, as the library can automatically detect the next available < b > BOOST_PP_FOR< / b > repetition.
< / div >
< h4 > See Also< / h4 >
< ul >
< li > < a href = "for_r.html" > BOOST_PP_FOR_< i > r< / i > < / a > < / li >
< li > < a href = "limit_mag.html" > BOOST_PP_LIMIT_MAG< / a > < / li >
< / ul >
< h4 > Requirements< / h4 >
< div >
2004-10-11 06:58:45 +00:00
< b > Header:< / b > < a href = "../headers/repetition/for.html" > < boost/preprocessor/repetition/for.hpp> < / a >
2002-10-03 22:13:37 +00:00
< / div >
< h4 > Sample Code< / h4 >
< div > < pre >
2004-10-11 06:58:45 +00:00
#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/repetition/for.html" > boost/preprocessor/repetition/for.hpp< / a > >
#include < < a href = "../headers/tuple/elem.html" > boost/preprocessor/tuple/elem.hpp< / a > >
2002-10-03 22:13:37 +00:00
#define PRED(r, state) \
< a href = "not_equal.html" > BOOST_PP_NOT_EQUAL< / a > ( \
< a href = "tuple_elem.html" > BOOST_PP_TUPLE_ELEM< / a > (2, 0, state), \
< a href = "inc.html" > BOOST_PP_INC< / a > (< a href = "tuple_elem.html" > BOOST_PP_TUPLE_ELEM< / a > (2, 1, state)) \
) \
/**/
#define OP(r, state) \
( \
< a href = "inc.html" > BOOST_PP_INC< / a > (< a href = "tuple_elem.html" > BOOST_PP_TUPLE_ELEM< / a > (2, 0, state)), \
< a href = "tuple_elem.html" > BOOST_PP_TUPLE_ELEM< / a > (2, 1, state) \
) \
/**/
#define MACRO(r, state) < a href = "tuple_elem.html" > BOOST_PP_TUPLE_ELEM< / a > (2, 0, state)
< a href = "for.html" > BOOST_PP_FOR< / a > ((5, 10), PRED, OP, MACRO) // expands to 5 6 7 8 9 10
< / pre > < / div >
< / body >
< / html >