template<int exp, typename T>
inline T UnrolledPower(const T& base) {
if( 0 == exp )
return T(1);
else if( 1 == exp )
return base;
else {
T ret = UnrolledPowerInternal<exp>(base);
return (exp % 2) ? ret * base : ret;
}
}
template<int exp, typename T>
inline T UnrolledPowerInternal(const T& x) {
if( 1 == exp/2 )
return x * x;
else if( (exp/2) % 2 )
return UnrolledPowerInternal<exp/2>(x * x) * x;
else
return UnrolledPowerInternal<exp/2>(x * x);
}