Boost logo

Boost :

Subject: Re: [boost] Review Request: Variadic Macro Data library
From: Edward Diener (eldiener_at_[hidden])
Date: 2011-02-21 13:13:22


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.

"gcc.compile.c++
..\..\..\bin.v2\libs\variadic_macro_data\test\test_data_try.test\gcc-mingw-4.5.2\debug\test_data_try.o
test_data_try.cpp:36:1: error: pasting "BOOST_PP_IS_EMPTY_DEF_" and "+"
does not give a valid preprocessing token
test_data_try.cpp: In function 'int main()':
test_data_try.cpp:36:7: warning: unused variable 'z'

     "g++" -ftemplate-depth-128 -O0 -fno-inline -Wall -pedantic -g
-Wno-variadic-macros -I"..\..\.."
-I"C:\Programming\VersionControl\boost" -c -o
"..\..\..\bin.v2\libs\variadic_macro_data\test\test_data_try.test\gcc-mingw-4.5.2\debug\test_data_try.o"
"test_data_try.cpp"

...failed gcc.compile.c++
..\..\..\bin.v2\libs\variadic_macro_data\test\test_data_try.test\gcc-mingw-4.5.2\debug\test_data_try.o..."


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