Boost logo

Boost Users :

From: Server Levent Yilmaz (leventyilmaz_at_[hidden])
Date: 2007-06-16 01:35:24


On 6/15/07, Arkadiy Vertleyb <vertleyb_at_[hidden]> wrote:
>
> "Server Levent Yilmaz" <leventyilmaz_at_[hidden]> wrote
>
> > I have a related, simpler question:
> >
> > Given a tuple (or any other container) with arbitrary elements,
> > is there a way to determine if an element is SPECIAL_TEXT
> > or some other text. For example given, ( a, b, SPECIAL_TEXT, c, d ),
> > can we construct (0, 0, 1, 0, 0)?
>
> If you know all the possibilities in advance, you can do something like:
>
> #define LOOKING_FOR_SPECIAL_TEXT 1
> #define LOOKING_FOR_a 0
> #define LOOKING_FOR_b 0
> #define LOOKING_FOR_c 0
> #define LOOKING_FOR_d 0
>
> and then transform the sequence using concatination LOOKING_FOR_ with the
> current item.

Nope, I don't know in advance. In fact, those (a,b,...) are not really
single character text, but rather comma separated formal arguments to a
function such as (real *, const char[], etc... ), so concat wouldnt work
even if I knew the types a priori.

I did somehow come up with this dirty trick, though it doesn't quite cut it:

#include <boost/preprocessor/seq/elem.hpp>

#define SPECIAL_TYPE ~)(1
#define IS_SPECIAL(x) BOOST_PP_SEQ_ELEM(1, (x)(0))

IS_SPECIAL( real*& ) // would give 0
IS_SPECIAL( SPECIAL_TYPE ) // would give 1

However, the whole question is not quite answered by this:

#include <boost/preprocessor/enum.hpp>
#include <boost/preprocessor/array/elem.hpp>
#include <boost/preprocessor/punctuation/paren.hpp>

#define ArgumentList1 (3, (int, real*, char[]))
#define ArgumentList2 (4, (int, real*, SPECIAL_TYPE, char[]))

#define OP(z,i,arr) IS_SPECIAL( BOOST_PP_ARRAY_ELEM(i,arr) )

( BOOST_PP_ENUM( 3, OP, ArgumentList1) ) // would give (0,0,0)
( BOOST_PP_ENUM( 4, OP, ArgumentList2) ) // obviously fails with warnings
                                         // instead of spitting (0,0,1,0)

any ideas?

Levent.

-- 
Server Levent Yilmaz
Mechanical Engineering
University of Pittsburgh


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