John Moeller | 22 May 21:39
Picon

Re: [math] pow redux and observations

Bruno Lalande <bruno.lalande <at> gmail.com> writes:

> Yep it's a possibility. It's close to my last attempt, using the MPL:
> 
> template <int N>
> struct even_positive_power
> {
>     template <typename T>
>     static typename tools::promote_args<T>::type result(T base)
>     {
>         return positive_power<2>::result(
>                   positive_power<N/2>::result(base));
>     }
> };
> 
> template <int N>
> struct odd_positive_power
> {
>     template <typename T>
>     static typename tools::promote_args<T>::type result(T base)
>     {
>         return base*positive_power<2>::result(
>                   positive_power<N/2>::result(base));
>     }
> };
> 
> template <int N>
> struct positive_power
> {
>     template <typename T>
>     static typename tools::promote_args<T>::type result(T base)
>     {
>         return
>         mpl::if_<
>             mpl::greater_equal<mpl::int_<N%2>, mpl::int_<1> >,
>             odd_positive_power<N>,
>             even_positive_power<N>
>         >::type::result(base);
>     }
> };

Bruno,

I think that you'll need a specialization for positive_power<1> *and* 
positive_power<2> with this.  In fact, both of these otherwise generate a 4-
deep infinitely-recursive function call at runtime.  Starting at 
positive_power<2>: 

positive_power<2>::result 
  even_positive_power<2>::result
    positive_power<1>::result
      odd_positive_power<1>::result
        positive_power<2>::result

Starting at positive_power<1> yields the same result.  Specializing only 
positive_power<1> will still cause an infinite recursion in positive_power<2>:

positive_power<2>::result 
  even_positive_power<2>::result
    positive_power<1>::result
    positive_power<2>::result

Note that these won't be infinite *template* generations, but infinite 
*runtime* calls.

One more thing.  The argument is passed by value, which is ok for builtins.  
Will all those potentially excess temporaries be an issue for larger UDTs?  
Perhaps the argument type of result() should be wrapped so that it's a const 
reference if it's larger than a pointer.

John M.

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost


Gmane