Boost logo

Boost Users :

Subject: Re: [Boost-users] A MPL loop..
From: Frank Winter (frank.winter_at_[hidden])
Date: 2010-07-11 11:59:11


Thanks for your reply!

I tried to add your suggestions. Now the compilation doesn't seem to
be able to pass struct loop. Error message:

meta.cc:31: error: type/value mismatch at argument 2 in template parameter
list for 'template<class C, class F1, class F2> struct
boost::mpl::eval_if'
meta.cc:31: error: expected a type, got 'loop::value'

I marked line 31 with an asterix.

Any further ideas?

Frank

template< typename totalsize , typename maxelement , typename poolsize >
struct loop
{
   typedef typename mpl::times< totalsize , maxelement >::type part0;
   typedef typename mpl::times< part0 , mpl::int_< 3 > >::type part1;
   typedef typename mpl::greater< part1 , poolsize >::type gr;
   typedef typename mpl::divides< maxelement , mpl::int_< 2 > >::type
maxelement2;
* typedef typename mpl::eval_if< gr , loop< totalsize , maxelement2 ,
poolsize >::value , maxelement >::type value;
};

void sub3( )
{
   loop< mpl::int_< 144 > , mpl::int_< 1024 > , mpl::int_< 140000 > >
::value maxee;

   //BOOST_STATIC_ASSERT(( maxee::type::value == 256 ));
}

On Sun, 11 Jul 2010, Steven Watanabe wrote:

> AMDG
>
> 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;
>> };
>
> Try using eval_if so you don't recurse forever.
> I would also suggest extracting the ::type from
> mpl::divides, so that the type doesn't grow indefinitely.
> You also need to get the ::type out of mpl::if_.
>
>> template< class totalsize , class poolsize >
>> struct loop< totalsize , mpl::int_< 1 > , poolsize >
>> {
>> typedef mpl::int_< 1 > value;
>> };
>
> This specialization won't work, since mpl::divides<...> is not the
> same type as mpl::int_<1>.
>
> In Christ,
> Steven Watanabe
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>


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