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

Header:  <boost/preprocessor/list/for_each_product.hpp>

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)

Copyright Housemarque Oy 2002
Copyright Paul Mensonides 2002

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at www.boost.org/LICENSE_1_0.txt)