Boost logo

Boost :

Subject: Re: [boost] Review Request: Variadic Macro Data library
From: Lorenzo Caminiti (lorcaminiti_at_[hidden])
Date: 2011-02-21 13:36:44


On Mon, Feb 21, 2011 at 1:13 PM, Edward Diener <eldiener_at_[hidden]> wrote:
> On 2/21/2011 11:27 AM, Lorenzo Caminiti wrote:
>>
>> On Sun, Feb 20, 2011 at 7:56 PM, Edward Diener<eldiener_at_[hidden]>
>>  wrote:
>>>
>>> On 2/18/2011 7:27 PM, Lorenzo Caminiti wrote:
>>>>
>>>> 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__),
>>
>> Note that I am using the rev of your lib before you added the BOOST_
>> prefix (see VMD_... instead of BOOST_VMD_...).
>>
>>>> __VA_ARGS__)
>>>>
>>>> PP_VA_SIZE(1, 2)    // 2
>>>> PP_VA_SIZE(1)       // 1
>>>> PP_VA_SIZE()        // 0 :))
>>>
>>> This does not work for me under gcc.
>>
>> It should work if either you add the BOOST_ prefix to your lib macros
>> of you use the older rev of your lib without such prefixes.
>
> Yes, that was my error. Your example now works for gcc. But if you try:
>
> PP_VA_SIZE(+)
>
> it does not work.

Yep, as I mentioned in my original email Paul Mensonides indicated
this a while back:

On Sat, Feb 19, 2011 at 10:48 AM, Lorenzo Caminiti
<lorcaminiti_at_[hidden]> wrote:
> On Mon, Sep 6, 2010 at 3:29 PM, Paul Mensonides <pmenso57_at_[hidden]> wrote:
>> ...
>> However, IS_EMPTY is _not_ a macro for general-purpose emptiness detection.
>>  Its implementation requires the concatenation of an identifier to the front
>> of the argument which rules out all arguments for which that isn't valid.
>>  For example, IS_EMPTY(+) is undefined behavior according to all revisions
>> of both the C and C++ standards (including the forthcoming C++0x).  Thus, at
>> minimum, the argument must be an identifier (or keyword--same thing at this
>> point) or a numeric literal that doesn't contain a decimal point.
>>
>> It is
>> valid (and has been since C90) to pass something that expands to nothing as
>> an argument to a macro.  However, it is not valid to pass nothing.  E.g.
>
> See http://lists.boost.org/Archives/boost/2010/09/170639.php

I was just asking if:

On Fri, Feb 18, 2011 at 7:27 PM, Lorenzo Caminiti <lorcaminiti_at_[hidden]> wrote:
> Is it possible to use variadic macros to detect empty parameters?

I know my code has limitations like the "+", and that is why I was
asking to see if with variadics all these issues/limitations in
detecting empty macro params could be worked around... From this email
thread:

On Mon, Feb 21, 2011 at 4:05 AM, Paul Mensonides <pmenso57_at_[hidden]> wrote:
> On Sun, 20 Feb 2011 20:25:43 -0500, Edward Diener wrote:
>
>> I think Paul Mensonides may be right and there is no foolproof way to
>> check for a completely empty parameter list even using variadic macros.
>> Further ideas ?
>
> Trust me, I am right.  About the best you can do is prohibit input that
> terminates in a function-like macro name.  You can generally detect
> emptiness *except* for that case.

It appears that the answer is sadly "not" :((

But thanks for looking into this!

-- 
Lorenzo

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