diff --git a/include/boost/preprocessor/list/for_each_product.hpp b/include/boost/preprocessor/list/for_each_product.hpp index 6d5319b..9a09972 100644 --- a/include/boost/preprocessor/list/for_each_product.hpp +++ b/include/boost/preprocessor/list/for_each_product.hpp @@ -16,6 +16,7 @@ # # include # include +# include # include # include # include @@ -23,23 +24,65 @@ # include # include # include +# if BOOST_PP_VARIADICS_MSVC +# include +# include +# endif # # /* BOOST_PP_LIST_FOR_EACH_PRODUCT */ # +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_OV_2(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple)) +# +# if BOOST_PP_VARIADICS +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_OV_1(macro, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR, macro, BOOST_PP_TUPLE_SIZE(tuple), BOOST_PP_TUPLE_TO_LIST(tuple)) +# endif +# # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() -# define BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple)) +# if BOOST_PP_VARIADICS +# if BOOST_PP_VARIADICS_MSVC +# define BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, ...) BOOST_PP_CAT(BOOST_PP_OVERLOAD(BOOST_PP_LIST_FOR_EACH_PRODUCT_OV_,__VA_ARGS__)(macro,__VA_ARGS__),BOOST_PP_EMPTY()) +# else +# define BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, ...) BOOST_PP_OVERLOAD(BOOST_PP_LIST_FOR_EACH_PRODUCT_OV_,__VA_ARGS__)(macro,__VA_ARGS__) +# endif +# else +# define BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_OV_2(macro, size, tuple) +# endif # else -# define BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_Q(macro, size, tuple) -# define BOOST_PP_LIST_FOR_EACH_PRODUCT_Q(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple)) +# if BOOST_PP_VARIADICS +# define BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, ...) BOOST_PP_LIST_FOR_EACH_PRODUCT_Q(macro, __VA_ARGS__) +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_Q(macro, ...) BOOST_PP_OVERLOAD(BOOST_PP_LIST_FOR_EACH_PRODUCT_OV_,__VA_ARGS__)(macro,__VA_ARGS__) +# else +# define BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_Q(macro, size, tuple) +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_Q(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_OV_2(macro, size, tuple) +# endif # endif # # /* BOOST_PP_LIST_FOR_EACH_PRODUCT_R */ # +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R_OV_2(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR ## r, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple)) +# +# if BOOST_PP_VARIADICS +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R_OV_1(r, macro, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR ## r, macro, BOOST_PP_TUPLE_SIZE(tuple), BOOST_PP_TUPLE_TO_LIST(tuple)) +# endif +# # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() -# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR_ ## r, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple)) +# if BOOST_PP_VARIADICS +# if BOOST_PP_VARIADICS_MSVC +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, ...) BOOST_PP_CAT(BOOST_PP_OVERLOAD(BOOST_PP_LIST_FOR_EACH_PRODUCT_R_OV_,__VA_ARGS__)(r, macro,__VA_ARGS__),BOOST_PP_EMPTY()) +# else +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, ...) BOOST_PP_OVERLOAD(BOOST_PP_LIST_FOR_EACH_PRODUCT_R_OV_,__VA_ARGS__)(r, macro,__VA_ARGS__) +# endif +# else +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_R_OV_2(r, macro, size, tuple) +# endif # else -# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_R_Q(r, macro, size, tuple) -# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R_Q(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR_ ## r, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple)) +# if BOOST_PP_VARIADICS +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, ...) BOOST_PP_LIST_FOR_EACH_PRODUCT_R_Q(r, macro, __VA_ARGS__) +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R_Q(r, macro, ...) BOOST_PP_OVERLOAD(BOOST_PP_LIST_FOR_EACH_PRODUCT_R_OV_,__VA_ARGS__)(macro,__VA_ARGS__) +# else +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_R_Q(r, macro, size, tuple) +# define BOOST_PP_LIST_FOR_EACH_PRODUCT_R_Q(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_R_OV_2(r, macro, size, tuple) +# endif # endif # # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() diff --git a/test/list.cxx b/test/list.cxx index 0c197dc..3278611 100644 --- a/test/list.cxx +++ b/test/list.cxx @@ -244,6 +244,12 @@ BEGIN BOOST_PP_LIST_SIZE(BOOST_PP_LIST_FILTER(BOOST_PP_EQUAL_D, 372, LIST_512)) BEGIN BOOST_PP_LIST_FOR_EACH_PRODUCT(F2, 2, ( (1, (0, BOOST_PP_NIL)), (2, (3, BOOST_PP_NIL)) )) == 0 END +# if BOOST_PP_VARIADICS + +BEGIN BOOST_PP_LIST_FOR_EACH_PRODUCT(F2, ( (1, (0, BOOST_PP_NIL)), (2, (3, BOOST_PP_NIL)) )) == 0 END + +#endif + BEGIN BOOST_PP_LIST_CAT(BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_APPEND_D, BOOST_PP_NIL, LL)) == 0x0a1b2c3d END BEGIN BOOST_PP_ARRAY_ELEM(2, BOOST_PP_LIST_TO_ARRAY(LIST)) == 5 END