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