You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
112 lines
2.9 KiB
112 lines
2.9 KiB
// Boost.Units - A C++ library for zero-overhead dimensional analysis and |
|
// unit/quantity manipulation and conversion |
|
// |
|
// Copyright (C) 2003-2008 Matthias Christian Schabel |
|
// Copyright (C) 2008 Steven Watanabe |
|
// |
|
// Distributed under the Boost Software License, Version 1.0. (See |
|
// accompanying file LICENSE_1_0.txt or copy at |
|
// http://www.boost.org/LICENSE_1_0.txt) |
|
|
|
#ifndef BOOST_UNITS_POW_HPP |
|
#define BOOST_UNITS_POW_HPP |
|
|
|
#include <boost/math_fwd.hpp> |
|
#include <boost/type_traits/is_integral.hpp> |
|
|
|
#include <boost/units/operators.hpp> |
|
#include <boost/units/static_rational.hpp> |
|
#include <boost/units/detail/static_rational_power.hpp> |
|
|
|
/// \file |
|
/// \brief Raise values to exponents known at compile-time. |
|
|
|
namespace boost { |
|
|
|
namespace units { |
|
|
|
/// raise a value to a @c static_rational power. |
|
template<class Rat,class Y> |
|
inline typename power_typeof_helper<Y,Rat>::type |
|
pow(const Y& x) |
|
{ |
|
return power_typeof_helper<Y,Rat>::value(x); |
|
} |
|
|
|
/// raise a value to an integer power. |
|
template<long N,class Y> |
|
inline typename power_typeof_helper<Y,static_rational<N> >::type |
|
pow(const Y& x) |
|
{ |
|
return power_typeof_helper<Y,static_rational<N> >::value(x); |
|
} |
|
|
|
#ifndef BOOST_UNITS_DOXYGEN |
|
|
|
/// raise @c T to a @c static_rational power. |
|
template<class T, long N,long D> |
|
struct power_typeof_helper<T, static_rational<N,D> > |
|
{ |
|
typedef typename mpl::if_<boost::is_integral<T>, double, T>::type internal_type; |
|
typedef detail::static_rational_power_impl<static_rational<N, D>, internal_type> impl; |
|
typedef typename impl::type type; |
|
|
|
static type value(const T& x) |
|
{ |
|
return impl::call(x); |
|
} |
|
}; |
|
|
|
/// raise @c float to a @c static_rational power. |
|
template<long N,long D> |
|
struct power_typeof_helper<float, static_rational<N,D> > |
|
{ |
|
// N.B. pathscale doesn't accept inheritance for some reason. |
|
typedef power_typeof_helper<double, static_rational<N,D> > base; |
|
typedef typename base::type type; |
|
static type value(const double& x) |
|
{ |
|
return base::value(x); |
|
} |
|
}; |
|
|
|
#endif |
|
|
|
/// take the @c static_rational root of a value. |
|
template<class Rat,class Y> |
|
typename root_typeof_helper<Y,Rat>::type |
|
root(const Y& x) |
|
{ |
|
return root_typeof_helper<Y,Rat>::value(x); |
|
} |
|
|
|
/// take the integer root of a value. |
|
template<long N,class Y> |
|
typename root_typeof_helper<Y,static_rational<N> >::type |
|
root(const Y& x) |
|
{ |
|
return root_typeof_helper<Y,static_rational<N> >::value(x); |
|
} |
|
|
|
#ifndef BOOST_UNITS_DOXYGEN |
|
|
|
/// take @c static_rational root of an @c T |
|
template<class T, long N,long D> |
|
struct root_typeof_helper<T,static_rational<N,D> > |
|
{ |
|
// N.B. pathscale doesn't accept inheritance for some reason. |
|
typedef power_typeof_helper<T, static_rational<D,N> > base; |
|
typedef typename base::type type; |
|
static type value(const T& x) |
|
{ |
|
return(base::value(x)); |
|
} |
|
}; |
|
|
|
#endif |
|
|
|
} // namespace units |
|
|
|
} // namespace boost |
|
|
|
#endif // BOOST_UNITS_STATIC_RATIONAL_HPP
|
|
|