Boost logo

Boost :

Subject: Re: [boost] Review Request: Variadic Macro Data library
From: Lorenzo Caminiti (lorcaminiti_at_[hidden])
Date: 2011-02-18 19:27:39


On Thu, Feb 17, 2011 at 5:13 PM, Edward Diener <eldiener_at_[hidden]> wrote:
> I am requesting that my library, the Variadic Macro Data library, which is
> in the sandbox in the variadic_macro_data directory, be reviewed for
> inclusion into Boost.
>
> The variadic_macro_data library adds support and functionality for variadic
> macros to Boost as well as integrating variadic macros with the Boost PP
> library without changing the latter library in any way.
>
> I believe others have used my library, can attest to its quality and that it
> does what it is supposed to do. and have found it useful when using variadic
> macros with Boost PP. I myself have used its functionality in my own TTI
> library in the sandbox. Support for variadic macros is implemented in nearly
> all modern C++ compilers and the syntax is natural for an end-user. The
> library is finalized as far as functionality is concerned and I would like
> to see it in Boost and am willing to maintain it as a Boost library.

Is it possible to use variadic macros to detect empty parameters?

For example:

#include <boost/variadic_macro_data/VariadicMacroData.hpp> // Proposed lib.

VMD_DATA_SIZE(1, 2) // 2
VMD_DATA_SIZE(1) // 1
VMD_DATA_SIZE() // 1 not 0 :((

But I would like to the last size to expand to 0 (or have a different
macro that would expand to 0 in that case).

With a real C99 preprocessor (e.g., GCC) I can do the following
because empty macro parameters are supported:

#include <boost/variadic_macro_data/VariadicMacroData.hpp> // Proposed lib.
#include <boost/preprocessor.hpp>
#include <boost/preprocessor/facilities/is_empty.hpp>

#define PP_VA_EAT(...) /* must expand to nothing */

#define PP_VA_SIZE_1OR0_(x) BOOST_PP_IIF(BOOST_PP_IS_EMPTY(x), 0, 1)

#define PP_VA_SIZE_(size, ...) \
    BOOST_PP_IIF(BOOST_PP_EQUAL(size, 1), \
        PP_VA_SIZE_1OR0_ \
    , \
        size PP_VA_EAT \
    )(__VA_ARGS__)

#define PP_VA_SIZE(...) PP_VA_SIZE_(VMD_DATA_SIZE(__VA_ARGS__), __VA_ARGS__)

PP_VA_SIZE(1, 2) // 2
PP_VA_SIZE(1) // 1
PP_VA_SIZE() // 0 :))

But this does not compile on MSVC because while it supports variadics
it does not support empty macro parameters :(

BTW, a few minor comments on you library:
1) I think a name like BOOST_PP_VA_... is better than BOOST_VMD. "VA"
is the same abbreviation for variadics that C99 uses in __VA_ARGS__
and Boost.Preprocessor already uses abbreviations like in
BOOST_PP_SEQ. Alternatively, I would consider BOOST_PP_VARIADICS_...
but still not "VMD" because programmers will not know what VMD stands
for.
2) I would add PP_VA_EAT, PP_VA_IDENTITY, PP_VA_CAT (similar to what
they do already in Boost.Preprocessor and they should be trivial to
implement). Also, I would add `#define PP_VA_SAME(...) __VA_ARGS__`.

Thanks.

-- 
Lorenzo

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