From a61c2fe50bbddf04164d713003ae9b1ce006b427 Mon Sep 17 00:00:00 2001 From: Johannes Kalmbach Date: Fri, 14 Feb 2025 08:58:45 +0100 Subject: [PATCH] Fix the lambdas Signed-off-by: Johannes Kalmbach --- src/backports/concepts.h | 66 +++++++----------------------------- src/backports/cppTemplate2.h | 19 ++++++++++- 2 files changed, 30 insertions(+), 55 deletions(-) diff --git a/src/backports/concepts.h b/src/backports/concepts.h index 98aee3c9e3..5873f7d0ea 100644 --- a/src/backports/concepts.h +++ b/src/backports/concepts.h @@ -19,11 +19,15 @@ // resolution. // // `QL_CONCEPT_OR_TYPENAME(arg)`: expands to `arg` in C++20 mode, and to -// `typename` in C++17 mode. +// `typename` in C++17 mode. Example usage: // // `CPP_lambda(capture)(arg)(requires ...)`: Expands lambda to use // `requires` in C++20 mode and `std::enable_if_t` in C++17 mode. // +// `CPP_template_lambda(capture)(typenames...)(arg)(requires ...)`: Expands +// lambda with (C++20) explicit gemplate parameters to use +// `requires` in C++20 mode and `std::enable_if_t` in C++17 mode. +// // Example usages: // // `QL_CONCEPT_OR_NOTHING(std::view) auto x = someFunction();` @@ -37,6 +41,9 @@ // `auto myLambda = CPP_lambda(someCapture)(someArg)(requires // ranges::same_as) {...}` // +// `auto myLambda2 = CPP_lambda(someCapture)(typename F)(F arg)(requires +// ranges::same_as) {...}` +// // NOTE: The macros are variadic to allow for commas in the argument, like in // the second example above. @@ -54,45 +61,9 @@ #define CPP_and_2_def CPP_and_2_def_sfinae #define CPP_variadic_template CPP_template_NO_DEFAULT_SFINAE #define CPP_member_def CPP_member_def_sfinae - #define CPP_lambda CPP_lambda_sfinae - +#define CPP_template_lambda CPP_template_lambda_sfinae #define CPP_lambda_mut CPP_lambda_mut_sfinae - -#define CPP_lambda_sfinae(...) \ - CPP_PP_IGNORE_CXX2A_COMPAT_BEGIN \ - [__VA_ARGS__] CPP_LAMBDA_SFINAE_ARGS - -#define CPP_lambda_mut_sfinae(...) \ - CPP_PP_IGNORE_CXX2A_COMPAT_BEGIN \ - [__VA_ARGS__] CPP_LAMBDA_MUT_SFINAE_ARGS - -#define CPP_LAMBDA_SFINAE_ARGS(...) \ - (__VA_ARGS__ CPP_LAMBDA_SFINAE_AUX_ - -#define CPP_LAMBDA_MUT_SFINAE_ARGS(...) \ - (__VA_ARGS__ CPP_LAMBDA_MUT_SFINAE_AUX_ - -#define CPP_LAMBDA_SFINAE_AUX_WHICH_(FIRST, ...) \ - CPP_PP_EVAL(CPP_PP_CHECK, FIRST) - -#define CPP_LAMBDA_SFINAE_AUX_(...) \ - CPP_PP_CAT(CPP_LAMBDA_SFINAE_AUX_, \ - CPP_LAMBDA_SFINAE_AUX_WHICH_(__VA_ARGS__, )) \ - (__VA_ARGS__) - -#define CPP_LAMBDA_MUT_SFINAE_AUX_(...) \ - CPP_PP_CAT(CPP_LAMBDA_SFINAE_AUX_, \ - CPP_LAMBDA_SFINAE_AUX_WHICH_(__VA_ARGS__, )) \ - (__VA_ARGS__) mutable - -#define CPP_LAMBDA_SFINAE_AUX_0(...) , \ - std::enable_if_t< \ - CPP_PP_CAT(CPP_LAMBDA_SFINAE_AUX_3_, __VA_ARGS__) \ - >* = nullptr) - -#define CPP_LAMBDA_SFINAE_AUX_3_requires - #else #define QL_CONCEPT_OR_NOTHING(...) __VA_ARGS__ #define QL_CONCEPT_OR_TYPENAME(...) __VA_ARGS__ @@ -102,22 +73,9 @@ #define CPP_and_2_def CPP_and #define CPP_variadic_template CPP_template #define CPP_member_def CPP_member - -#define CPP_lambda(...) [__VA_ARGS__] CPP_LAMBDA_ARGS - -#define CPP_lambda_mut(...) [__VA_ARGS__] CPP_LAMBDA_ARGS_MUT - -#define CPP_LAMBDA_ARGS(...) (__VA_ARGS__) CPP_LAMBDA_AUX_ - -#define CPP_LAMBDA_ARGS_MUT(...) (__VA_ARGS__) mutable CPP_LAMBDA_AUX_ - -#define CPP_LAMBDA_AUX_(...) \ - CPP_PP_CAT(CPP_LAMBDA_AUX_, CPP_LAMBDA_AUX_WHICH_(__VA_ARGS__, ))(__VA_ARGS__) - -#define CPP_LAMBDA_AUX_WHICH_(FIRST, ...) CPP_PP_EVAL(CPP_PP_CHECK, FIRST) - -#define CPP_LAMBDA_AUX_0(...) __VA_ARGS__ - +#define CPP_lambda CPP_LAMBDA_20 +#define CPP_template_lambda CPP_TEMPLATE_LAMBDA_20 +#define CPP_lambda_mut CPP_lambda_mut_20 #endif // The namespace `ql::concepts` includes concepts that are contained in the diff --git a/src/backports/cppTemplate2.h b/src/backports/cppTemplate2.h index 171dc5dca4..e250034f19 100644 --- a/src/backports/cppTemplate2.h +++ b/src/backports/cppTemplate2.h @@ -68,7 +68,9 @@ (__VA_ARGS__ CPP_LAMBDA_SFINAE_AUX_ #define CPP_LAMBDA_SFINAE_AUX_WHICH_(FIRST, ...) \ - CPP_PP_EVAL(CPP_PP_CHECK, CPP_PP_CAT(CPP_LAMBDA_SFINAE_PROBE_CONCEPT_, FIRST)) + CPP_PP_EVAL(CPP_PP_CHECK, FIRST) +// CPP_PP_EVAL(CPP_PP_CHECK, CPP_PP_CAT(CPP_LAMBDA_SFINAE_PROBE_CONCEPT_, +// FIRST)) #define CPP_LAMBDA_SFINAE_AUX_(...) \ CPP_PP_CAT(CPP_LAMBDA_SFINAE_AUX_, \ @@ -102,3 +104,18 @@ CPP_PP_CAT(CPP_LAMBDA_SFINAE_AUX_3_, __VA_ARGS__) \ #define CPP_LAMBDA_AUX_0(...) __VA_ARGS__ #define CPP_TEMPLATE_LAMBDA_ARGS(...) <__VA_ARGS__> CPP_LAMBDA_ARGS + +#define CPP_lambda_mut_sfinae(...) \ + CPP_PP_IGNORE_CXX2A_COMPAT_BEGIN \ + [__VA_ARGS__] CPP_LAMBDA_MUT_SFINAE_ARGS + +#define CPP_LAMBDA_MUT_SFINAE_ARGS(...) \ +(__VA_ARGS__ CPP_LAMBDA_MUT_SFINAE_AUX_ + +#define CPP_LAMBDA_MUT_SFINAE_AUX_(...) \ + CPP_PP_CAT(CPP_LAMBDA_SFINAE_AUX_, \ + CPP_LAMBDA_SFINAE_AUX_WHICH_(__VA_ARGS__, )) \ + (__VA_ARGS__) mutable + +#define CPP_LAMBDA_ARGS_MUT(...) (__VA_ARGS__) mutable CPP_LAMBDA_AUX_ +#define CPP_lambda_mut_20(...) [__VA_ARGS__] CPP_LAMBDA_ARGS_MUT