Boost logo

Boost Users :

Subject: Re: [Boost-users] A MPL loop..
From: Larry Evans (cppljevans_at_[hidden])
Date: 2010-07-11 11:39:31


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.hpp

or maybe the while_recur template used here:

https://svn.boost.org/trac/boost/attachment/ticket/3044/while_recur.cpp


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net