From ed360a9a0d3577e9e950b97f05857fa930008431 Mon Sep 17 00:00:00 2001 From: comex Date: Sat, 18 Feb 2012 13:26:04 -0500 Subject: [PATCH] standards compliance --- lambda.h | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lambda.h b/lambda.h index a5a6f09..0908db4 100644 --- a/lambda.h +++ b/lambda.h @@ -35,9 +35,21 @@ struct _blk { #define LAMBDA_BODY(typ, ret, args, body) \ LAMBDA_BODY_(typ, ret, LAMBDA_UNPAREN args, body) #endif -#define LAMBDA_UNPAREN(args...) (void *_lambda_ignored, ##args) + +// based on http://lefteris.realintelligence.net/?p=593 +#define LAMBDA_YUP() LAMBDA_NOPE +#define LAMBDA_CHECK_LAMBDA_YUP_() , +#define LAMBDA_CHECK_LAMBDA_NOPE_() +#define LAMBDA_CHECK_LAMBDA_YUP LAMBDA_CHECK_LAMBDA_YUP_, +#define LAMBDA_CHECK_LAMBDA_NOPE LAMBDA_CHECK_LAMBDA_NOPE_, +#define LAMBDA_APPLY_FIRST_ARG(a, ...) a() +#define LAMBDA_COMMA_IF_NONEMPTY___(a...) LAMBDA_APPLY_FIRST_ARG(a) +#define LAMBDA_COMMA_IF_NONEMPTY__(a) LAMBDA_COMMA_IF_NONEMPTY___(LAMBDA_CHECK_##a) +#define LAMBDA_COMMA_IF_NONEMPTY_(a) LAMBDA_COMMA_IF_NONEMPTY__(a) +#define LAMBDA_COMMA_IF_NONEMPTY(a, ...) LAMBDA_COMMA_IF_NONEMPTY_(LAMBDA_YUP a ()) +#define LAMBDA_UNPAREN(args...) (void *_lambda_ignored LAMBDA_COMMA_IF_NONEMPTY(args) args) #define DECL_LAMBDA(name, ret, args, body) \ - struct { \ + struct __lambda_##name { \ ret (*func) LAMBDA_UNPAREN args; \ void *arg; \ - } name = LAMBDA_BODY(typeof(name), ret, args, body); + } name = LAMBDA_BODY(struct __lambda_##name, ret, args, body);