Boost logo

Boost :

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


On 2/21/2011 11:32 AM, Lorenzo Caminiti wrote:
> 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

Yes, it was my error. If I try:

#include <boost/variadic_macro_data/vmd.hpp>
#include <boost/preprocessor.hpp>
#include <boost/preprocessor/facilities/is_empty.hpp>

#if !defined(BOOST_NO_VARIADIC_MACROS)

#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_(BOOST_VMD_DATA_SIZE(__VA_ARGS__),__VA_ARGS__)

#endif

int main()
   {
   int z = PP_VA_SIZE(+);
   return 0;
   }

On gcc:

"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:22: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:22: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..."

On MSVC it passes.


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