The BOOST_PP_LIST_FOR_EACH_PRODUCT_R macro repeats a macro for each cartesian product of several lists.
It reenters BOOST_PP_FOR with maximum efficiency.
Usage
BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, size, tuple)
Arguments
- r
-
The next available BOOST_PP_FOR repetition.
- macro
-
The binary macro of the form macro(r, product).
This macro is expanded by BOOST_PP_FOR_EACH_PRODUCT with each cartesian product in tuple.
It is expanded with the next available BOOST_PP_FOR repetition and a tuple containing a cartesian product.
This tuple will have size elements.
- size
-
The size of tuple.
- tuple
-
A tuple of lists from which cartesian products are obtained.
Remarks
This macro is a repetition construct.
If two
lists are (
a, (
b, (
c,
BOOST_PP_NIL))) and (
x, (
y, (
z,
BOOST_PP_NIL))),
this macro will produce the following sequence:
macro(r, (a, x))
macro(r, (a, y))
macro(r, (a, z))
macro(r, (b, x))
macro(r, (b, y))
macro(r, (b, z))
macro(r, (c, x))
macro(r, (c, y))
macro(r, (c, z))
See Also
Requirements
Sample Code
#include <boost/preprocessor/arithmetic/dec.hpp>
#include <boost/preprocessor/list/for_each_product.hpp>
#include <boost/preprocessor/repetition/for.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#define L1 (a, (b, BOOST_PP_NIL))
#define L2 (x, (y, BOOST_PP_NIL))
#define PRED(r, state) BOOST_PP_TUPLE_ELEM(2, 0, state)
#define OP(r, state) \
( \
BOOST_PP_DEC( \
BOOST_PP_TUPLE_ELEM(2, 0, state) \
), \
BOOST_PP_TUPLE_ELEM(2, 1, state) \
) \
/**/
#define MACRO(r, state) \
MACRO_I( \
r, \
BOOST_PP_TUPLE_ELEM(2, 0, state), \
BOOST_PP_TUPLE_ELEM(2, 1, state) \
) \
/**/
#define MACRO_I(r, c, t) \
BOOST_PP_LIST_FOR_EACH_PRODUCT_R( \
r, MACRO_P, 2, \
( \
BOOST_PP_TUPLE_ELEM(2, BOOST_PP_DEC(c), t), \
BOOST_PP_TUPLE_ELEM(2, BOOST_PP_DEC(c), t) \
) \
) \
/**/
#define MACRO_P(r, product) product
BOOST_PP_FOR((2, (L1, L2)), PRED, OP, MACRO)
// expands to (x, x) (x, y) (y, x) (y, y) (a, a) (a, b) (b, a) (b, b)