+#define generator_parm_(t_, n_) t_ n_
+#define generator_parms_(...) \
+ CPPMAGIC_2MAP(generator_parm_, __VA_ARGS__)
+#define generator_parms_inner_(...) \
+ CPPMAGIC_IFELSE(CPPMAGIC_NONEMPTY(__VA_ARGS__)) \
+ (, generator_parms_(__VA_ARGS__))()
+#define generator_parms_outer_(...) \
+ CPPMAGIC_IFELSE(CPPMAGIC_NONEMPTY(__VA_ARGS__)) \
+ (generator_parms_(__VA_ARGS__))(void)
+#define generator_argfield_(t_, n_) t_ n_;
+#define generator_argstruct_(...) \
+ struct { \
+ CPPMAGIC_JOIN(, CPPMAGIC_2MAP(generator_argfield_, \
+ __VA_ARGS__)) \
+ }
+#define generator_arg_unpack_(t_, n_) args->n_
+#define generator_args_unpack_(...) \
+ CPPMAGIC_IFELSE(CPPMAGIC_NONEMPTY(__VA_ARGS__)) \
+ (, CPPMAGIC_2MAP(generator_arg_unpack_, __VA_ARGS__))()
+#define generator_arg_pack_(t_, n_) args->n_ = n_
+#define generator_args_pack_(...) \
+ CPPMAGIC_JOIN(;, CPPMAGIC_2MAP(generator_arg_pack_, __VA_ARGS__))
+#define generator_def_(name_, rtype_, storage_, ...) \
+ static void name_##_generator_(rtype_ *ret_ \
+ generator_parms_inner_(__VA_ARGS__)); \