| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 
 |  
//---------------------------------------------------------------------------
 
#define REP_LIST_ARRAY_ELEMS(z, n, array)	\
	BOOST_PP_ARRAY_ELEM(n, array)			\
	BOOST_PP_COMMA_IF(						\
		BOOST_PP_GREATER(					\
			BOOST_PP_DEC(					\
				BOOST_PP_ARRAY_SIZE(array)	\
			),								\
			n								\
		)									\
	)										\
 
 
#define LIST_ARRAY_ELEMS(array)				\
	BOOST_PP_REPEAT(						\
		BOOST_PP_ARRAY_SIZE(array),			\
		REP_LIST_ARRAY_ELEMS,				\
		array								\
	)										\
 
 
 
#define ADD_ARRAY_SIZES(arrayA, arrayB)		\
	BOOST_PP_ADD(							\
		BOOST_PP_ARRAY_SIZE(arrayA),		\
		BOOST_PP_ARRAY_SIZE(arrayB)			\
	)										\
 
 
#define MERGE_ARRAYS_APPEND(arrayA, arrayB)				\
	(ADD_ARRAY_SIZES(arrayA, arrayB),					\
		(LIST_ARRAY_ELEMS(arrayA)						\
		BOOST_PP_COMMA_IF(BOOST_PP_ARRAY_SIZE(arrayB))	\
		LIST_ARRAY_ELEMS(arrayB))						\
	)													\
 
 
//---------------------------------------------------------------------------
//Testing macros
 
#define REP_ARRAY_OF_SUBARRAYS(z, n, array)	\
	BOOST_PP_COMMA_IF(n)					\
	(1, BOOST_PP_ARRAY_ELEM(n, array))		\
 
 
#define GEN_ARRAY_OF_SUBARRAYS(array)		\
	(BOOST_PP_ARRAY_SIZE(array),			\
	(BOOST_PP_REPEAT(						\
		BOOST_PP_ARRAY_SIZE(array),			\
		REP_ARRAY_OF_SUBARRAYS,				\
		array								\
	) ) )									\
 
//-----------------------------
 
#define SUB_REP_COMBINE_2_ARRAYS(arrayA, arrayB)	\
	MERGE_ARRAYS_APPEND(arrayA,	arrayB)				\
 
 
#define SUB_REP_COMBINE_ARRAY_OF_SUB_B(n, arrayA, arrayofsubB)	\
	( SUB_REP_COMBINE_2_ARRAYS(arrayA,							\
			BOOST_PP_ARRAY_ELEM(n, arrayofsubB)					\
	) )															\
 
 
#define REP_COMBINE_ARRAY_OF_SUB_B(z, n, param)	\
	SUB_REP_COMBINE_ARRAY_OF_SUB_B(n,			\
		BOOST_PP_TUPLE_ELEM(2, 0, param),		\
		BOOST_PP_TUPLE_ELEM(2, 1, param)		\
	)											\
 
 
#define SUB_REP_COMBINE_ARRAYS_OF_SUB_A(n, arrayofsubA, arrayofsubB)	\
	BOOST_PP_REPEAT(													\
		BOOST_PP_ARRAY_SIZE(arrayofsubB),								\
		REP_COMBINE_ARRAY_OF_SUB_B,										\
		(BOOST_PP_ARRAY_ELEM(n, arrayofsubA), arrayofsubB)				\
	)																	\
 
 
#define REP_COMBINE_ARRAYS_OF_SUB_A(z, n, param)	\
	SUB_REP_COMBINE_ARRAYS_OF_SUB_A(n,				\
		BOOST_PP_TUPLE_ELEM(2, 0, param),			\
		BOOST_PP_TUPLE_ELEM(2, 1, param)			\
	)												\
 
 
#define CROSS_COMBINE_ARRAYS_OF_SUB(arrayofsubA, arrayofsubB)	\
	BOOST_PP_EXPAND(BOOST_PP_SEQ_TO_ARRAY(						\
		BOOST_PP_REPEAT(										\
			BOOST_PP_ARRAY_SIZE(arrayofsubA),					\
			REP_COMBINE_ARRAYS_OF_SUB_A,						\
			(arrayofsubA, arrayofsubB)							\
		)														\
	))															\
 
//-----------------------------
 
#define	SELF_CROSS_COMBINE_ARRAYS_OF_SUB_2(array)	\
	CROSS_COMBINE_ARRAYS_OF_SUB(array, array)		\
 
 
#define SELF_CROSS_COMBINE_ARRAYS_OF_SUB_3(array)				\
	CROSS_COMBINE_ARRAYS_OF_SUB(								\
	BOOST_PP_EXPAND(SELF_CROSS_COMBINE_ARRAYS_OF_SUB_2(array)),	\
	array														\
	)															\
 
 
#define SELF_CROSS_COMBINE_ARRAYS_OF_SUB_4(array)				\
	CROSS_COMBINE_ARRAYS_OF_SUB(								\
	BOOST_PP_EXPAND(SELF_CROSS_COMBINE_ARRAYS_OF_SUB_2(array)),	\
	BOOST_PP_EXPAND(SELF_CROSS_COMBINE_ARRAYS_OF_SUB_2(array))	\
	)															\
 
 
#define SELF_CROSS_COMBINE_ARRAYS_OF_SUB(times, array)				\
	BOOST_PP_CAT(SELF_CROSS_COMBINE_ARRAYS_OF_SUB_, times)(array)	\ | 
Partager