Boost logo

Boost :

From: Edward Bishop (dicatna2003_at_[hidden])
Date: 2005-03-19 01:18:50


I came up with this great macro called IS_UNSIGNED_CHAR()
such that

      IS_UNSIGNED_CHAR(unsigned char)

expands to 1 and

      IS_UNSIGNED_CHAR(hello world)

or any other input, expands to 0.

It almost works, but it gets confused by

      IS_UNSIGNED_CHAR(unsigned world)

which expands to garbage: BOOST_PP_IIF_I, EQUALS_42_57, RETURN_0)((42) world_U_I_O_P));

Any suggestions? Here is the code:

#include <boost/preprocessor.hpp>

#define Q_W_E_R_T_Y_unsigned 42)
#define char_U_I_O_P (57

// Transmogrify t
#define MOG(t) Q_W_E_R_T_Y_ ## t ## _U_I_O_P

// Check if t is (42)(57)
#define EQUALS_42_57(t) BOOST_PP_AND(BOOST_PP_EQUAL(42,BOOST_PP_SEQ_ELEM(0, t)), \
     BOOST_PP_EQUAL(57,BOOST_PP_SEQ_ELEM(1, t)) )

// return 0
#define RETURN_0(t) 0

#define IS_UNSIGNED_CHAR(t) BOOST_PP_IIF(BOOST_PP_EQUAL(2,BOOST_PP_SEQ_SIZE((MOG(t)))), \
     EQUALS_42_57, RETURN_0)((MOG(t)))

// Here is some test data:

IS_UNSIGNED_CHAR(unsigned char); // should expand to 1

IS_UNSIGNED_CHAR(hello world); // should expand to 0

IS_UNSIGNED_CHAR(unsigned world); // should expand to 0


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk