Boost logo

Boost :

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


On Sun, Feb 20, 2011 at 8:25 PM, Edward Diener <eldiener_at_[hidden]> wrote:
> On 2/19/2011 10:48 AM, Lorenzo Caminiti wrote:
>>
>> On Fri, Feb 18, 2011 at 9:58 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?
>>>
>>> My understanding of variadic macro data is that at least one parameter
>>> must
>>> be specified.
>>>
>>>>
>>>> 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:
>>>
>>> Are they for variadic macro data in C++ ?
>>
>> I think variadics and empty macro parameters are different things. C99
>> preprocessor (e.g., GCC) supports both while MSVC only supports
>> variadics. That is why I was wondering if variadics can be used to
>> detect empty macro parameters so I can do so also on MSVC.
>>
>> 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 will look at that and see what I can come up with. If variadic macros
>>> support an empty parameter list, I should provide a correct size of 0. If
>>> it
>>> does not I should indicate an error. So either way I will look to make a
>>> correction. Thanks for pointing this out.
>>
>> This works on both MSVC and GCC :) Does it work on other
>> preprocessors? Can anyone please check?
>>
>> #include<boost/variadic_macro_data/VariadicMacroData.hpp>  // Proposed
>> lib in Boost's sandbox.
>> #include<boost/preprocessor.hpp>
>> #include<boost/preprocessor/facilities/is_empty.hpp>
>>
>> VMD_DATA_SIZE(1, 2) // 2
>> VMD_DATA_SIZE(1)    // 1
>> VMD_DATA_SIZE()     // 1 not 0 :((
>>
>> #define PP_VA_EAT(...) /* must expand to nothing */
>>
>> #define PP_VA_SIZE_1OR0_(maybe_empty) \
>>         BOOST_PP_IIF(BOOST_PP_IS_EMPTY(maybe_empty (/*exapnd empty */) ),
>> 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__ BOOST_PP_EMPTY)
>>
>> #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 :))
>
> This does not work under gcc or msvc:

As I said in my prev email, please try again after adding the BOOST_
prefixes to your lib macros given that you are probably using the
later rev of your lib where you added such prefixes.

I did test this code on both GCC and MVSC revs below:

E:\sandbox\boost-sandbox\local\libs\local\example>cl /?
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
...

$ g++ --version
g++ (GCC) 4.3.4 20090804 (release) 1
...

-- 
Lorenzo

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