From 5991ff6b40b0d1b6cf26db54f549041badb7d3f1 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@dune-project.org> Date: Tue, 9 Oct 2012 16:25:55 +0000 Subject: [PATCH] Add power implementation with run-time mantissa and compile-time exponent. Taken from hcube.cc in dune-grid. We may want to unify the naming eventually. [[Imported from SVN: r7033]] --- dune/common/power.hh | 55 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/dune/common/power.hh b/dune/common/power.hh index 8ce88b82a..1e2e68fe4 100644 --- a/dune/common/power.hh +++ b/dune/common/power.hh @@ -30,6 +30,61 @@ namespace Dune { enum { power = 1 }; }; + + #ifndef DOXYGEN + template <int p, bool odd = p%2> + struct PowerImp {}; +#endif + + /** \brief Compute power for a run-time mantissa and a compile-time integer exponent + * + * Does some magic to create efficient code. Not benchmarked AFAIK. + * + * \tparam p The exponent + */ + template <int p> + struct Power + { + template <typename T> + static T eval(const T & a) + { + return PowerImp<p>::eval(a); + } + }; + +#ifndef DOXYGEN + template <int p> + struct PowerImp<p,false> + { + template <typename T> + static T eval(const T & a) + { + T t = Power<p/2>::eval(a); + return t*t; + } + }; + + template <int p> + struct PowerImp<p,true> + { + template <typename T> + static T eval(const T & a) + { + return a*Power<p-1>::eval(a);; + } + }; + + template <> + struct PowerImp<1,true> + { + template <typename T> + static T eval(const T & a) + { + return a; + } + }; +#endif + } #endif -- GitLab