standards compliance
This commit is contained in:
parent
4b09859476
commit
ed360a9a0d
18
lambda.h
18
lambda.h
@ -35,9 +35,21 @@ struct _blk {
|
|||||||
#define LAMBDA_BODY(typ, ret, args, body) \
|
#define LAMBDA_BODY(typ, ret, args, body) \
|
||||||
LAMBDA_BODY_(typ, ret, LAMBDA_UNPAREN args, body)
|
LAMBDA_BODY_(typ, ret, LAMBDA_UNPAREN args, body)
|
||||||
#endif
|
#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) \
|
#define DECL_LAMBDA(name, ret, args, body) \
|
||||||
struct { \
|
struct __lambda_##name { \
|
||||||
ret (*func) LAMBDA_UNPAREN args; \
|
ret (*func) LAMBDA_UNPAREN args; \
|
||||||
void *arg; \
|
void *arg; \
|
||||||
} name = LAMBDA_BODY(typeof(name), ret, args, body);
|
} name = LAMBDA_BODY(struct __lambda_##name, ret, args, body);
|
||||||
|
Loading…
Reference in New Issue
Block a user