
On 07/11/10 02:18, Frank Winter wrote:
I am trying to translate this runtime loop
while( totalsize * maxelem * 3 > poolsize ) maxelem >>= 1;
into MPL. I got so far:
template< typename totalsize , typename maxelement , typename poolsize > struct loop { typedef mpl::times< totalsize , maxelement > part0; typedef mpl::times< part0 , mpl::int_< 3 > > part1; typedef mpl::greater< part1 , poolsize > gr; typedef mpl::if_< gr , typename loop< totalsize , mpl::divides< maxelement , mpl::int_< 2 > > , poolsize >::value , maxelement > value; };
template< class totalsize , class poolsize > struct loop< totalsize , mpl::int_< 1 > , poolsize > { typedef mpl::int_< 1 > value; };
typename loop< mpl::int_< 144 > , mpl::int_< 1024 > , mpl::int_< 140000 >
::value max;
g++43 (GCC) 4.3.2 says: error: template instantiation depth exceeds maximum of 500
If coded it correctly that should not happen. Since maxelement is already after the 1st interation mpl::int_< 512 > and therefor the product with mpl::int_< 144 > smaller than mpl::int_< 140000 >
I could imagine: - that I need a constructor that converts the divided types, correct? - that I need to use a vector< sequence > like in the physics dimension example, correct?
Can somebody fix this or point me to a working loop example?
Regards, Frank You might try using:
http://svn.boost.org/svn/boost/sandbox/variadic_templates/boost/mpl/while.hp... or maybe the while_recur template used here: https://svn.boost.org/trac/boost/attachment/ticket/3044/while_recur.cpp