|
Boost Users : |
Subject: [Boost-users] [preprocessor] having trouble using reentrant macros
From: Rob Desbois (rob.desbois_at_[hidden])
Date: 2012-03-29 09:39:20
I'm unable to use the reentrant macros for iteration currently..I
think I'm probably misunderstanding their usage, and a push in the
right direction would be much appreciated.
My need is to iterate through a sequence, then iterate through a
sequence nested within each element.
As I understand, I should be able to call (e.g.):
* BOOST_PP_SEQ_FOR_EACH(OP, data, seq) to iterate through the outer sequence
* then in OP(r, data, elem) call BOOST_PP_SEQ_FOR_EACH_R(r, OP2, data, elem)
For me this keeps producing rubbish with a lot of non-expanded macro
names embedded.
I've reduced this down to a minimal example iterating over a
2-dimensional sequence; I know the final line isn't valid C++, I'm
just checking preprocessing results at this stage.
#include <boost/preprocessor/seq/transform.hpp>
#define INNER(s, data, elem) <elem>
#define MIDDLE(s, data, seq) BOOST_PP_SEQ_TRANSFORM_S(s, INNER, data, seq)
#define OUTER(seqseq) BOOST_PP_SEQ_TRANSFORM( MIDDLE, _, seqseq)
outer gives: OUTER( ((a) (b) (c)) ((i) (j) (k)) ((x) (y) (z)) )
Resultant output of this, with preprocessor line directives and empty
lines removed, is:
outer gives: (
BOOST_PP_SEQ_TAIL_I
BOOST_PP_TUPLE_ELEM_3_2 BOOST_PP_SEQ_TRANSFORM_O(5,
BOOST_PP_SEQ_TRANSFORM_O(4, BOOST_PP_SEQ_TRANSFORM_O(3, (
INNER
, _, (nil)), a), b), c)) (
BOOST_PP_SEQ_TAIL_I
BOOST_PP_TUPLE_ELEM_3_2 BOOST_PP_SEQ_TRANSFORM_O(6,
BOOST_PP_SEQ_TRANSFORM_O(5, BOOST_PP_SEQ_TRANSFORM_O(4, (
INNER
, _, (nil)), i), j), k)) (
BOOST_PP_SEQ_TAIL_I
BOOST_PP_TUPLE_ELEM_3_2 BOOST_PP_SEQ_TRANSFORM_O(7,
BOOST_PP_SEQ_TRANSFORM_O(6, BOOST_PP_SEQ_TRANSFORM_O(5, (
INNER
, _, (nil)), x), y), z))
For reference, I am using the following:
boost 1.46.00
g++ (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2)
TIA --rob
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net