#include #include #include #include #include "pp.h" namespace boost{ namespace mpl { #if defined( TEST1 ) // Use generic implementation #elif defined( TEST2 ) #define BOOST_MPL_PP_SIZE_OPT_DEPTH 8 #define BOOST_MPL_PP_SIZE_OPT_STEP 8 #define BOOST_MPL_PP_SIZE_OPT1( i, op ) \ template< BOOST_MPL_PP_PARAMS( 0, i, typename H ) > \ struct size< BOOST_MPL_PP_NUMBER_RECURSE( list_node<, H, 0, i, null_node, > ) > \ { \ typedef integral_c< unsigned long, i > type; \ }; \ /**/ BOOST_PP_REPEAT_2ND( BOOST_MPL_PP_SIZE_OPT_DEPTH, BOOST_MPL_PP_SIZE_OPT1, (unused) ) template< BOOST_MPL_PP_PARAMS( 0, BOOST_MPL_PP_SIZE_OPT_STEP, typename H ), class Tail > struct size< BOOST_MPL_PP_NUMBER_RECURSE( list_node<, H, 0, BOOST_MPL_PP_SIZE_OPT_STEP, Tail, > ) > { typedef typename size< Tail >::type tail_size; typedef integral_c< unsigned long, tail_size::value + BOOST_MPL_PP_SIZE_OPT_STEP > type; }; #endif } } class a; #define TEST_LIST_ITEM1( i, op ) \ list_node< a, \ list_node< a, \ list_node< a, \ list_node< a, \ list_node< a, \ list_node< a, \ list_node< a, \ list_node< a, \ list_node< a, \ list_node< a, \ /**/ #define TEST_LIST_ITEM2( i, op ) \ > \ > \ > \ > \ > \ > \ > \ > \ > \ > \ /**/ int main() { using boost::mpl::list_node; using boost::mpl::null_node; using boost::mpl::size; typedef size< BOOST_PP_REPEAT( TEST_N, TEST_LIST_ITEM1, unused ) null_node BOOST_PP_REPEAT( TEST_N, TEST_LIST_ITEM2, unused ) >::type result; std::cout << result::value << std::endl; return 0; }