
On Mon, Feb 21, 2011 at 1:13 PM, Edward Diener <eldiener@tropicsoft.com> wrote:
On 2/21/2011 11:27 AM, Lorenzo Caminiti wrote:
On Sun, Feb 20, 2011 at 7:56 PM, Edward Diener<eldiener@tropicsoft.com> wrote:
On 2/18/2011 7:27 PM, Lorenzo Caminiti wrote:
On Thu, Feb 17, 2011 at 5:13 PM, Edward Diener<eldiener@tropicsoft.com> 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@gmail.com> wrote:
On Mon, Sep 6, 2010 at 3:29 PM, Paul Mensonides <pmenso57@comcast.net> 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@gmail.com> 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@comcast.net> 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